https://gcc.gnu.org/g:e5bcb08d132bf753178a2b30962b4a9d3452c4f2

commit r16-7000-ge5bcb08d132bf753178a2b30962b4a9d3452c4f2
Author: Andrew Pinski <[email protected]>
Date:   Wed Jan 14 16:44:17 2026 -0800

    slsr: Fix some undefined/overflow introducing bugs in SLSR [PR106883]
    
    This fixes the first part of SLSR incorrectly inserting undefined code 
(overflow)
    into the IR. The easiest way is to rewrite the statement after creating it
    using rewrite_to_defined_unconditional.
    This fixes the testcases from PR 121347 (and a few others) which all cause 
an
    infinite loops to appear.
    I will be posting the fix for replace_rhs_if_not_dup later and at that 
point I
    will add a few testcases.
    
    Bootstrapped and tested on x86_64-linux-gnu with no regressions.
    
            PR tree-optimization/121347
            PR tree-optimization/106883
    gcc/ChangeLog:
    
            * gimple-ssa-strength-reduction.cc (insert_initializers): Rewrite
            newly inserted statements for undefinedness (overflow).
    
    Signed-off-by: Andrew Pinski <[email protected]>

Diff:
---
 gcc/gimple-ssa-strength-reduction.cc | 31 ++++++++++++++++++++++++++-----
 1 file changed, 26 insertions(+), 5 deletions(-)

diff --git a/gcc/gimple-ssa-strength-reduction.cc 
b/gcc/gimple-ssa-strength-reduction.cc
index 70978b295d85..3bb924fa54cd 100644
--- a/gcc/gimple-ssa-strength-reduction.cc
+++ b/gcc/gimple-ssa-strength-reduction.cc
@@ -57,6 +57,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "tree-eh.h"
 #include "builtins.h"
 #include "tree-ssa-dce.h"
+#include "gimple-fold.h"
 
 /* Information about a strength reduction candidate.  Each statement
    in the candidate table represents an expression of one of the
@@ -3474,8 +3475,15 @@ insert_initializers (slsr_cand_t c)
              gimple_set_location (cast_stmt, loc);
            }
 
-         gsi_insert_before (&gsi, init_stmt, GSI_SAME_STMT);
          gimple_set_location (init_stmt, loc);
+         if (gimple_needing_rewrite_undefined (init_stmt))
+           {
+             gimple_seq seq;
+             seq = rewrite_to_defined_unconditional (init_stmt);
+             gsi_insert_seq_before (&gsi, seq, GSI_SAME_STMT);
+           }
+         else
+           gsi_insert_before (&gsi, init_stmt, GSI_SAME_STMT);
        }
       else
        {
@@ -3483,6 +3491,7 @@ insert_initializers (slsr_cand_t c)
          gimple *basis_stmt = lookup_cand (c->basis)->cand_stmt;
          location_t loc = gimple_location (basis_stmt);
 
+         gimple_set_location (init_stmt, gimple_location (basis_stmt));
          if (!gsi_end_p (gsi) && stmt_ends_bb_p (gsi_stmt (gsi)))
            {
              if (cast_stmt)
@@ -3490,7 +3499,14 @@ insert_initializers (slsr_cand_t c)
                  gsi_insert_before (&gsi, cast_stmt, GSI_SAME_STMT);
                  gimple_set_location (cast_stmt, loc);
                }
-             gsi_insert_before (&gsi, init_stmt, GSI_SAME_STMT);
+             if (gimple_needing_rewrite_undefined (init_stmt))
+               {
+                 gimple_seq seq;
+                 seq = rewrite_to_defined_unconditional (init_stmt);
+                 gsi_insert_seq_before (&gsi, seq, GSI_SAME_STMT);
+               }
+             else
+               gsi_insert_before (&gsi, init_stmt, GSI_SAME_STMT);
            }
          else
            {
@@ -3499,10 +3515,15 @@ insert_initializers (slsr_cand_t c)
                  gsi_insert_after (&gsi, cast_stmt, GSI_NEW_STMT);
                  gimple_set_location (cast_stmt, loc);
                }
-             gsi_insert_after (&gsi, init_stmt, GSI_NEW_STMT);
+             if (gimple_needing_rewrite_undefined (init_stmt))
+               {
+                 gimple_seq seq;
+                 seq = rewrite_to_defined_unconditional (init_stmt);
+                 gsi_insert_seq_after (&gsi, seq, GSI_SAME_STMT);
+               }
+             else
+               gsi_insert_after (&gsi, init_stmt, GSI_SAME_STMT);
            }
-
-         gimple_set_location (init_stmt, gimple_location (basis_stmt));
        }
 
       if (dump_file && (dump_flags & TDF_DETAILS))

Reply via email to