https://gcc.gnu.org/g:122b4dfca4b1a3e8e6e838ff068f0a016406b699

commit 122b4dfca4b1a3e8e6e838ff068f0a016406b699
Author: Ondřej Machota <ondrejmach...@gmail.com>
Date:   Fri Mar 28 20:13:27 2025 +0100

    rtl-ssa-dce: partial cleanup, prepare transform to debug insns

Diff:
---
 gcc/dce.cc | 86 +++++++++++++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 69 insertions(+), 17 deletions(-)

diff --git a/gcc/dce.cc b/gcc/dce.cc
index f227fc214e99..bb7040ae653d 100644
--- a/gcc/dce.cc
+++ b/gcc/dce.cc
@@ -1306,6 +1306,32 @@ public:
 
 } // namespace
 
+struct offset_bitmap {
+  private:
+    const int m_offset;
+    sbitmap m_bitmap;
+  
+  public:
+    offset_bitmap(size_t size, int offset) : m_bitmap{sbitmap_alloc(size)} {}
+    offset_bitmap(int min_index, int max_index) : offset_bitmap(max_index - 
min_index, 0) {}
+
+    void clear_bit(int index) {
+      bitmap_clear_bit(m_bitmap, index + m_offset);
+    }
+
+    void set_bit(int index) {
+      bitmap_set_bit(m_bitmap, index + m_offset);
+    }
+
+    bool get_bit(int index) {
+      return bitmap_bit_p(m_bitmap, index + m_offset);
+    }
+
+    ~offset_bitmap() {
+      sbitmap_free(m_bitmap);
+    }
+};
+
 bool sets_global_register(rtx_insn* insn) {
   rtx set = single_set(insn);
   if (!set)
@@ -1409,13 +1435,9 @@ bool is_ssa_prelive(const_rtx insn) {
 bool is_rtx_insn_prelive(rtx_insn *insn) {
   gcc_assert(insn != nullptr);
 
-  // Jumps, notes, barriers should not be deleted
-  // According to the docs, rtl ssa does not contain noteS and barrierS 
   if (!NONJUMP_INSN_P (insn))
   {
     // This handles jumps, debug_insns, call_insn, ...
-    //std::cerr << "found jump instruction\n";
-    //debug(insn);
     return true;
   }
 
@@ -1446,10 +1468,6 @@ bool is_rtx_insn_prelive(rtx_insn *insn) {
   if (RTX_FRAME_RELATED_P (insn) && crtl->shrink_wrapped_separate && 
find_reg_note (insn, REG_CFA_RESTORE, NULL))
     return true;
 
-  // Mark set of a global register
-  // if (sets_global_register(insn)) // check rtx_class with GET_RTX_CLASS if 
RTX_ISNS and convert if needed
-  //   return true;
-
   // TODO : asm_noperands???
 
   rtx body = PATTERN(insn);
@@ -1561,8 +1579,8 @@ rtl_ssa_dce_prelive(std::unordered_set<insn_info *> 
&marked)
     next = insn->next_any_insn();
     if (is_prelive(insn))
       {
-        // std::cout << "insn is prelive: " << insn->uid() << '\n';
-        rtl_ssa_dce_mark_live(insn, worklist, marked);}
+        rtl_ssa_dce_mark_live(insn, worklist, marked);
+      }
 
     // if (insn->can_be_optimized () || insn->is_debug_insn ())
     //  if (fwprop_insn (insn, fwprop_addr_p))
@@ -1575,9 +1593,6 @@ rtl_ssa_dce_prelive(std::unordered_set<insn_info *> 
&marked)
 static std::unordered_set<insn_info *>
 rtl_ssa_dce_mark()
 {
-  std::unordered_set<set_info *> marked_sets{};
-
-
   std::unordered_set<insn_info *> marked{};
   // phi insn might have more that one phi node: 
gcc/gcc/testsuite/gcc.c-torture/execute/20000224-1.c
   std::unordered_set<phi_info *> marked_phi_nodes{};
@@ -1586,7 +1601,6 @@ rtl_ssa_dce_mark()
   auto_vec<set_info *> worklist_new{};
   for (auto && item : worklist) {
     insn_info * insn = item;
-    // std::cerr << "cp Current: " << insn->uid() << '\n';
     for (auto&& use : insn->uses()) {
       set_info* set = use->def();
       if (set) {
@@ -1621,6 +1635,8 @@ rtl_ssa_dce_mark()
 
     use_array uses = insn->uses();
     if (insn->is_phi()) {
+      // Each phi node has a unique uid, yeeey
+      // So, only one bitmap (with shift) in needed.
       phi_info* pi = as_a<phi_info *> (set);
       if (marked_phi_nodes.count(pi) > 0) {
         continue;
@@ -1710,6 +1726,41 @@ rtl_ssa_dce_sweep(std::unordered_set<insn_info *> marked)
   }
 }
 
+static void
+rtl_ssa_dce_transform_insns_to_debug() {
+  // TODO : bude nejspise zase treba rozdelit phi a ostatni insns
+  std::unordered_set<int> is_debug;
+
+  // chceme prochazet v post orderu, abychom nejdrive zpracovali zavislosti a 
pak az definici
+  // nelze jen menit instrukce, protoze musime informaci propagovat pres phi 
node
+  for (insn_info * insn : crtl->ssa->reverse_all_insns()) {
+    if (insn->is_debug_insn()) { // phi is never debug
+        // TODO : store info about this insn
+
+        is_debug.emplace(insn->uid());
+        continue;
+    }
+
+    if (insn->is_phi()) {
+      // TODO : special handling for phi_node required
+    }
+
+    bool is_debug = true;
+    for (def_info *def : insn->defs()) {
+      // TODO : how to cast this correctly? - clobber_info
+      if (def->mode() == access_kind::CLOBBER)
+        continue;
+      set_info* set = as_a<set_info*>(def);
+      for (use_info * use : set->all_uses()) {
+        auto iii = use->insn()->uid();
+      }
+    }
+
+    // TODO : projit vsechny set_infa a podivat se, zda jsou zavisloti jen 
debug
+    // Musime si dat pozor na phi - tam je treba se podivat na kontretni phi 
node
+  }
+}
+
 static void
 rtl_ssa_dce_init()
 {
@@ -1738,8 +1789,9 @@ static unsigned int
 rtl_ssa_dce()
 {
   rtl_ssa_dce_init();
-  // debug(crtl->ssa);
-  // std::cout << "\033[31m" << "Before rtl ssa dce pass" << "\033[0m" << "\n";
+  std::cout << "\033[31m" << "SSA FOR DCE PASS:" << "\033[0m" << "\n";
+  debug(crtl->ssa);
+  std::cout << "\033[31m" << "Before rtl ssa dce pass" << "\033[0m" << "\n";
 
   // for (rtx_insn * insn = get_insns (); insn != nullptr; insn = 
next_insn(insn)) {
     // debug(insn);
@@ -1756,7 +1808,7 @@ rtl_ssa_dce()
     // debug(insn);
   // }
   if (delete_trivially_dead_insns(get_insns (), max_reg_num ())) {
-    // std::cout << "\033[31m" << "Some insns deleted by 
delete_trivially_dead_insns" << "\033[0m" << "\n";
+    std::cout << "\033[31m" << "Some insns deleted by 
delete_trivially_dead_insns" << "\033[0m" << "\n";
     // for (rtx_insn * insn = get_insns (); insn != nullptr; insn = 
next_insn(insn)) {
       // debug(insn);
     // }

Reply via email to