On Fri, Oct 4, 2024 at 12:08 AM Richard Biener <richard.guent...@gmail.com> wrote: > > On Thu, Oct 3, 2024 at 6:09 PM Andrew Pinski <quic_apin...@quicinc.com> wrote: > > > > While looking into the ifcombine, I noticed that rewrite_to_defined_overflow > > was rewriting already defined code. In the previous attempt at fixing this, > > the review mentioned we should not be calling rewrite_to_defined_overflow > > in those cases. The places which called rewrite_to_defined_overflow didn't > > always check the lhs of the assignment. This fixes the problem by > > introducing a helper function which is to be used before calling > > rewrite_to_defined_overflow. > > > > Bootstrapped and tested on x86_64-linux-gnu. > > OK.
Just a quick note, this depends on the rewrite of `scope conflicts better` issue; otherwise we get a regression. I am working on the new patch for that and will resubmit this with that patch. Thanks, Andrew > > Thanks, > Richard. > > > gcc/ChangeLog: > > > > PR tree-optimization/111276 > > * gimple-fold.cc (arith_code_with_undefined_signed_overflow): Make > > static. > > (gimple_with_undefined_signed_overflow): New function. > > * gimple-fold.h (arith_code_with_undefined_signed_overflow): Remove. > > (gimple_with_undefined_signed_overflow): Add declaration. > > * tree-if-conv.cc (if_convertible_gimple_assign_stmt_p): Use > > gimple_with_undefined_signed_overflow instead of manually > > checking lhs and the code of the stmt. > > (predicate_statements): Likewise. > > * tree-ssa-ifcombine.cc (pass_tree_ifcombine::execute): Likewise. > > * tree-ssa-loop-im.cc (move_computations_worker): Likewise. > > * tree-ssa-reassoc.cc (update_range_test): Likewise. Reformat. > > * tree-scalar-evolution.cc (final_value_replacement_loop): Use > > gimple_with_undefined_signed_overflow instead of > > arith_code_with_undefined_signed_overflow. > > * tree-ssa-loop-split.cc (split_loop): Likewise. > > > > Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com> > > --- > > gcc/gimple-fold.cc | 26 ++++++++++++++++++++++- > > gcc/gimple-fold.h | 2 +- > > gcc/tree-if-conv.cc | 16 +++------------ > > gcc/tree-scalar-evolution.cc | 5 +---- > > gcc/tree-ssa-ifcombine.cc | 10 ++------- > > gcc/tree-ssa-loop-im.cc | 6 +----- > > gcc/tree-ssa-loop-split.cc | 5 +---- > > gcc/tree-ssa-reassoc.cc | 40 +++++++++++++++--------------------- > > 8 files changed, 50 insertions(+), 60 deletions(-) > > > > diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc > > index 942de7720fd..0b49d6754e2 100644 > > --- a/gcc/gimple-fold.cc > > +++ b/gcc/gimple-fold.cc > > @@ -8991,7 +8991,7 @@ gimple_fold_indirect_ref (tree t) > > integer types involves undefined behavior on overflow and the > > operation can be expressed with unsigned arithmetic. */ > > > > -bool > > +static bool > > arith_code_with_undefined_signed_overflow (tree_code code) > > { > > switch (code) > > @@ -9008,6 +9008,30 @@ arith_code_with_undefined_signed_overflow (tree_code > > code) > > } > > } > > > > +/* Return true if STMT has an operation that operates on a signed > > + integer types involves undefined behavior on overflow and the > > + operation can be expressed with unsigned arithmetic. */ > > + > > +bool > > +gimple_with_undefined_signed_overflow (gimple *stmt) > > +{ > > + if (!is_gimple_assign (stmt)) > > + return false; > > + tree lhs = gimple_assign_lhs (stmt); > > + if (!lhs) > > + return false; > > + tree lhs_type = TREE_TYPE (lhs); > > + if (!INTEGRAL_TYPE_P (lhs_type) > > + && !POINTER_TYPE_P (lhs_type)) > > + return false; > > + if (!TYPE_OVERFLOW_UNDEFINED (lhs_type)) > > + return false; > > + if (!arith_code_with_undefined_signed_overflow > > + (gimple_assign_rhs_code (stmt))) > > + return false; > > + return true; > > +} > > + > > /* Rewrite STMT, an assignment with a signed integer or pointer arithmetic > > operation that can be transformed to unsigned arithmetic by converting > > its operand, carrying out the operation in the corresponding unsigned > > diff --git a/gcc/gimple-fold.h b/gcc/gimple-fold.h > > index dc709d515a9..165325392c9 100644 > > --- a/gcc/gimple-fold.h > > +++ b/gcc/gimple-fold.h > > @@ -59,7 +59,7 @@ extern tree gimple_get_virt_method_for_vtable > > (HOST_WIDE_INT, tree, > > extern tree gimple_fold_indirect_ref (tree); > > extern bool gimple_fold_builtin_sprintf (gimple_stmt_iterator *); > > extern bool gimple_fold_builtin_snprintf (gimple_stmt_iterator *); > > -extern bool arith_code_with_undefined_signed_overflow (tree_code); > > +extern bool gimple_with_undefined_signed_overflow (gimple *); > > extern void rewrite_to_defined_overflow (gimple_stmt_iterator *); > > extern gimple_seq rewrite_to_defined_overflow (gimple *); > > extern void replace_call_with_value (gimple_stmt_iterator *, tree); > > diff --git a/gcc/tree-if-conv.cc b/gcc/tree-if-conv.cc > > index 3b04d1e8d34..f5aa6c04fc9 100644 > > --- a/gcc/tree-if-conv.cc > > +++ b/gcc/tree-if-conv.cc > > @@ -1067,11 +1067,7 @@ if_convertible_gimple_assign_stmt_p (gimple *stmt, > > fprintf (dump_file, "tree could trap...\n"); > > return false; > > } > > - else if ((INTEGRAL_TYPE_P (TREE_TYPE (lhs)) > > - || POINTER_TYPE_P (TREE_TYPE (lhs))) > > - && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (lhs)) > > - && arith_code_with_undefined_signed_overflow > > - (gimple_assign_rhs_code (stmt))) > > + else if (gimple_with_undefined_signed_overflow (stmt)) > > /* We have to rewrite stmts with undefined overflow. */ > > need_to_rewrite_undefined = true; > > > > @@ -2820,7 +2816,6 @@ predicate_statements (loop_p loop) > > for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi);) > > { > > gassign *stmt = dyn_cast <gassign *> (gsi_stmt (gsi)); > > - tree lhs; > > if (!stmt) > > ; > > else if (is_false_predicate (cond) > > @@ -2876,12 +2871,7 @@ predicate_statements (loop_p loop) > > > > gsi_replace (&gsi, new_stmt, true); > > } > > - else if (((lhs = gimple_assign_lhs (stmt)), true) > > - && (INTEGRAL_TYPE_P (TREE_TYPE (lhs)) > > - || POINTER_TYPE_P (TREE_TYPE (lhs))) > > - && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (lhs)) > > - && arith_code_with_undefined_signed_overflow > > - (gimple_assign_rhs_code > > (stmt))) > > + else if (gimple_with_undefined_signed_overflow (stmt)) > > rewrite_to_defined_overflow (&gsi); > > else if (gimple_vdef (stmt)) > > { > > @@ -2936,7 +2926,7 @@ predicate_statements (loop_p loop) > > gsi_replace (&gsi, new_call, true); > > } > > > > - lhs = gimple_get_lhs (gsi_stmt (gsi)); > > + tree lhs = gimple_get_lhs (gsi_stmt (gsi)); > > if (lhs && TREE_CODE (lhs) == SSA_NAME) > > ssa_names.add (lhs); > > gsi_next (&gsi); > > diff --git a/gcc/tree-scalar-evolution.cc b/gcc/tree-scalar-evolution.cc > > index abb2bad7773..34dc9810a31 100644 > > --- a/gcc/tree-scalar-evolution.cc > > +++ b/gcc/tree-scalar-evolution.cc > > @@ -3931,10 +3931,7 @@ final_value_replacement_loop (class loop *loop) > > gsi2 = gsi_start (stmts); > > while (!gsi_end_p (gsi2)) > > { > > - gimple *stmt = gsi_stmt (gsi2); > > - if (is_gimple_assign (stmt) > > - && arith_code_with_undefined_signed_overflow > > - (gimple_assign_rhs_code (stmt))) > > + if (gimple_with_undefined_signed_overflow (gsi_stmt (gsi2))) > > rewrite_to_defined_overflow (&gsi2); > > gsi_next (&gsi2); > > } > > diff --git a/gcc/tree-ssa-ifcombine.cc b/gcc/tree-ssa-ifcombine.cc > > index 6a3bc99190d..541a7be86ed 100644 > > --- a/gcc/tree-ssa-ifcombine.cc > > +++ b/gcc/tree-ssa-ifcombine.cc > > @@ -874,15 +874,9 @@ pass_tree_ifcombine::execute (function *fun) > > for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p > > (gsi); > > gsi_next (&gsi)) > > { > > - gassign *ass = dyn_cast <gassign *> (gsi_stmt (gsi)); > > - if (!ass) > > + if (!gimple_with_undefined_signed_overflow (gsi_stmt (gsi))) > > continue; > > - tree lhs = gimple_assign_lhs (ass); > > - if ((INTEGRAL_TYPE_P (TREE_TYPE (lhs)) > > - || POINTER_TYPE_P (TREE_TYPE (lhs))) > > - && arith_code_with_undefined_signed_overflow > > - (gimple_assign_rhs_code (ass))) > > - rewrite_to_defined_overflow (&gsi); > > + rewrite_to_defined_overflow (&gsi); > > } > > cfg_changed |= true; > > } > > diff --git a/gcc/tree-ssa-loop-im.cc b/gcc/tree-ssa-loop-im.cc > > index ccc56dc42f6..07a4739711c 100644 > > --- a/gcc/tree-ssa-loop-im.cc > > +++ b/gcc/tree-ssa-loop-im.cc > > @@ -1390,11 +1390,7 @@ move_computations_worker (basic_block bb) > > when the target loop header is executed and the stmt may > > invoke undefined integer or pointer overflow rewrite it to > > unsigned arithmetic. */ > > - if (is_gimple_assign (stmt) > > - && INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_lhs (stmt))) > > - && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (gimple_assign_lhs (stmt))) > > - && arith_code_with_undefined_signed_overflow > > - (gimple_assign_rhs_code (stmt)) > > + if (gimple_with_undefined_signed_overflow (stmt) > > && (!ALWAYS_EXECUTED_IN (bb) > > || !(ALWAYS_EXECUTED_IN (bb) == level > > || flow_loop_nested_p (ALWAYS_EXECUTED_IN (bb), level)))) > > diff --git a/gcc/tree-ssa-loop-split.cc b/gcc/tree-ssa-loop-split.cc > > index 68435485b79..c69403c8613 100644 > > --- a/gcc/tree-ssa-loop-split.cc > > +++ b/gcc/tree-ssa-loop-split.cc > > @@ -662,10 +662,7 @@ split_loop (class loop *loop1) > > gsi = gsi_start (stmts2); > > while (!gsi_end_p (gsi)) > > { > > - gimple *stmt = gsi_stmt (gsi); > > - if (is_gimple_assign (stmt) > > - && arith_code_with_undefined_signed_overflow > > - (gimple_assign_rhs_code > > (stmt))) > > + if (gimple_with_undefined_signed_overflow (gsi_stmt > > (gsi))) > > rewrite_to_defined_overflow (&gsi); > > gsi_next (&gsi); > > } > > diff --git a/gcc/tree-ssa-reassoc.cc b/gcc/tree-ssa-reassoc.cc > > index 347350fc98d..dc1b2410f2f 100644 > > --- a/gcc/tree-ssa-reassoc.cc > > +++ b/gcc/tree-ssa-reassoc.cc > > @@ -2924,30 +2924,22 @@ update_range_test (struct range_entry *range, > > struct range_entry *otherrange, > > !gsi_end_p (gsi); gsi_next (&gsi)) > > { > > gimple *stmt = gsi_stmt (gsi); > > - if (is_gimple_assign (stmt)) > > - if (tree lhs = gimple_assign_lhs (stmt)) > > - if ((INTEGRAL_TYPE_P (TREE_TYPE (lhs)) > > - || POINTER_TYPE_P (TREE_TYPE (lhs))) > > - && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (lhs))) > > - { > > - enum tree_code code = gimple_assign_rhs_code (stmt); > > - if (arith_code_with_undefined_signed_overflow (code)) > > - { > > - gimple_stmt_iterator gsip = gsi; > > - gimple_stmt_iterator gsin = gsi; > > - gsi_prev (&gsip); > > - gsi_next (&gsin); > > - rewrite_to_defined_overflow (&gsi); > > - unsigned uid = gimple_uid (stmt); > > - if (gsi_end_p (gsip)) > > - gsip = gsi_after_labels (bb); > > - else > > - gsi_next (&gsip); > > - for (; gsi_stmt (gsip) != gsi_stmt (gsin); > > - gsi_next (&gsip)) > > - gimple_set_uid (gsi_stmt (gsip), uid); > > - } > > - } > > + if (gimple_with_undefined_signed_overflow (stmt)) > > + { > > + gimple_stmt_iterator gsip = gsi; > > + gimple_stmt_iterator gsin = gsi; > > + gsi_prev (&gsip); > > + gsi_next (&gsin); > > + rewrite_to_defined_overflow (&gsi); > > + unsigned uid = gimple_uid (stmt); > > + if (gsi_end_p (gsip)) > > + gsip = gsi_after_labels (bb); > > + else > > + gsi_next (&gsip); > > + for (; gsi_stmt (gsip) != gsi_stmt (gsin); > > + gsi_next (&gsip)) > > + gimple_set_uid (gsi_stmt (gsip), uid); > > + } > > } > > > > if (opcode == BIT_IOR_EXPR > > -- > > 2.34.1 > >