aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr107407.c26
-rw-r--r--gcc/tree-ssa-dse.cc17
2 files changed, 35 insertions, 8 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr107407.c b/gcc/testsuite/gcc.dg/torture/pr107407.c
new file mode 100644
index 0000000..228fce1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr107407.c
@@ -0,0 +1,26 @@
+/* { dg-do run } */
+
+int *a;
+int c[4];
+int d;
+
+static int
+f(char k, int j)
+{
+ for (; k <= 3; k++)
+ {
+ a = &c[k];
+ for (; d <= 1; d++)
+ *a = 3;
+ }
+ *a = 0;
+}
+
+int main()
+{
+ int i;
+ f(0, 0);
+ if (c[0] != 3)
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc/tree-ssa-dse.cc b/gcc/tree-ssa-dse.cc
index c14e5e4..82976bd 100644
--- a/gcc/tree-ssa-dse.cc
+++ b/gcc/tree-ssa-dse.cc
@@ -978,14 +978,6 @@ dse_classify_store (ao_ref *ref, gimple *stmt,
if (gimple_code (temp) == GIMPLE_PHI)
{
- /* If we visit this PHI by following a backedge then we have to
- make sure ref->ref only refers to SSA names that are invariant
- with respect to the loop represented by this PHI node. */
- if (dominated_by_p (CDI_DOMINATORS, gimple_bb (stmt),
- gimple_bb (temp))
- && !for_each_index (ref->ref ? &ref->ref : &ref->base,
- check_name, gimple_bb (temp)))
- return DSE_STORE_LIVE;
defvar = PHI_RESULT (temp);
bitmap_set_bit (visited, SSA_NAME_VERSION (defvar));
}
@@ -1019,6 +1011,15 @@ dse_classify_store (ao_ref *ref, gimple *stmt,
if (!bitmap_bit_p (visited,
SSA_NAME_VERSION (PHI_RESULT (use_stmt))))
{
+ /* If we visit this PHI by following a backedge then we have
+ to make sure ref->ref only refers to SSA names that are
+ invariant with respect to the loop represented by this
+ PHI node. */
+ if (dominated_by_p (CDI_DOMINATORS, gimple_bb (stmt),
+ gimple_bb (use_stmt))
+ && !for_each_index (ref->ref ? &ref->ref : &ref->base,
+ check_name, gimple_bb (use_stmt)))
+ return DSE_STORE_LIVE;
defs.safe_push (use_stmt);
if (!first_phi_def)
first_phi_def = as_a <gphi *> (use_stmt);