https://gcc.gnu.org/g:3e06763a695d97aa46c9de71573ec6a43bb92449

commit r15-813-g3e06763a695d97aa46c9de71573ec6a43bb92449
Author: Andrew Pinski <quic_apin...@quicinc.com>
Date:   Thu May 23 09:56:37 2024 -0700

    Use simple_dce_from_worklist in phiprop
    
    I noticed that phiprop leaves around phi nodes which
    defines a ssa name which is unused. This just adds a
    bitmap to mark those ssa names and then calls
    simple_dce_from_worklist at the very end to remove
    those phi nodes and all of the dependencies if there
    was any. This might allow us to optimize something earlier
    due to the removal of the phi which was taking the address
    of the variables.
    
    Bootstrapped and tested on x86_64-linux-gnu with no regressions.
    
    gcc/ChangeLog:
    
            * tree-ssa-phiprop.cc (phiprop_insert_phi): Add
            dce_ssa_names argument. Add the phi's result to it.
            (propagate_with_phi): Add dce_ssa_names argument.
            Update call to phiprop_insert_phi.
            (pass_phiprop::execute): Update call to propagate_with_phi.
            Call simple_dce_from_worklist if there was a change.
    
    Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>

Diff:
---
 gcc/tree-ssa-phiprop.cc | 28 ++++++++++++++++++----------
 1 file changed, 18 insertions(+), 10 deletions(-)

diff --git a/gcc/tree-ssa-phiprop.cc b/gcc/tree-ssa-phiprop.cc
index 041521ef106..2a1cdae46d2 100644
--- a/gcc/tree-ssa-phiprop.cc
+++ b/gcc/tree-ssa-phiprop.cc
@@ -34,6 +34,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "stor-layout.h"
 #include "tree-ssa-loop.h"
 #include "tree-cfg.h"
+#include "tree-ssa-dce.h"
 
 /* This pass propagates indirect loads through the PHI node for its
    address to make the load source possibly non-addressable and to
@@ -132,12 +133,15 @@ phivn_valid_p (struct phiprop_d *phivn, tree name, 
basic_block bb)
 
 static tree
 phiprop_insert_phi (basic_block bb, gphi *phi, gimple *use_stmt,
-                   struct phiprop_d *phivn, size_t n)
+                   struct phiprop_d *phivn, size_t n,
+                   bitmap dce_ssa_names)
 {
   tree res;
   gphi *new_phi = NULL;
   edge_iterator ei;
   edge e;
+  tree phi_result = PHI_RESULT (phi);
+  bitmap_set_bit (dce_ssa_names, SSA_NAME_VERSION (phi_result));
 
   gcc_assert (is_gimple_assign (use_stmt)
              && gimple_assign_rhs_code (use_stmt) == MEM_REF);
@@ -276,7 +280,7 @@ chk_uses (tree, tree *idx, void *data)
 
 static bool
 propagate_with_phi (basic_block bb, gphi *phi, struct phiprop_d *phivn,
-                   size_t n)
+                   size_t n, bitmap dce_ssa_names)
 {
   tree ptr = PHI_RESULT (phi);
   gimple *use_stmt;
@@ -420,9 +424,10 @@ propagate_with_phi (basic_block bb, gphi *phi, struct 
phiprop_d *phivn,
                goto next;
            }
 
-         phiprop_insert_phi (bb, phi, use_stmt, phivn, n);
+         phiprop_insert_phi (bb, phi, use_stmt, phivn, n, dce_ssa_names);
 
-         /* Remove old stmt.  The phi is taken care of by DCE.  */
+         /* Remove old stmt. The phi and all of maybe its depedencies
+            will be removed later via simple_dce_from_worklist. */
          gsi = gsi_for_stmt (use_stmt);
          /* Unlinking the VDEF here is fine as we are sure that we process
             stmts in execution order due to aggregate copies having VDEFs
@@ -442,16 +447,15 @@ propagate_with_phi (basic_block bb, gphi *phi, struct 
phiprop_d *phivn,
         is the first load transformation.  */
       else if (!phi_inserted)
        {
-         res = phiprop_insert_phi (bb, phi, use_stmt, phivn, n);
+         res = phiprop_insert_phi (bb, phi, use_stmt, phivn, n, dce_ssa_names);
          type = TREE_TYPE (res);
 
          /* Remember the value we created for *ptr.  */
          phivn[SSA_NAME_VERSION (ptr)].value = res;
          phivn[SSA_NAME_VERSION (ptr)].vuse = vuse;
 
-         /* Remove old stmt.  The phi is taken care of by DCE, if we
-            want to delete it here we also have to delete all intermediate
-            copies.  */
+         /* Remove old stmt.  The phi and all of maybe its depedencies
+            will be removed later via simple_dce_from_worklist. */
          gsi = gsi_for_stmt (use_stmt);
          gsi_remove (&gsi, true);
 
@@ -514,6 +518,7 @@ pass_phiprop::execute (function *fun)
   gphi_iterator gsi;
   unsigned i;
   size_t n;
+  auto_bitmap dce_ssa_names;
 
   calculate_dominance_info (CDI_DOMINATORS);
 
@@ -531,11 +536,14 @@ pass_phiprop::execute (function *fun)
       if (bb_has_abnormal_pred (bb))
        continue;
       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
-       did_something |= propagate_with_phi (bb, gsi.phi (), phivn, n);
+       did_something |= propagate_with_phi (bb, gsi.phi (), phivn, n, 
dce_ssa_names);
     }
 
   if (did_something)
-    gsi_commit_edge_inserts ();
+    {
+      gsi_commit_edge_inserts ();
+      simple_dce_from_worklist (dce_ssa_names);
+    }
 
   free (phivn);

Reply via email to