aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr97901.c15
-rw-r--r--gcc/tree-ssa-propagate.c22
2 files changed, 20 insertions, 17 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr97901.c b/gcc/testsuite/gcc.dg/torture/pr97901.c
new file mode 100644
index 0000000..a6a89ef
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr97901.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+
+int a[1], b, *c, *d;
+
+int main() {
+L:
+ d = c;
+ for (b = 0; b < 2; b++)
+ d = &a[0];
+ if (c)
+ goto L;
+ if (*d)
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c
index 354057b..bc656ff 100644
--- a/gcc/tree-ssa-propagate.c
+++ b/gcc/tree-ssa-propagate.c
@@ -1569,6 +1569,10 @@ clean_up_loop_closed_phi (function *fun)
if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
return 0;
+ /* replace_uses_by might purge dead EH edges and we want it to also
+ remove dominated blocks. */
+ calculate_dominance_info (CDI_DOMINATORS);
+
/* Walk over loop in function. */
FOR_EACH_LOOP_FN (fun, loop, 0)
{
@@ -1595,23 +1599,7 @@ clean_up_loop_closed_phi (function *fun)
fprintf (dump_file, "'\n");
}
- use_operand_p use_p;
- imm_use_iterator iter;
- gimple *use_stmt;
- FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs)
- {
- FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
- replace_exp (use_p, rhs);
- update_stmt (use_stmt);
-
- /* Update the invariant flag for ADDR_EXPR if replacing
- a variable index with a constant. */
- if (gimple_assign_single_p (use_stmt)
- && TREE_CODE (gimple_assign_rhs1 (use_stmt))
- == ADDR_EXPR)
- recompute_tree_invariant_for_addr_expr (
- gimple_assign_rhs1 (use_stmt));
- }
+ replace_uses_by (lhs, rhs);
remove_phi_node (&gsi, true);
}
else