https://gcc.gnu.org/g:66297a27965b6bd6c04a85491e7270d33181a5c9
commit 66297a27965b6bd6c04a85491e7270d33181a5c9 Author: Ondřej Machota <ondrejmach...@gmail.com> Date: Fri Apr 18 15:55:39 2025 +0200 rtl-ssa-dce: propagate dead phis Diff: --- gcc/dce.cc | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/gcc/dce.cc b/gcc/dce.cc index 630906fb1ec6..c626d19f0747 100644 --- a/gcc/dce.cc +++ b/gcc/dce.cc @@ -1511,7 +1511,7 @@ rtl_ssa_dce_mark(std::unordered_set<phi_info *> &marked_phis) if (marked_phis.count(pi) > 0) continue; - marked_phis.emplace(pi); + marked_phis.emplace(pi); uses = pi->inputs(); } @@ -1566,6 +1566,45 @@ rtl_ssa_dce_sweep(std::unordered_set<insn_info *> marked) fprintf(dump_file, "DCE: finish sweep phase\n"); } +static void propagate_dead_phis(std::unordered_set<insn_info *> &marked, std::unordered_set<phi_info *> &marked_phis) { + auto_vec<set_info *> worklist; + // TODO : add visited to speedup following section + for (ebb_info *ebb : crtl->ssa->ebbs()) { + for (phi_info *phi : ebb->phis()) { + if (marked_phis.count(phi) > 0) + continue; + + worklist.safe_push(phi); + } + } + + // suppose that debug insns are marked - non marked will be removed later + while (!worklist.is_empty ()) { + set_info *set = worklist.pop (); + insn_info *insn = set->insn (); + + if (insn->is_debug_insn ()) { + marked.erase (insn); + // debug instructions dont have chains + continue; + } + + for (use_info *use : set->all_uses()) { + if (use->is_in_phi()) { + worklist.emplace (use->phi ()); + } else { + gcc_assert(use->is_in_any_insn ()); + for (def_info *def : use->insn()->defs()) { + if (def->kind() != access_kind::SET) + continue; + + worklist.emplace(static_cast<set_info *>(def)); + } + } + } + } +} + // Clear debug_insn uses and set gen_rtx_UNKNOWN_VAR_LOC static void reset_debug_insn_uses(insn_info * insn) { gcc_assert(insn->is_debug_insn());