[BOLT] Delete unnecessary instructions (#189297)

This commit is contained in:
wangjue 2026-04-02 11:48:38 +08:00 committed by GitHub
parent 495e1a4257
commit 8c2feea2f7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 73 additions and 114 deletions

View file

@ -553,15 +553,12 @@ public:
.addReg(RegCnt);
}
InstructionListType createRegCmpJE(MCPhysReg RegNo, MCPhysReg RegTmp,
const MCSymbol *Target,
InstructionListType createRegCmpJE(MCPhysReg RegNo, const MCSymbol *Target,
MCContext *Ctx) const {
InstructionListType Insts;
Insts.emplace_back(
MCInstBuilder(RISCV::SUB).addReg(RegTmp).addReg(RegNo).addReg(RegNo));
Insts.emplace_back(MCInstBuilder(RISCV::BEQ)
.addReg(RegNo)
.addReg(RegTmp)
.addReg(RISCV::X0)
.addExpr(MCSymbolRefExpr::create(Target, *Ctx)));
return Insts;
}
@ -713,7 +710,7 @@ public:
Insts.emplace_back();
loadReg(Insts.back(), RISCV::X10, RISCV::X10, 0);
InstructionListType cmpJmp =
createRegCmpJE(RISCV::X10, RISCV::X11, IndCallHandler, Ctx);
createRegCmpJE(RISCV::X10, IndCallHandler, Ctx);
Insts.insert(Insts.end(), cmpJmp.begin(), cmpJmp.end());
Insts.emplace_back();
createStackPointerIncrement(Insts.back(), 16);

View file

@ -1727,10 +1727,8 @@ extern "C" __attribute((naked)) void __bolt_instr_indirect_call()
// clang-format off
__asm__ __volatile__(
SAVE_ALL
"addi sp, sp, 288\n"
"ld x10, 0(sp)\n"
"ld x11, 8(sp)\n"
"addi sp, sp, -288\n"
"ld x10, 288(sp)\n"
"ld x11, 296(sp)\n"
"jal x1, instrumentIndirectCall\n"
RESTORE_ALL
"ret\n"
@ -1763,10 +1761,8 @@ extern "C" __attribute((naked)) void __bolt_instr_indirect_tailcall()
#elif defined(__riscv)
// clang-format off
__asm__ __volatile__(SAVE_ALL
"addi sp, sp, 288\n"
"ld x10, 0(sp)\n"
"ld x11, 8(sp)\n"
"addi sp, sp, -288\n"
"ld x10, 288(sp)\n"
"ld x11, 296(sp)\n"
"jal x1, instrumentIndirectCall\n"
RESTORE_ALL
"ret\n"
@ -1806,8 +1802,7 @@ extern "C" __attribute((naked)) void __bolt_instr_start()
RESTORE_ALL
"setup_symbol:\n"
"auipc x5, %%pcrel_hi(__bolt_start_trampoline)\n"
"addi x5, x5, %%pcrel_lo(setup_symbol)\n"
"jr x5\n"
"jalr x0, %%pcrel_lo(setup_symbol)(x5)\n"
:::);
// clang-format on
#else
@ -1838,8 +1833,7 @@ extern "C" void __bolt_instr_fini() {
SAVE_ALL
"fini_symbol:\n"
"auipc x5, %%pcrel_hi(__bolt_fini_trampoline)\n"
"addi x5, x5, %%pcrel_lo(fini_symbol)\n"
"jalr x1, 0(x5)\n"
"jalr x1, %%pcrel_lo(fini_symbol)(x5)\n"
RESTORE_ALL
:::);
// clang-format on

View file

@ -3,104 +3,72 @@
// Save all registers while keeping 16B stack alignment
#define SAVE_ALL \
"addi sp, sp, -16\n" \
"sd x0, 0(sp)\n" \
"sd x1, 8(sp)\n" \
"addi sp, sp, -16\n" \
"sd x2, 0(sp)\n" \
"sd x3, 8(sp)\n" \
"addi sp, sp, -16\n" \
"sd x4, 0(sp)\n" \
"sd x5, 8(sp)\n" \
"addi sp, sp, -16\n" \
"sd x6, 0(sp)\n" \
"sd x7, 8(sp)\n" \
"addi sp, sp, -16\n" \
"sd x8, 0(sp)\n" \
"sd x9, 8(sp)\n" \
"addi sp, sp, -16\n" \
"sd x10, 0(sp)\n" \
"sd x11, 8(sp)\n" \
"addi sp, sp, -16\n" \
"sd x12, 0(sp)\n" \
"sd x13, 8(sp)\n" \
"addi sp, sp, -16\n" \
"sd x14, 0(sp)\n" \
"sd x15, 8(sp)\n" \
"addi sp, sp, -16\n" \
"sd x16, 0(sp)\n" \
"sd x17, 8(sp)\n" \
"addi sp, sp, -16\n" \
"sd x18, 0(sp)\n" \
"sd x19, 8(sp)\n" \
"addi sp, sp, -16\n" \
"sd x20, 0(sp)\n" \
"sd x21, 8(sp)\n" \
"addi sp, sp, -16\n" \
"sd x22, 0(sp)\n" \
"sd x23, 8(sp)\n" \
"addi sp, sp, -16\n" \
"sd x24, 0(sp)\n" \
"sd x25, 8(sp)\n" \
"addi sp, sp, -16\n" \
"sd x26, 0(sp)\n" \
"sd x27, 8(sp)\n" \
"addi sp, sp, -16\n" \
"sd x28, 0(sp)\n" \
"sd x29, 8(sp)\n" \
"addi sp, sp, -16\n" \
"sd x30, 0(sp)\n" \
"sd x31, 8(sp)\n"
"addi sp, sp, -256\n" \
"sd x1, 0(sp)\n" \
"sd x2, 8(sp)\n" \
"sd x3, 16(sp)\n" \
"sd x4, 24(sp)\n" \
"sd x5, 32(sp)\n" \
"sd x6, 40(sp)\n" \
"sd x7, 48(sp)\n" \
"sd x8, 56(sp)\n" \
"sd x9, 64(sp)\n" \
"sd x10, 72(sp)\n" \
"sd x11, 80(sp)\n" \
"sd x12, 88(sp)\n" \
"sd x13, 96(sp)\n" \
"sd x14, 104(sp)\n" \
"sd x15, 112(sp)\n" \
"sd x16, 120(sp)\n" \
"sd x17, 128(sp)\n" \
"sd x18, 136(sp)\n" \
"sd x19, 144(sp)\n" \
"sd x20, 152(sp)\n" \
"sd x21, 160(sp)\n" \
"sd x22, 168(sp)\n" \
"sd x23, 176(sp)\n" \
"sd x24, 184(sp)\n" \
"sd x25, 192(sp)\n" \
"sd x26, 200(sp)\n" \
"sd x27, 208(sp)\n" \
"sd x28, 216(sp)\n" \
"sd x29, 224(sp)\n" \
"sd x30, 232(sp)\n" \
"sd x31, 240(sp)\n"
// Mirrors SAVE_ALL
#define RESTORE_ALL \
"ld x30, 0(sp)\n" \
"ld x31, 8(sp)\n" \
"addi sp, sp, 16\n" \
"ld x28, 0(sp)\n" \
"ld x29, 8(sp)\n" \
"addi sp, sp, 16\n" \
"ld x26, 0(sp)\n" \
"ld x27, 8(sp)\n" \
"addi sp, sp, 16\n" \
"ld x24, 0(sp)\n" \
"ld x25, 8(sp)\n" \
"addi sp, sp, 16\n" \
"ld x22, 0(sp)\n" \
"ld x23, 8(sp)\n" \
"addi sp, sp, 16\n" \
"ld x20, 0(sp)\n" \
"ld x21, 8(sp)\n" \
"addi sp, sp, 16\n" \
"ld x18, 0(sp)\n" \
"ld x19, 8(sp)\n" \
"addi sp, sp, 16\n" \
"ld x16, 0(sp)\n" \
"ld x17, 8(sp)\n" \
"addi sp, sp, 16\n" \
"ld x14, 0(sp)\n" \
"ld x15, 8(sp)\n" \
"addi sp, sp, 16\n" \
"ld x12, 0(sp)\n" \
"ld x13, 8(sp)\n" \
"addi sp, sp, 16\n" \
"ld x10, 0(sp)\n" \
"ld x11, 8(sp)\n" \
"addi sp, sp, 16\n" \
"ld x8, 0(sp)\n" \
"ld x9, 8(sp)\n" \
"addi sp, sp, 16\n" \
"ld x6, 0(sp)\n" \
"ld x7, 8(sp)\n" \
"addi sp, sp, 16\n" \
"ld x4, 0(sp)\n" \
"ld x5, 8(sp)\n" \
"addi sp, sp, 16\n" \
"ld x2, 0(sp)\n" \
"ld x3, 8(sp)\n" \
"addi sp, sp, 16\n" \
"ld x0, 0(sp)\n" \
"ld x1, 8(sp)\n" \
"addi sp, sp, 16\n"
"ld x1, 0(sp)\n" \
"ld x2, 8(sp)\n" \
"ld x3, 16(sp)\n" \
"ld x4, 24(sp)\n" \
"ld x5, 32(sp)\n" \
"ld x6, 40(sp)\n" \
"ld x7, 48(sp)\n" \
"ld x8, 56(sp)\n" \
"ld x9, 64(sp)\n" \
"ld x10, 72(sp)\n" \
"ld x11, 80(sp)\n" \
"ld x12, 88(sp)\n" \
"ld x13, 96(sp)\n" \
"ld x14, 104(sp)\n" \
"ld x15, 112(sp)\n" \
"ld x16, 120(sp)\n" \
"ld x17, 128(sp)\n" \
"ld x18, 136(sp)\n" \
"ld x19, 144(sp)\n" \
"ld x20, 152(sp)\n" \
"ld x21, 160(sp)\n" \
"ld x22, 168(sp)\n" \
"ld x23, 176(sp)\n" \
"ld x24, 184(sp)\n" \
"ld x25, 192(sp)\n" \
"ld x26, 200(sp)\n" \
"ld x27, 208(sp)\n" \
"ld x28, 216(sp)\n" \
"ld x29, 224(sp)\n" \
"ld x30, 232(sp)\n" \
"ld x31, 240(sp)\n" \
"addi sp, sp, 256\n"
// Anonymous namespace covering everything but our library entry point
namespace {