[llvm] [bolt][riscv] Fix conditional tail call (PR #160042)

via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 22 00:48:40 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-bolt

Author: Zhijin Zeng (zengdage)

<details>
<summary>Changes</summary>

When using bolt to optimize the conditional tail call, such an error message `unsupported tail call opcode` is encountered. To resolve this issue, we need to enhance convertJmpToTailCall with support for conditional branches, and extend getSymbolRefOperandNum to handle PseudoTAIL.

For example, it will change the following code
```
beq a0, a6, func1
beq a0, a5, func2

ret
```
to
```
beq a0, a6, .L1
beq a0, a6, .L2

.L1
tail func1

.L2
tail func2
```

---
Full diff: https://github.com/llvm/llvm-project/pull/160042.diff


1 Files Affected:

- (modified) bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp (+18) 


``````````diff
diff --git a/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp b/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp
index 10b4913b6ab7f..003b2c7835f2a 100644
--- a/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp
+++ b/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp
@@ -213,12 +213,29 @@ class RISCVMCPlusBuilder : public MCPlusBuilder {
     case RISCV::C_J:
     case RISCV::C_JR:
       break;
+    case RISCV::BEQ:
+    case RISCV::BNE:
+    case RISCV::BGE:
+    case RISCV::BGEU:
+    case RISCV::BLT:
+    case RISCV::BLTU:
+    case RISCV::C_BEQZ:
+    case RISCV::C_BNEZ:
+      break;
     }
 
     setTailCall(Inst);
     return true;
   }
 
+  bool convertTailCallToJmp(MCInst &Inst) override {
+    removeAnnotation(Inst, MCPlus::MCAnnotation::kTailCall);
+    clearOffset(Inst);
+    if (getConditionalTailCall(Inst))
+      unsetConditionalTailCall(Inst);
+    return true;
+  }
+
   void createReturn(MCInst &Inst) const override {
     // TODO "c.jr ra" when RVC is enabled
     Inst.setOpcode(RISCV::JALR);
@@ -320,6 +337,7 @@ class RISCVMCPlusBuilder : public MCPlusBuilder {
     default:
       return false;
     case RISCV::C_J:
+    case RISCV::PseudoTAIL:
       OpNum = 0;
       return true;
     case RISCV::AUIPC:

``````````

</details>


https://github.com/llvm/llvm-project/pull/160042


More information about the llvm-commits mailing list