[llvm-branch-commits] [RISCV] Port RISCVIndirectBranchTracking to the NewPM (PR #235186)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Oct 23 19:34:47 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-risc-v
Author: Aiden Grossman (boomanaiden154)
<details>
<summary>Changes</summary>
Standard NewPM pass porting. Also mark that we preserve the CFG in the
LegacyPM.
---
Full diff: https://github.com/llvm/llvm-project/pull/235186.diff
4 Files Affected:
- (modified) llvm/lib/Target/RISCV/RISCV.h (+8-2)
- (modified) llvm/lib/Target/RISCV/RISCVIndirectBranchTracking.cpp (+31-10)
- (modified) llvm/lib/Target/RISCV/RISCVPassRegistry.def (+2)
- (modified) llvm/lib/Target/RISCV/RISCVTargetMachine.cpp (+2-2)
``````````diff
diff --git a/llvm/lib/Target/RISCV/RISCV.h b/llvm/lib/Target/RISCV/RISCV.h
index 57446b474d696..51a2521921a9f 100644
--- a/llvm/lib/Target/RISCV/RISCV.h
+++ b/llvm/lib/Target/RISCV/RISCV.h
@@ -51,8 +51,14 @@ class RISCVDeadRegisterDefinitionsPass
FunctionPass *createRISCVDeadRegisterDefinitionsLegacyPass();
void initializeRISCVDeadRegisterDefinitionsLegacyPass(PassRegistry &);
-FunctionPass *createRISCVIndirectBranchTrackingPass();
-void initializeRISCVIndirectBranchTrackingPass(PassRegistry &);
+class RISCVIndirectBranchTrackingPass
+ : public RequiredPassInfoMixin<RISCVIndirectBranchTrackingPass> {
+public:
+ PreservedAnalyses run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM);
+};
+FunctionPass *createRISCVIndirectBranchTrackingLegacyPass();
+void initializeRISCVIndirectBranchTrackingLegacyPass(PassRegistry &);
FunctionPass *createRISCVLandingPadSetupPass();
void initializeRISCVLandingPadSetupPass(PassRegistry &);
diff --git a/llvm/lib/Target/RISCV/RISCVIndirectBranchTracking.cpp b/llvm/lib/Target/RISCV/RISCVIndirectBranchTracking.cpp
index a97b2699d0bc4..60fa6d6a06e16 100644
--- a/llvm/lib/Target/RISCV/RISCVIndirectBranchTracking.cpp
+++ b/llvm/lib/Target/RISCV/RISCVIndirectBranchTracking.cpp
@@ -18,9 +18,13 @@
#include "RISCVSubtarget.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
+#include "llvm/CodeGen/MachineFunctionAnalysisManager.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
+#include "llvm/CodeGen/MachinePassManager.h"
+#include "llvm/IR/Analysis.h"
+#include "llvm/Pass.h"
#define DEBUG_TYPE "riscv-indirect-branch-tracking"
#define PASS_NAME "RISC-V Indirect Branch Tracking"
@@ -28,28 +32,30 @@
using namespace llvm;
namespace {
-class RISCVIndirectBranchTracking : public MachineFunctionPass {
+class RISCVIndirectBranchTrackingLegacy : public MachineFunctionPass {
public:
static char ID;
- RISCVIndirectBranchTracking() : MachineFunctionPass(ID) {}
+ RISCVIndirectBranchTrackingLegacy() : MachineFunctionPass(ID) {}
StringRef getPassName() const override { return PASS_NAME; }
- bool runOnMachineFunction(MachineFunction &MF) override;
+ void getAnalysisUsage(AnalysisUsage &AU) const override {
+ AU.setPreservesCFG();
+ MachineFunctionPass::getAnalysisUsage(AU);
+ }
-private:
- const Align LpadAlign = Align(4);
+ bool runOnMachineFunction(MachineFunction &MF) override;
};
} // end anonymous namespace
-INITIALIZE_PASS(RISCVIndirectBranchTracking, DEBUG_TYPE, PASS_NAME, false,
+INITIALIZE_PASS(RISCVIndirectBranchTrackingLegacy, DEBUG_TYPE, PASS_NAME, false,
false)
-char RISCVIndirectBranchTracking::ID = 0;
+char RISCVIndirectBranchTrackingLegacy::ID = 0;
-FunctionPass *llvm::createRISCVIndirectBranchTrackingPass() {
- return new RISCVIndirectBranchTracking();
+FunctionPass *llvm::createRISCVIndirectBranchTrackingLegacyPass() {
+ return new RISCVIndirectBranchTrackingLegacy();
}
static void
@@ -61,9 +67,10 @@ emitLpad(MachineBasicBlock &MBB, const RISCVInstrInfo *TII, uint32_t Label,
.addImm(Label);
}
-bool RISCVIndirectBranchTracking::runOnMachineFunction(MachineFunction &MF) {
+static bool runIndirectBranchTracking(MachineFunction &MF) {
const auto &Subtarget = MF.getSubtarget<RISCVSubtarget>();
const RISCVInstrInfo *TII = Subtarget.getInstrInfo();
+ const Align LpadAlign = Align(4);
if (!MF.getInfo<RISCVMachineFunctionInfo>()->hasCFProtectionBranch())
return false;
@@ -103,3 +110,17 @@ bool RISCVIndirectBranchTracking::runOnMachineFunction(MachineFunction &MF) {
return Changed;
}
+
+bool RISCVIndirectBranchTrackingLegacy::runOnMachineFunction(
+ MachineFunction &MF) {
+ return runIndirectBranchTracking(MF);
+}
+
+PreservedAnalyses
+RISCVIndirectBranchTrackingPass::run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM) {
+ return runIndirectBranchTracking(MF)
+ ? getMachineFunctionPassPreservedAnalyses()
+ .preserveSet<CFGAnalyses>()
+ : PreservedAnalyses::all();
+}
diff --git a/llvm/lib/Target/RISCV/RISCVPassRegistry.def b/llvm/lib/Target/RISCV/RISCVPassRegistry.def
index 6c40ce1e92dc4..b30cbb7bbe9a6 100644
--- a/llvm/lib/Target/RISCV/RISCVPassRegistry.def
+++ b/llvm/lib/Target/RISCV/RISCVPassRegistry.def
@@ -43,6 +43,8 @@ MACHINE_FUNCTION_PASS("riscv-expand-pseudo-pre-emit",
MACHINE_FUNCTION_PASS("riscv-expand-pseudo-pre-ra",
RISCVExpandPseudoPreRAPass())
MACHINE_FUNCTION_PASS("riscv-fold-mem-offset", RISCVFoldMemOffsetPass())
+MACHINE_FUNCTION_PASS("riscv-indirect-branch-tracking",
+ RISCVIndirectBranchTrackingPass())
MACHINE_FUNCTION_PASS("riscv-isel", RISCVISelDAGToDAGPass(*this, getOptLevel()))
MACHINE_FUNCTION_PASS("riscv-opt-w-instrs", RISCVOptWInstrsPass())
MACHINE_FUNCTION_PASS("riscv-vector-peephole", RISCVVectorPeepholePass())
diff --git a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
index ea61f9421a8ec..41ed1be37f351 100644
--- a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
+++ b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
@@ -75,7 +75,7 @@ extern "C" LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVTarget() {
initializeRISCVDAGToDAGISelLegacyPass(*PR);
initializeRISCVMoveMergePass(*PR);
initializeRISCVPushPopOptPass(*PR);
- initializeRISCVIndirectBranchTrackingPass(*PR);
+ initializeRISCVIndirectBranchTrackingLegacyPass(*PR);
initializeRISCVLoadStoreOptPass(*PR);
initializeRISCVPreAllocZilsdOptPass(*PR);
initializeRISCVExpandPseudoAtomicsLegacyPass(*PR);
@@ -508,7 +508,7 @@ void RISCVPassConfig::addPreEmitPass() {
// The IndirectBranchTrackingPass inserts lpad and could have changed the
// basic block alignment. It must be done before Branch Relaxation to
// prevent the adjusted offset exceeding the branch range.
- addPass(createRISCVIndirectBranchTrackingPass());
+ addPass(createRISCVIndirectBranchTrackingLegacyPass());
addPass(&BranchRelaxationPassID);
addPass(createRISCVMakeCompressibleOptPass());
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/235186
More information about the llvm-branch-commits
mailing list