[llvm] [BOLT][RISCV] Fix the inaccurate profile data check (PR #189338)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 9 03:51:33 PDT 2026
https://github.com/WangJee updated https://github.com/llvm/llvm-project/pull/189338
>From 01730198a2d55e24e784a311cca8f142016fec31 Mon Sep 17 00:00:00 2001
From: "wangjue.wangjue" <wangjue.wangjue at alibaba-inc.com>
Date: Mon, 30 Mar 2026 07:31:11 +0000
Subject: [PATCH] Fix the inaccurate profile data check
---
bolt/lib/Passes/FixRISCVCallsPass.cpp | 18 ++++++------------
bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp | 8 ++++++++
bolt/test/RISCV/call-annotations.s | 4 ++--
bolt/test/RISCV/relax.s | 4 +++-
4 files changed, 19 insertions(+), 15 deletions(-)
diff --git a/bolt/lib/Passes/FixRISCVCallsPass.cpp b/bolt/lib/Passes/FixRISCVCallsPass.cpp
index 9011ef303a80e..6b73bd6854c9d 100644
--- a/bolt/lib/Passes/FixRISCVCallsPass.cpp
+++ b/bolt/lib/Passes/FixRISCVCallsPass.cpp
@@ -52,22 +52,16 @@ void FixRISCVCallsPass::runOnFunction(BinaryFunction &BF) {
MCInst OldCall = *NextII;
auto L = BC.scopeLock();
+ MIB->createNoop(*II);
+
if (MIB->isTailCall(*NextII))
- MIB->createTailCall(*II, Target, Ctx);
+ MIB->createTailCall(*NextII, Target, Ctx);
else
- MIB->createCall(*II, Target, Ctx);
-
- MIB->moveAnnotations(std::move(OldCall), *II);
+ MIB->createCall(*NextII, Target, Ctx);
- // The original offset was set on the jalr of the auipc+jalr pair. Since
- // the whole pair is replaced by a call, adjust the offset by -4 (the
- // size of a auipc).
- if (std::optional<uint32_t> Offset = MIB->getOffset(*II)) {
- assert(*Offset >= 4 && "Illegal jalr offset");
- MIB->setOffset(*II, *Offset - 4);
- }
+ MIB->moveAnnotations(std::move(OldCall), *NextII);
- II = BB.eraseInstruction(NextII);
+ II = std::next(NextII);
continue;
}
diff --git a/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp b/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp
index 957768e5aaa29..325a625a2b403 100644
--- a/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp
+++ b/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp
@@ -571,6 +571,14 @@ class RISCVMCPlusBuilder : public MCPlusBuilder {
Inst.setOpcode(RISCV::EBREAK);
}
+ void createNoop(MCInst &Inst) const override {
+ Inst.clear();
+ Inst = MCInstBuilder(RISCV::ADDI)
+ .addReg(RISCV::X0)
+ .addReg(RISCV::X0)
+ .addImm(0);
+ }
+
void createShortJmp(InstructionListType &Seq, const MCSymbol *Target,
MCContext *Ctx, bool IsTailCall) override {
// The sequence of instructions we create here is the following:
diff --git a/bolt/test/RISCV/call-annotations.s b/bolt/test/RISCV/call-annotations.s
index f876544e214ca..19b9a916651a1 100644
--- a/bolt/test/RISCV/call-annotations.s
+++ b/bolt/test/RISCV/call-annotations.s
@@ -28,12 +28,12 @@ f:
// CHECK: jr a0 # TAILCALL # Offset: 0
// CHECK-LABEL: Binary Function "_start" after fix-riscv-calls {
-// CHECK: call f # Offset: 0
+// CHECK: call f # Offset: 4
// CHECK-NEXT: call f # Offset: 8
// CHECK-NEXT: tail f # TAILCALL # Offset: 12
// CHECK-LABEL: Binary Function "long_tail" after fix-riscv-calls {
-// CHECK: tail f # TAILCALL # Offset: 4
+// CHECK: tail f # TAILCALL # Offset: 8
// CHECK-LABEL: Binary Function "compressed_tail" after fix-riscv-calls {
// CHECK: jr a0 # TAILCALL # Offset: 0
diff --git a/bolt/test/RISCV/relax.s b/bolt/test/RISCV/relax.s
index 74f049b8f8dd9..41124751f38e8 100644
--- a/bolt/test/RISCV/relax.s
+++ b/bolt/test/RISCV/relax.s
@@ -12,13 +12,15 @@
// CHECK: Binary Function "_start" after fix-riscv-calls {
// CHECK: call near_f
+// CHECK-NEXT: nop
// CHECK-NEXT: call far_f
// CHECK-NEXT: tail near_f
// OBJDUMP: 0000000000600000 <_start>:
// OBJDUMP-NEXT: jal 0x600040 <near_f>
+// OBJDUMP-NEXT: nop
// OBJDUMP-NEXT: auipc ra, 0x200
-// OBJDUMP-NEXT: jalr 0x7c(ra)
+// OBJDUMP-NEXT: jalr 0x78(ra)
// OBJDUMP-NEXT: j 0x600040 <near_f>
// OBJDUMP: 0000000000600040 <near_f>:
// OBJDUMP: 0000000000800080 <far_f>:
More information about the llvm-commits
mailing list