On Thu, Nov 13, 2025 at 9:02 PM Andrew Pinski <[email protected]> wrote: > > This is 3rd (and hopefully last) time to fix the order here. > The previous times were r16-5093-g77e10b47f25d05 and r16-4905-g7b9d32aa2ffcb5. > The order before these patches were: > * removal of phi > * propagate constants > * gimplification of expr > * create assignment > * rewrite to undefined > * add stmts to bb > > The current order before this patch (and after the other 2): > * gimplification of expr > * removal of phi > * create assignment > * propagate constants > * rewrite to undefined > * add stmts to bb > > The correct and new order with this patch we have: > * gimplifcation of expr > * propagate constants > * removal of phi > * create the assignment > * rewrite to undefined > * add stmts to bb > > This is because the propagate of the constant will cause a fold_stmt which > requires > the statement in the IR still. The gimplifcation of expr also calls fold_stmt. > Now with the new order the phi is not removed until right before the creation > of the > new assigment so the IR in the basic block is well defined while calling > fold_stmt. > > Pushed as obvious after bootstrap/test on x86_64-linux-gnu.
OK. Richard. > PR tree-optimization/122637 > > gcc/ChangeLog: > > * tree-scalar-evolution.cc (final_value_replacement_loop): Fix order > of gimplification and constant prop. > > gcc/testsuite/ChangeLog: > > * gcc.dg/torture/pr122637-1.c: New test. > > Signed-off-by: Andrew Pinski <[email protected]> > --- > gcc/testsuite/gcc.dg/torture/pr122637-1.c | 11 +++++++++++ > gcc/tree-scalar-evolution.cc | 10 +++++----- > 2 files changed, 16 insertions(+), 5 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/torture/pr122637-1.c > > diff --git a/gcc/testsuite/gcc.dg/torture/pr122637-1.c > b/gcc/testsuite/gcc.dg/torture/pr122637-1.c > new file mode 100644 > index 00000000000..22d6d2ddec1 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/torture/pr122637-1.c > @@ -0,0 +1,11 @@ > +/* { dg-do compile } */ > +/* PR tree-optimization/122637 */ > + > +char a[10][3]; > +int b; > +void e(short c) { > + for (; c; c--) { > + for (int d = 2; d; d--) > + b = a[d][0] & a[c][d]; > + } > +} > diff --git a/gcc/tree-scalar-evolution.cc b/gcc/tree-scalar-evolution.cc > index 626c201df5e..307628aa631 100644 > --- a/gcc/tree-scalar-evolution.cc > +++ b/gcc/tree-scalar-evolution.cc > @@ -3966,6 +3966,11 @@ final_value_replacement_loop (class loop *loop) > gimple_seq stmts; > def = force_gimple_operand (def, &stmts, false, NULL_TREE); > > + /* Propagate constants immediately, but leave an unused initialization > + around to avoid invalidating the SCEV cache. */ > + if (CONSTANT_CLASS_P (def) && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rslt)) > + replace_uses_by (rslt, def); > + > /* 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. */ > @@ -3974,11 +3979,6 @@ final_value_replacement_loop (class loop *loop) > gimple_set_location (ass, loc); > gimple_seq_add_stmt (&stmts, ass); > > - /* Propagate constants immediately, but leave an unused initialization > - around to avoid invalidating the SCEV cache. */ > - if (CONSTANT_CLASS_P (def) && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rslt)) > - replace_uses_by (rslt, def); > - > /* If def's type has undefined overflow and there were folded > casts, rewrite all stmts added for def into arithmetics > with defined overflow behavior. */ > -- > 2.43.0 >
