diff options
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr107407.c | 26 | ||||
-rw-r--r-- | gcc/tree-ssa-dse.cc | 17 |
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); |