https://gcc.gnu.org/g:9728f377ae6a1092aba53166a8e67e6eff641412

commit 9728f377ae6a1092aba53166a8e67e6eff641412
Author: Ondřej Machota <ondrejmach...@gmail.com>
Date:   Tue May 20 08:37:19 2025 +0200

    rtl-ssa-dce: detect phi loop when deleting, enable debugizing

Diff:
---
 gcc/dce.cc             | 20 ++++++++++++++------
 gcc/rtl-ssa/changes.cc | 19 +++++++++++++++----
 2 files changed, 29 insertions(+), 10 deletions(-)

diff --git a/gcc/dce.cc b/gcc/dce.cc
index 520202f0462e..46806f18db80 100644
--- a/gcc/dce.cc
+++ b/gcc/dce.cc
@@ -17,7 +17,6 @@ You should have received a copy of the GNU General Public 
License
 along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
-#include "sbitmap.h"
 #include <iostream>
 #include <ostream>
 #define INCLUDE_ALGORITHM
@@ -1343,7 +1342,7 @@ public:
 
   void resize(size_t size, int offset)
   {
-    sbitmap_resize(m_bitmap, size, 0); 
+    m_bitmap = sbitmap_resize(m_bitmap, (unsigned int)size, 0); 
     m_offset = offset; 
   }
 
@@ -1381,7 +1380,7 @@ private:
 
   void debugize_insn (insn_info *);
 
-  void unmark_debugizable(insn_info &, sbitmap &);
+  void unmark_debugizable(insn_info &, sbitmap);
   sbitmap find_debugizable(const std::unordered_set<insn_info *> &);
   void debugize_insns (const sbitmap);
 
@@ -1748,7 +1747,7 @@ rtl_ssa_dce::execute (function *fn)
     count++;
   }
 
-  m_marked.resize(artificial_min, real_max);
+  m_marked.resize(artificial_min, real_max + 1);
   // std::cout << "real_max: " << real_max << '\n';
   // std::cout << "artificial_min: " << artificial_min << '\n';
   // std::cout << "total: " << real_max - artificial_min + 3 << '\n';
@@ -1783,9 +1782,14 @@ rtl_ssa_dce::execute (function *fn)
   // frame_pointer_needed << '\n';
 
   mark ();
-  // propagate_dead_phis();
   if (MAY_HAVE_DEBUG_BIND_INSNS)
+   {
+    auto dead_phis = propagate_dead_phis();
+    auto debugizable = find_debugizable(dead_phis);
+    debugize_insns(debugizable);
+    
     reset_dead_debug ();
+   }
   sweep ();
 
   free_dominance_info (CDI_DOMINATORS);
@@ -1902,9 +1906,13 @@ replace_dead_reg(rtx x, const_rtx old_rtx 
ATTRIBUTE_UNUSED, void *data)
 
 // visit every marked instruction in INSN dependency tree and unmark it
 void
-rtl_ssa_dce::unmark_debugizable(insn_info &insn, sbitmap &debugizable) 
+rtl_ssa_dce::unmark_debugizable(insn_info &insn, sbitmap debugizable) 
 {
   auto_vec<insn_info *> worklist;
+  gcc_assert(!insn.is_artificial());
+  if (insn.uid () < 0)
+    std::cerr << "WTF" << insn.uid() << '\n';
+  std::cout << insn.uid () << '\n';
   bitmap_set_bit (debugizable, insn.uid ());
   worklist.safe_push (&insn);
 
diff --git a/gcc/rtl-ssa/changes.cc b/gcc/rtl-ssa/changes.cc
index 62518c515c92..aab6251d2bb1 100644
--- a/gcc/rtl-ssa/changes.cc
+++ b/gcc/rtl-ssa/changes.cc
@@ -256,20 +256,30 @@ rtl_ssa::changes_are_worthwhile (array_slice<insn_change 
*const> changes,
 // SET has been deleted.  Clean up all remaining uses.  Such uses are
 // either dead phis or now-redundant live-out uses.
 void
-function_info::process_uses_of_deleted_def (set_info *set, auto_sbitmap 
&visited_phis)
+function_info::process_uses_of_deleted_def (set_info *set, auto_sbitmap 
&visited_phi_nodes)
 {
   if (!set->has_any_uses ())
     return;
 
+  insn_info *set_insn = set->insn ();
+  if (set_insn && set_insn->is_phi()) {
+       auto *phi = static_cast<phi_info *> (set);
+       bitmap_set_bit (visited_phi_nodes, phi->uid ());
+  } 
+
   auto *use = *set->all_uses ().begin ();
   do
     {
       auto *next_use = use->next_use ();
       if (use->is_in_phi ())
        {
-         // This call will not recurse.
-         process_uses_of_deleted_def (use->phi (), visited_phis);
-         delete_phi (use->phi ());
+         phi_info *phi = use->phi ();
+         if (bitmap_bit_p(visited_phi_nodes, phi->uid ())) {
+               remove_use (use);
+         } else {
+               process_uses_of_deleted_def (phi, visited_phi_nodes);
+               delete_phi (phi);
+         }
        }
       else
        {
@@ -862,6 +872,7 @@ function_info::change_insns (array_slice<insn_change *> 
changes)
          if (set && set->has_any_uses ())
            {
                        auto_sbitmap visited_phis(m_next_phi_uid);
+                       bitmap_clear(visited_phis);
                        process_uses_of_deleted_def (set, visited_phis);
                }
          remove_def (def);

Reply via email to