https://gcc.gnu.org/g:66297a27965b6bd6c04a85491e7270d33181a5c9

commit 66297a27965b6bd6c04a85491e7270d33181a5c9
Author: Ondřej Machota <ondrejmach...@gmail.com>
Date:   Fri Apr 18 15:55:39 2025 +0200

    rtl-ssa-dce: propagate dead phis

Diff:
---
 gcc/dce.cc | 41 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 40 insertions(+), 1 deletion(-)

diff --git a/gcc/dce.cc b/gcc/dce.cc
index 630906fb1ec6..c626d19f0747 100644
--- a/gcc/dce.cc
+++ b/gcc/dce.cc
@@ -1511,7 +1511,7 @@ rtl_ssa_dce_mark(std::unordered_set<phi_info *> 
&marked_phis)
       if (marked_phis.count(pi) > 0)
         continue;
 
-        marked_phis.emplace(pi);
+      marked_phis.emplace(pi);
       uses = pi->inputs();
     }
 
@@ -1566,6 +1566,45 @@ rtl_ssa_dce_sweep(std::unordered_set<insn_info *> marked)
     fprintf(dump_file, "DCE: finish sweep phase\n");
 }
 
+static void propagate_dead_phis(std::unordered_set<insn_info *> &marked, 
std::unordered_set<phi_info *> &marked_phis) {
+  auto_vec<set_info *> worklist;
+  // TODO : add visited to speedup following section
+  for (ebb_info *ebb : crtl->ssa->ebbs()) {
+    for (phi_info *phi : ebb->phis()) {
+      if (marked_phis.count(phi) > 0) 
+        continue;
+
+      worklist.safe_push(phi);
+    }
+  }
+
+  // suppose that debug insns are marked - non marked will be removed later
+  while (!worklist.is_empty ()) {
+    set_info *set = worklist.pop ();
+    insn_info *insn = set->insn ();
+
+    if (insn->is_debug_insn ()) {
+      marked.erase (insn);
+      // debug instructions dont have chains
+      continue;
+    }
+
+    for (use_info *use : set->all_uses()) {
+      if (use->is_in_phi()) {
+        worklist.emplace (use->phi ());
+      } else {
+        gcc_assert(use->is_in_any_insn ());
+        for (def_info *def : use->insn()->defs()) {
+          if (def->kind() != access_kind::SET)
+            continue;
+
+          worklist.emplace(static_cast<set_info *>(def));
+        }
+      }
+    }
+  }
+}
+
 // Clear debug_insn uses and set gen_rtx_UNKNOWN_VAR_LOC
 static void reset_debug_insn_uses(insn_info * insn) {
   gcc_assert(insn->is_debug_insn());

Reply via email to