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

commit f8e0cfeb4ede5c0202bf6e4f0df1c74b74140cc3
Author: Ondřej Machota <ondrejmach...@gmail.com>
Date:   Tue Mar 11 00:31:04 2025 +0100

    rtl-ssa: dce access phi node inputs

Diff:
---
 gcc/dce.cc | 46 +++++++++++++++++++++++++++++++++++++---------
 1 file changed, 37 insertions(+), 9 deletions(-)

diff --git a/gcc/dce.cc b/gcc/dce.cc
index d3b569a74ca0..21a7f23507af 100644
--- a/gcc/dce.cc
+++ b/gcc/dce.cc
@@ -1433,8 +1433,8 @@ bool is_rtx_insn_prelive(rtx_insn *insn) {
   // According to the docs, rtl ssa does not contain noteS and barrierS 
   if (!NONJUMP_INSN_P (insn))
   {
-    std::cerr << "found jump instruction\n";
-    debug(insn);
+    //std::cerr << "found jump instruction\n";
+    //debug(insn);
     return true;
   }
 
@@ -1513,7 +1513,7 @@ bool is_prelive(insn_info *insn)
     return false;
 
   auto res = is_rtx_insn_prelive(rtl);
-  std::cerr << "Trying to mark insn: " << insn->uid() << " as prelive: " << 
res << '\n';
+  //std::cerr << "Trying to mark insn: " << insn->uid() << " as prelive: " << 
res << '\n';
 
   return is_rtx_insn_prelive(rtl);
 }
@@ -1592,11 +1592,25 @@ rtl_ssa_dce_mark()
   {
     insn_info *insn = worklist.pop();
     use_array uses = insn->uses();
+    if (insn->is_phi()) {
+      std::cerr << "Phi : "<< insn->uid() << " - uses: " << insn->num_uses() 
<< ", defs:" << insn->num_defs() << '\n';
+      for (auto&& use : uses) {
+        debug(use);
+        std::cerr << '\n';
+      }
+    } else if (insn->is_artificial()) {
+      std::cerr << "Artificial " << insn->uid() << " - uses: " << 
insn->num_uses() << ", defs:" << insn->num_defs() << '\n';
+      for (auto&& use : uses) {
+        debug(use);
+        std::cerr << '\n';
+      }
+    }
 
     if (dump_file)
       fprintf(dump_file, "Looking at: %d, uses: %d\n", insn->uid(), 
uses.size());
 
-    std::cerr << "Insn: " << insn->uid() << ", uses: " << uses.size() << '\n';
+    //std::cerr << "Insn: " << insn->uid() << ", uses: " << uses.size() << 
'\n';
+      std::cerr << "Current: " << insn->uid() << '\n';
     for (size_t i = 0; i < uses.size(); i++)
     {
       // debug(uses[i]);
@@ -1608,7 +1622,18 @@ rtl_ssa_dce_mark()
       // std::cerr << '\n';
       // debug(use);
       // std::cerr << '\n';
+      
+      
       insn_info *parent_insn = use->def()->insn();
+      if (parent_insn->is_phi()) { // this is weird...
+        // debug(use->def());
+        phi_info * pi = as_a<phi_info *> (use->def());
+        // std::cerr << "phi inputs: " << pi->num_inputs() << '\n';
+        for (auto&& input: pi->inputs()) {
+          use_info* phi_use = input;
+          std::cerr << "Via phi insn: " << phi_use->def()->insn()->uid() << 
'\n';
+        }
+      }
       int parent_insn_uid = parent_insn->uid();
       // propage that some instruction in chain is live from bottom to top
       if (dump_file)
@@ -1616,9 +1641,11 @@ rtl_ssa_dce_mark()
       // not yet marked
       if (!(marked.count(parent_insn) > 0))
       {
-        std::cerr << "Adding: " << parent_insn_uid << " to worklist";
+        //std::cerr << "Adding: " << parent_insn_uid << " to worklist";
         if (dump_file)
           fprintf(dump_file, "  Adding insn %d to worklist - mark\n", 
parent_insn_uid);
+
+        
         worklist.safe_push(parent_insn);
         marked.emplace(parent_insn);
       }
@@ -1628,7 +1655,8 @@ rtl_ssa_dce_mark()
   }
 
   for (auto&& insn : marked) {
-    std::cerr << "Marked insn: " << insn->uid() << '\n';
+    if (dump_file)
+      fprintf(dump_file, "  Marked insn: %d\n", insn->uid());
   }
 
   // TODO : control dependence
@@ -1675,7 +1703,7 @@ rtl_ssa_dce_sweep(std::unordered_set<insn_info *> marked)
   }
 
   if (crtl->ssa->verify_insn_changes(changes)) {
-    std::cerr << "Changes are correct\n";
+    //std::cerr << "Changes are correct\n";
     crtl->ssa->change_insns(changes);
   } else {
     std::cerr << "Changes are not correct\n";
@@ -1688,7 +1716,7 @@ rtl_ssa_dce()
   rtl_ssa_dce_init();
   debug(crtl->ssa);
 
-  std::cerr << "Next phase: prelive + mark: \n";
+  //std::cerr << "Next phase: prelive + mark: \n";
   std::unordered_set<insn_info *> marked = rtl_ssa_dce_mark();
   rtl_ssa_dce_sweep(marked);
   rtl_ssa_dce_done();
@@ -1726,7 +1754,7 @@ namespace
     }
 
     /* opt_pass methods: */
-    bool gate(function *) final override { return flag_dce; }
+    bool gate(function *) final override { return optimize > 0 && flag_dce; }
 
     unsigned int execute(function *) final override { return rtl_ssa_dce(); }

Reply via email to