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

commit r16-466-gbac74b0d0141a440275797a059c2b43978cd9e1c
Author: Andrew Pinski <quic_apin...@quicinc.com>
Date:   Thu Oct 17 05:30:10 2024 +0000

    phiopt: Use rewrite_to_defined_overflow in move_stmt [PR116938]
    
    As mentioned previously the rewrite in move_stmt should be
    using gimple_needing_rewrite_undefined/rewrite_to_defined_unconditional
    instead of just rewriting the VCE.
    This moves move_stmt over to those APIs.
    
    A few testcases needed to be updated due to ABS_EXPR rewrite that happens.
    
    Bootstrapped and tested on x86_64-linux-gnu.
    
            PR tree-optimization/116938
    
    gcc/ChangeLog:
    
            * tree-ssa-phiopt.cc (move_stmt): Use rewrite_to_defined_overflow
            isntead of manually doing the rewrite of the VCE.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.dg/tree-ssa/phi-opt-40.c: Update to expect ABSU_EXPR.
            * gcc.dg/tree-ssa/phi-opt-41.c: Likewise.
    
    Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>

Diff:
---
 gcc/testsuite/gcc.dg/tree-ssa/phi-opt-40.c |  7 ++++---
 gcc/testsuite/gcc.dg/tree-ssa/phi-opt-41.c |  4 ++--
 gcc/tree-ssa-phiopt.cc                     | 26 +++-----------------------
 3 files changed, 9 insertions(+), 28 deletions(-)

diff --git a/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-40.c 
b/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-40.c
index a9011ce97fb1..70629165bb61 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-40.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-40.c
@@ -20,6 +20,7 @@ int f1(int x)
 
 /* { dg-final { scan-tree-dump-times "if " 1 "phiopt1" } } */
 /* { dg-final { scan-tree-dump-not "if " "phiopt2" } } */
-/* { dg-final { scan-tree-dump-times "ABS_EXPR <" 2 "phiopt1" } } */
-/* { dg-final { scan-tree-dump-times "ABS_EXPR <" 1 "phiopt2" } } */
-/* { dg-final { scan-tree-dump-times "ABSU_EXPR <" 1 "phiopt2" } } */
+/* The ABS_EXPR in f gets rewritten to ABSU_EXPR as phiopt can't prove it was 
not undefined when moving it. */
+/* { dg-final { scan-tree-dump-times "ABS_EXPR <" 1 "phiopt1" } } */
+/* { dg-final { scan-tree-dump-times "ABSU_EXPR <" 1 "phiopt1" } } */
+/* { dg-final { scan-tree-dump-times "ABSU_EXPR <" 2 "phiopt2" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-41.c 
b/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-41.c
index 9774e283a7ba..817d4feb0279 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-41.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-41.c
@@ -29,6 +29,6 @@ int fge(int a, unsigned char b)
   return a > 0 ? a : -a;
 }
 
-
+/* The ABS_EXPR gets rewritten to ABSU_EXPR as phiopt can't prove it was not 
undefined when moving it. */
 /* { dg-final { scan-tree-dump-not "if " "phiopt1" } } */
-/* { dg-final { scan-tree-dump-times "ABS_EXPR <" 4 "phiopt1" } } */
+/* { dg-final { scan-tree-dump-times "ABSU_EXPR <" 4 "phiopt1" } } */
diff --git a/gcc/tree-ssa-phiopt.cc b/gcc/tree-ssa-phiopt.cc
index 54ecd93495a5..efd43d2d77e7 100644
--- a/gcc/tree-ssa-phiopt.cc
+++ b/gcc/tree-ssa-phiopt.cc
@@ -838,33 +838,13 @@ move_stmt (gimple *stmt, gimple_stmt_iterator *gsi, 
auto_bitmap &inserted_exprs)
   // Mark the name to be renamed if there is one.
   bitmap_set_bit (inserted_exprs, SSA_NAME_VERSION (name));
   gimple_stmt_iterator gsi1 = gsi_for_stmt (stmt);
-  gsi_move_before (&gsi1, gsi);
+  gsi_move_before (&gsi1, gsi, GSI_NEW_STMT);
   reset_flow_sensitive_info (name);
 
   /* Rewrite some code which might be undefined when
      unconditionalized. */
-  if (gimple_assign_single_p (stmt))
-    {
-      tree rhs = gimple_assign_rhs1 (stmt);
-      /* VCE from integral types to another integral types but with
-        different precisions need to be changed into casts
-        to be well defined when unconditional. */
-      if (gimple_assign_rhs_code (stmt) == VIEW_CONVERT_EXPR
-         && INTEGRAL_TYPE_P (TREE_TYPE (name))
-         && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0))))
-       {
-         if (dump_file && (dump_flags & TDF_DETAILS))
-           {
-             fprintf (dump_file, "rewriting stmt with maybe undefined VCE ");
-             print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
-           }
-         tree new_rhs = TREE_OPERAND (rhs, 0);
-         gcc_assert (is_gimple_val (new_rhs));
-         gimple_assign_set_rhs_code (stmt, NOP_EXPR);
-         gimple_assign_set_rhs1 (stmt, new_rhs);
-         update_stmt (stmt);
-       }
-    }
+  if (gimple_needing_rewrite_undefined (stmt))
+    rewrite_to_defined_unconditional (gsi);
 }
 
 /* RAII style class to temporarily remove flow sensitive

Reply via email to