aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr67690.c32
-rw-r--r--gcc/tree-ssa-ifcombine.c11
-rw-r--r--gcc/tree-ssa-tail-merge.c4
-rw-r--r--gcc/tree-ssanames.c24
-rw-r--r--gcc/tree-ssanames.h1
7 files changed, 77 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d29e5d9..0b3ce92 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2015-09-30 Marek Polacek <polacek@redhat.com>
+
+ PR tree-optimization/67690
+ * tree-ssa-ifcombine.c (pass_tree_ifcombine::execute): Call
+ reset_flow_sensitive_info_in_bb.
+ * tree-ssa-tail-merge.c (replace_block_by): Likewise.
+ * tree-ssanames.c: Include "gimple-iterator.h".
+ (reset_flow_sensitive_info_in_bb): New function.
+ * tree-ssanames.h (reset_flow_sensitive_info_in_bb): Declare.
+
2015-09-30 Thomas Schwinge <thomas@codesourcery.com>
* config/i386/intelmic-mkoffload.c (target_ilp32): Remove
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index da03478..36a41d6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-09-30 Marek Polacek <polacek@redhat.com>
+
+ PR tree-optimization/67690
+ * gcc.dg/torture/pr67690.c: New test.
+
2015-09-30 Christophe Lyon <christophe.lyon@linaro.org>
* g++.dg/cpp0x/stdint.C: Move dg-require-effective-target after
diff --git a/gcc/testsuite/gcc.dg/torture/pr67690.c b/gcc/testsuite/gcc.dg/torture/pr67690.c
new file mode 100644
index 0000000..491de51
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr67690.c
@@ -0,0 +1,32 @@
+/* { dg-do run } */
+
+const int c1 = 1;
+const int c2 = 2;
+
+int
+check (int i)
+{
+ int j;
+ if (i >= 0)
+ j = c2 - i;
+ else
+ j = c2 - i;
+ return c2 - c1 + 1 > j;
+}
+
+int invoke (int *pi) __attribute__ ((noinline,noclone));
+int
+invoke (int *pi)
+{
+ return check (*pi);
+}
+
+int
+main ()
+{
+ int i = c1;
+ int ret = invoke (&i);
+ if (!ret)
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc/tree-ssa-ifcombine.c b/gcc/tree-ssa-ifcombine.c
index 9f04174..66be430 100644
--- a/gcc/tree-ssa-ifcombine.c
+++ b/gcc/tree-ssa-ifcombine.c
@@ -769,16 +769,7 @@ pass_tree_ifcombine::execute (function *fun)
{
/* Clear range info from all stmts in BB which is now executed
conditional on a always true/false condition. */
- for (gimple_stmt_iterator gsi = gsi_start_bb (bb);
- !gsi_end_p (gsi); gsi_next (&gsi))
- {
- gimple *stmt = gsi_stmt (gsi);
- ssa_op_iter i;
- tree op;
- FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_DEF)
- reset_flow_sensitive_info (op);
- }
-
+ reset_flow_sensitive_info_in_bb (bb);
cfg_changed |= true;
}
}
diff --git a/gcc/tree-ssa-tail-merge.c b/gcc/tree-ssa-tail-merge.c
index 0ce59e8..487961e 100644
--- a/gcc/tree-ssa-tail-merge.c
+++ b/gcc/tree-ssa-tail-merge.c
@@ -1534,6 +1534,10 @@ replace_block_by (basic_block bb1, basic_block bb2)
e2->probability = GCOV_COMPUTE_SCALE (e2->count, out_sum);
}
+ /* Clear range info from all stmts in BB2 -- this transformation
+ could make them out of date. */
+ reset_flow_sensitive_info_in_bb (bb2);
+
/* Do updates that use bb1, before deleting bb1. */
release_last_vdef (bb1);
same_succ_flush_bb (bb1);
diff --git a/gcc/tree-ssanames.c b/gcc/tree-ssanames.c
index 4199290..7235dc3 100644
--- a/gcc/tree-ssanames.c
+++ b/gcc/tree-ssanames.c
@@ -23,6 +23,7 @@ along with GCC; see the file COPYING3. If not see
#include "backend.h"
#include "tree.h"
#include "gimple.h"
+#include "gimple-iterator.h"
#include "hard-reg-set.h"
#include "ssa.h"
#include "alias.h"
@@ -544,6 +545,29 @@ reset_flow_sensitive_info (tree name)
SSA_NAME_RANGE_INFO (name) = NULL;
}
+/* Clear all flow sensitive data from all statements and PHI definitions
+ in BB. */
+
+void
+reset_flow_sensitive_info_in_bb (basic_block bb)
+{
+ for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
+ gsi_next (&gsi))
+ {
+ gimple *stmt = gsi_stmt (gsi);
+ ssa_op_iter i;
+ tree op;
+ FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_DEF)
+ reset_flow_sensitive_info (op);
+ }
+
+ for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
+ gsi_next (&gsi))
+ {
+ tree phi_def = gimple_phi_result (gsi.phi ());
+ reset_flow_sensitive_info (phi_def);
+ }
+}
/* Release all the SSA_NAMEs created by STMT. */
diff --git a/gcc/tree-ssanames.h b/gcc/tree-ssanames.h
index 22ff609..5688ca5 100644
--- a/gcc/tree-ssanames.h
+++ b/gcc/tree-ssanames.h
@@ -95,6 +95,7 @@ extern tree duplicate_ssa_name_fn (struct function *, tree, gimple *);
extern void duplicate_ssa_name_range_info (tree, enum value_range_type,
struct range_info_def *);
extern void reset_flow_sensitive_info (tree);
+extern void reset_flow_sensitive_info_in_bb (basic_block);
extern void release_defs (gimple *);
extern void replace_ssa_name_symbol (tree, tree);