The insert iteration can be corrupted by foldings of replace_uses_by, within this particular PHI replacement but also with subsequent ones. Recompute the insert location before insertion instead.
This fixes an obvserved ICE of gcc.dg/tree-ssa/ssa-sink-16.c. Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed. PR tree-optimization/112827 PR tree-optimization/112848 * tree-scalar-evolution.cc (final_value_replacement_loop): Compute the insert location for each insert. --- gcc/tree-scalar-evolution.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcc/tree-scalar-evolution.cc b/gcc/tree-scalar-evolution.cc index 065bcd0743d..38821ffb15a 100644 --- a/gcc/tree-scalar-evolution.cc +++ b/gcc/tree-scalar-evolution.cc @@ -3739,7 +3739,6 @@ final_value_replacement_loop (class loop *loop) split_loop_exit_edge (exit); /* Set stmt insertion pointer. All stmts are inserted before this point. */ - gimple_stmt_iterator gsi = gsi_after_labels (exit->dest); class loop *ex_loop = superloop_at_depth (loop, @@ -3883,6 +3882,7 @@ final_value_replacement_loop (class loop *loop) gsi_next (&gsi2); } } + gimple_stmt_iterator gsi = gsi_after_labels (exit->dest); gsi_insert_seq_before (&gsi, stmts, GSI_SAME_STMT); if (dump_file) { -- 2.35.3