[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