https://gcc.gnu.org/g:789ff802b5765949cc05c609fe6bafaf70880b8d

commit r16-5554-g789ff802b5765949cc05c609fe6bafaf70880b8d
Author: Andrew Pinski <[email protected]>
Date:   Mon Nov 24 00:52:35 2025 -0800

    forwprop: Allow mismatch clobbers in simple dse
    
    As mention in the patch that adds DSEing lhs of calls,
    some testcases were xfailed due to exceptions and mismatch
    of clobbers in some cases.
    This allows them and un-xfails the testcase where they show
    up.
    
    Bootstrapped and tested on x86_64-linux-gnu.
    
    gcc/ChangeLog:
    
            * tree-ssa-forwprop.cc (do_simple_agr_dse): Allow
            for mismatched clobbers.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/tree-ssa/simple-dse-3.C: un-xfail.
    
    Signed-off-by: Andrew Pinski <[email protected]>

Diff:
---
 gcc/testsuite/g++.dg/tree-ssa/simple-dse-3.C | 6 +++---
 gcc/tree-ssa-forwprop.cc                     | 9 ++++-----
 2 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/gcc/testsuite/g++.dg/tree-ssa/simple-dse-3.C 
b/gcc/testsuite/g++.dg/tree-ssa/simple-dse-3.C
index dc31eff3be3b..3b3bcc0174d4 100644
--- a/gcc/testsuite/g++.dg/tree-ssa/simple-dse-3.C
+++ b/gcc/testsuite/g++.dg/tree-ssa/simple-dse-3.C
@@ -20,9 +20,9 @@ void func3(int a)
   struct s1 p1 = pure1(a);
 }
 
-// { dg-final { scan-tree-dump "Removing dead call store stmt p1 =" 
"forwprop1" { xfail *-*-* } } }
+// { dg-final { scan-tree-dump "Removing dead call store stmt p1 =" 
"forwprop1"  } }
 // { dg-final { scan-tree-dump-not "Removing dead call store stmt v1 =" 
"forwprop1" } }
 // { dg-final { scan-tree-dump-not "Removing lhs of call stmt " "forwprop1" } }
-// { dg-final { scan-tree-dump-times "Removing dead call store stmt" 1 
"forwprop1" { target { ! c++26 }  xfail *-*-* } } }
-// { dg-final { scan-tree-dump-times "Removing dead call store stmt" 2 
"forwprop1" { target c++26  xfail *-*-* } } }
+// { dg-final { scan-tree-dump-times "Removing dead call store stmt" 1 
"forwprop1" { target { ! c++26 } } } }
+// { dg-final { scan-tree-dump-times "Removing dead call store stmt" 2 
"forwprop1" { target c++26  } } }
 
diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc
index a744e224d995..c9a57d67adec 100644
--- a/gcc/tree-ssa-forwprop.cc
+++ b/gcc/tree-ssa-forwprop.cc
@@ -1791,7 +1791,6 @@ do_simple_agr_dse (gassign *stmt, bool full_walk)
   /* Only handle clobbers of a full decl.  */
   if (!DECL_P (lhs))
     return;
-  clobber_kind kind = (clobber_kind)CLOBBER_KIND (gimple_assign_rhs1 (stmt));
   ao_ref_init (&read, lhs);
   tree vuse = gimple_vuse (stmt);
   unsigned limit = full_walk ? param_sccvn_max_alias_queries_per_access : 4;
@@ -1813,20 +1812,20 @@ do_simple_agr_dse (gassign *stmt, bool full_walk)
          basic_block ubb = gimple_bb (use_stmt);
          if (stmt == use_stmt)
            continue;
-         /* If the use is the same kind of clobber for lhs,
+         /* If the use is a clobber for lhs,
             then it can be safely skipped; this happens with eh
             and sometimes jump threading.  */
-         if (gimple_clobber_p (use_stmt, kind)
+         if (gimple_clobber_p (use_stmt)
              && lhs == gimple_assign_lhs (use_stmt))
            continue;
          /* If the use is a phi and it is single use then check if that single 
use
-            is a clobber of the same kind and lhs is the same.  */
+            is a clobber and lhs is the same.  */
          if (gphi *use_phi = dyn_cast<gphi*>(use_stmt))
            {
              use_operand_p ou;
              gimple *ostmt;
              if (single_imm_use (gimple_phi_result (use_phi), &ou, &ostmt)
-                 && gimple_clobber_p (ostmt, kind)
+                 && gimple_clobber_p (ostmt)
                  && lhs == gimple_assign_lhs (ostmt))
                continue;
              /* A phi node will never be dominating the clobber.  */

Reply via email to