mirror of git://gcc.gnu.org/git/gcc.git
sccp: Fix order of removal of phi (again) [PR122599]
This time we are gimplifying the expression and call fold_stmt during the gimplification (which is fine) but since we removed the phi and the expression references ssa names in the phi indirectly, things just fall over inside the ranger. This moves the removal of the phi until gimplification happens as it might refer back to the ssa name that the phi defines. Pushed as obvious after bootstrap test on x86_64-linux-gnu. PR tree-optimization/122599 gcc/ChangeLog: * tree-scalar-evolution.cc (final_value_replacement_loop): Move the removal of the phi until after the gimplification of the final value expression. gcc/testsuite/ChangeLog: * gcc.dg/torture/pr122599-1.c: New test. Signed-off-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
This commit is contained in:
parent
cbded1ce01
commit
77e10b47f2
|
|
@ -0,0 +1,8 @@
|
|||
/* { dg-do compile } */
|
||||
/* PR tree-optimization/122599 */
|
||||
|
||||
void f(int *x, unsigned n) {
|
||||
for (int i = 0; i < 5; i++)
|
||||
while ((int)--n >= 0)
|
||||
x[0] = 0;
|
||||
}
|
||||
|
|
@ -3947,11 +3947,15 @@ final_value_replacement_loop (class loop *loop)
|
|||
GENERIC interface). */
|
||||
def = unshare_expr (def);
|
||||
auto loc = gimple_phi_arg_location (phi, exit->dest_idx);
|
||||
remove_phi_node (&psi, false);
|
||||
|
||||
/* Create the replacement statements. */
|
||||
gimple_seq stmts;
|
||||
def = force_gimple_operand (def, &stmts, false, NULL_TREE);
|
||||
|
||||
/* Remove the old phi after the gimplification to make sure the
|
||||
SSA name is defined by a statement so that fold_stmt during
|
||||
the gimplification does not crash. */
|
||||
remove_phi_node (&psi, false);
|
||||
gassign *ass = gimple_build_assign (rslt, def);
|
||||
gimple_set_location (ass, loc);
|
||||
gimple_seq_add_stmt (&stmts, ass);
|
||||
|
|
|
|||
Loading…
Reference in New Issue