[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