https://gcc.gnu.org/g:5e62c115654300d61bb880a9c054eac4eedba147
commit 5e62c115654300d61bb880a9c054eac4eedba147 Author: Ondřej Machota <ondrejmach...@gmail.com> Date: Tue Mar 11 11:03:56 2025 +0100 rtl-ssa: dce fix marking Diff: --- gcc/dce.cc | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 67 insertions(+), 10 deletions(-) diff --git a/gcc/dce.cc b/gcc/dce.cc index 21a7f23507af..d1558f2a9798 100644 --- a/gcc/dce.cc +++ b/gcc/dce.cc @@ -1585,6 +1585,57 @@ rtl_ssa_dce_mark() { std::unordered_set<insn_info *> marked{}; auto worklist = rtl_ssa_dce_prelive(marked); + auto_vec<set_info *> worklist_new{}; + for (auto && item : worklist) { + insn_info * insn = item; + for (auto&& use : insn->uses()) { + set_info* set = use->def(); + if (set) { + worklist_new.safe_push(set); + } + } + } + + while (!worklist_new.is_empty()) { + set_info* set = worklist_new.pop(); + insn_info* insn = set->insn(); + if (!insn) { + continue; + } + + if (!(marked.count(insn) > 0)) + { + marked.emplace(insn); + } + + // use_array uses = insn->uses(); + if (insn->is_phi()) { + phi_info* pi = as_a<phi_info *> (set); + + for (auto && input : pi->inputs()) { + use_info* use = input; + set_info* parent_set = use->def(); + if (!parent_set) { // Clobber... + continue; + } + + worklist_new.safe_push(parent_set); + } + } else { + if (dump_file) + fprintf(dump_file, " Adding insn %d to worklist - mark\n", insn->uid()); + + for (auto && use__ : insn->uses()) { + use_info * use = use__; + set_info* parent_set = use->def(); + if (!parent_set) { + continue; + } + + worklist_new.safe_push(parent_set); + } + } + } if (dump_file) fprintf(dump_file, "Finished inherently live, marking parents\n"); @@ -1623,17 +1674,23 @@ rtl_ssa_dce_mark() // debug(use); // std::cerr << '\n'; - - insn_info *parent_insn = use->def()->insn(); - if (parent_insn->is_phi()) { // this is weird... - // debug(use->def()); - phi_info * pi = as_a<phi_info *> (use->def()); - // std::cerr << "phi inputs: " << pi->num_inputs() << '\n'; - for (auto&& input: pi->inputs()) { - use_info* phi_use = input; - std::cerr << "Via phi insn: " << phi_use->def()->insn()->uid() << '\n'; - } + set_info* set = use->def(); + if (!set) { + continue; + } + insn_info *parent_insn = set->insn(); + if (!parent_insn) { + continue; } + // if (parent_insn->is_phi()) { // this is weird... + // // debug(use->def()); + // phi_info * pi = as_a<phi_info *> (use->def()); + // // std::cerr << "phi inputs: " << pi->num_inputs() << '\n'; + // for (auto&& input: pi->inputs()) { + // use_info* phi_use = input; + // std::cerr << "Via phi insn: " << phi_use->def()->insn()->uid() << '\n'; + // } + // } int parent_insn_uid = parent_insn->uid(); // propage that some instruction in chain is live from bottom to top if (dump_file)