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);