https://gcc.gnu.org/g:914f83868c9d3641463aecf5d597512ee9b820be

commit 914f83868c9d3641463aecf5d597512ee9b820be
Author: Ondřej Machota <ondrejmach...@gmail.com>
Date:   Mon Mar 24 23:04:15 2025 +0100

    rtl-ssa-dce: improve prelive conditions

Diff:
---
 gcc/dce.cc | 41 ++++++++++++++++++++++++++++++++++++-----
 1 file changed, 36 insertions(+), 5 deletions(-)

diff --git a/gcc/dce.cc b/gcc/dce.cc
index a769c1387346..f227fc214e99 100644
--- a/gcc/dce.cc
+++ b/gcc/dce.cc
@@ -1394,6 +1394,18 @@ bool side_effects_with_mem (const_rtx x)
   return false;
 }
 
+bool is_ssa_prelive(const_rtx insn) {
+  switch (GET_CODE(insn)) {
+    case PREFETCH:
+    case UNSPEC:
+    case TRAP_IF:
+      return true;
+
+    default:
+      return side_effects_p(insn);
+  }
+}
+
 bool is_rtx_insn_prelive(rtx_insn *insn) {
   gcc_assert(insn != nullptr);
 
@@ -1401,6 +1413,7 @@ 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))
   {
+    // This handles jumps, debug_insns, call_insn, ...
     //std::cerr << "found jump instruction\n";
     //debug(insn);
     return true;
@@ -1437,6 +1450,8 @@ bool is_rtx_insn_prelive(rtx_insn *insn) {
   // 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);
   switch (GET_CODE(body)) {
     case CLOBBER: // gcc/gcc/testsuite/gcc.c-torture/compile/20000605-1.c
@@ -1449,12 +1464,12 @@ bool is_rtx_insn_prelive(rtx_insn *insn) {
 
     case PARALLEL:
       for (int i = XVECLEN (body, 0) - 1; i >= 0; i--)
-        if (!deletable_insn_p_1 (XVECEXP (body, 0, i)))
+        if (is_ssa_prelive (XVECEXP (body, 0, i)))
           return true;
-        return false;
+      return false;
 
     default:
-      return !deletable_insn_p_1 (body);
+      return is_ssa_prelive (body);
   }
 
   // See deletable_insn_p_1 for UNSPEC. TRAP_IF is caught by 
may_trap_or_fault_p
@@ -1514,6 +1529,8 @@ bool is_prelive(insn_info *insn)
           && def->regno() == REGNO (pic_offset_table_rtx)
           && REGNO (pic_offset_table_rtx) >= FIRST_PSEUDO_REGISTER))
       ) {
+        // TODO : set_noop_p?
+
       // std::cerr << "hard reg marked: " << def->regno() << "in " << 
insn->uid() << "\n";
       // debug(rtl);
       return true;
@@ -1722,17 +1739,31 @@ rtl_ssa_dce()
 {
   rtl_ssa_dce_init();
   // 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);
-  // }l
+    // debug(insn);
+  // }
+
+  // std::cout << "\033[31m" << "Before rtl ssa dce pass end" << "\033[0m" << 
"\n";
+
 
   std::unordered_set<insn_info *> marked = rtl_ssa_dce_mark();
   rtl_ssa_dce_sweep(marked);
   rtl_ssa_dce_done();
+  // std::cout << "\033[32m" << "After rtl ssa dce" << "\033[0m" << "\n";
+  // for (rtx_insn * insn = get_insns (); insn != nullptr; insn = 
next_insn(insn)) {
+    // 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";
+    // for (rtx_insn * insn = get_insns (); insn != nullptr; insn = 
next_insn(insn)) {
+      // debug(insn);
+    // }
     std::cerr << "\033[31m" << "rtl_ssa_dce did not delete everything :(" << 
"\033[0m" << "\n";
   }
 
+  // std::cout << "rtl ssa dce FINISH\n";
   return 0;
 }

Reply via email to