summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2014-01-30 18:28:19 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2014-01-30 18:28:19 +0000
commit135b982ddc5c8174c57dc9e8f294c7bf476bc9d2 (patch)
treed57bbbc4b9b65da04a915f26455cd3254ace9c7e /gcc
parentf8ca591b66df0cd27537a4e2c0c8118097493030 (diff)
downloadgcc-135b982ddc5c8174c57dc9e8f294c7bf476bc9d2.tar.gz
2014-01-30 Richard Biener <rguenther@suse.de>
PR tree-optimization/59993 * tree-ssa-forwprop.c (associate_pointerplus): Check we can propagate form the earlier stmt and avoid the transform when the intermediate result is needed. * gcc.dg/torture/pr59993.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@207316 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr59993.c13
-rw-r--r--gcc/tree-ssa-forwprop.c6
4 files changed, 29 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 62ac6dfd3ff..0184dbd5553 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2014-01-30 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/59993
+ * tree-ssa-forwprop.c (associate_pointerplus): Check we
+ can propagate form the earlier stmt and avoid the transform
+ when the intermediate result is needed.
+
2014-01-30 Alangi Derick <alangiderick@gmail.com>
* README.Portability: Fix typo.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 18b2171fd5d..6c22615181a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-01-30 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/59993
+ * gcc.dg/torture/pr59993.c: New testcase.
+
2014-01-30 Richard Sandiford <rdsandiford@googlemail.com>
* g++.dg/vect/pr33426-ivdep.cc, g++.dg/vect/pr33426-ivdep-2.cc,
diff --git a/gcc/testsuite/gcc.dg/torture/pr59993.c b/gcc/testsuite/gcc.dg/torture/pr59993.c
new file mode 100644
index 00000000000..be55a10b9fd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr59993.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+
+#include <setjmp.h>
+
+extern int optind;
+jmp_buf jump_buf;
+int
+main (int argc, char **argv)
+{
+ foo (jump_buf, setjmp(jump_buf));
+ argv += optind;
+ bar(argv[1]);
+}
diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
index ebdd8f546f2..b2294290077 100644
--- a/gcc/tree-ssa-forwprop.c
+++ b/gcc/tree-ssa-forwprop.c
@@ -2926,11 +2926,13 @@ associate_pointerplus (gimple_stmt_iterator *gsi)
/* Associate (p +p off1) +p off2 as (p +p (off1 + off2)). */
ptr = gimple_assign_rhs1 (stmt);
off1 = gimple_assign_rhs2 (stmt);
- if (TREE_CODE (ptr) != SSA_NAME)
+ if (TREE_CODE (ptr) != SSA_NAME
+ || !has_single_use (ptr))
return false;
def_stmt = SSA_NAME_DEF_STMT (ptr);
if (!is_gimple_assign (def_stmt)
- || gimple_assign_rhs_code (def_stmt) != POINTER_PLUS_EXPR)
+ || gimple_assign_rhs_code (def_stmt) != POINTER_PLUS_EXPR
+ || !can_propagate_from (def_stmt))
return false;
ptr = gimple_assign_rhs1 (def_stmt);
off2 = gimple_assign_rhs2 (def_stmt);