https://gcc.gnu.org/g:ddda72f4a2053ebae4301980db947ab1a5fa33d0
commit ddda72f4a2053ebae4301980db947ab1a5fa33d0 Author: Ondřej Machota <ondrejmach...@gmail.com> Date: Thu Apr 24 17:50:37 2025 +0200 rtl-ssa-dce: fix missing set bp Diff: --- gcc/dce.cc | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/gcc/dce.cc b/gcc/dce.cc index c83324d3aa15..02da64c7669a 100644 --- a/gcc/dce.cc +++ b/gcc/dce.cc @@ -1733,7 +1733,7 @@ is_rtx_insn_prelive(rtx_insn *insn) { rtx body = PATTERN(insn); switch (GET_CODE(body)) { // Clobbers are handled inside is_prelive - what about parallel? - // case CLOBBER: // gcc/gcc/testsuite/gcc.c-torture/compile/20000605-1.c + case CLOBBER: // gcc/gcc/testsuite/gcc.c-torture/compile/20000605-1.c case USE: case VAR_LOCATION: return true; @@ -1767,13 +1767,20 @@ is_prelive(insn_info *insn) return true; gcc_assert(def->is_reg()); + // if (def->regno() == HARD_FRAME_POINTER_REGNUM) + // std::cout << "set frame pointer (bp): " << def->regno() << " in: " << def->insn()->uid() << '\n'; + + if (frame_pointer_needed && def->regno() == HARD_FRAME_POINTER_REGNUM) { + // std::cerr << "bp marked as prelive\n"; + return true; + } /* gcc.c-torture/execute/20000503-1.c - flags register is unused. Not all hard registers should be marked... */ /* this ignores clobbers, which is probably fine */ if (def->kind() == access_kind::CLOBBER) - return true; + continue; gcc_assert (def->kind() == access_kind::SET); @@ -2092,6 +2099,16 @@ rtl_ssa_dce_fn() // debug(crtl->ssa); if (dump_file) dump(dump_file, crtl->ssa); + // std::cout << '\n' << function_name(cfun) << '\n'; + // std::cout << "HARD_FRAME_POINTER_IS_ARG_POINTER: " << HARD_FRAME_POINTER_IS_ARG_POINTER << '\n'; + // std::cout << "HARD_FRAME_POINTER_IS_FRAME_POINTER: " << HARD_FRAME_POINTER_IS_FRAME_POINTER << '\n'; + // std::cout << "HARD_FRAME_POINTER_REGNUM: " << HARD_FRAME_POINTER_REGNUM << '\n'; + // std::cout << "FRAME_POINTER_REGNUM: " << FRAME_POINTER_REGNUM << '\n'; + // std::cout << "fixed_regs[HARD_FRAME_POINTER_REGNUM]: " << (fixed_regs[HARD_FRAME_POINTER_REGNUM] == 1) << '\n'; + // std::cout << "fixed_regs[FRAME_POINTER_REGNUM]: " << (fixed_regs[FRAME_POINTER_REGNUM] == 1) << '\n'; + // std::cout << "global_regs[HARD_FRAME_POINTER_REGNUM]: " << (global_regs[HARD_FRAME_POINTER_REGNUM] == 1) << '\n'; + // std::cout << "global_regs[FRAME_POINTER_REGNUM]: " << (global_regs[FRAME_POINTER_REGNUM] == 1) << '\n'; + // std::cout << "frame_pointer_needed: " << frame_pointer_needed << '\n'; std::unordered_set<insn_info *> marked; std::unordered_set<phi_info *> marked_phis; rtl_ssa_dce_mark(marked, marked_phis);