[llvm] 4b31f1e - [NewPM] Port for AArch64A57FPLoadBalancing (#190652)

via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 7 13:58:28 PDT 2026


Author: Leonardo Román Carrillo
Date: 2026-04-07T20:58:23Z
New Revision: 4b31f1ee830820e5a3aa35779069f2e25c38d267

URL: https://github.com/llvm/llvm-project/commit/4b31f1ee830820e5a3aa35779069f2e25c38d267
DIFF: https://github.com/llvm/llvm-project/commit/4b31f1ee830820e5a3aa35779069f2e25c38d267.diff

LOG: [NewPM] Port for AArch64A57FPLoadBalancing (#190652)

Added: 
    

Modified: 
    llvm/lib/Target/AArch64/AArch64.h
    llvm/lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp
    llvm/lib/Target/AArch64/AArch64PassRegistry.def
    llvm/lib/Target/AArch64/AArch64TargetMachine.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/AArch64/AArch64.h b/llvm/lib/Target/AArch64/AArch64.h
index 8a7c8680da63c..617ca3d01c039 100644
--- a/llvm/lib/Target/AArch64/AArch64.h
+++ b/llvm/lib/Target/AArch64/AArch64.h
@@ -54,7 +54,7 @@ ModulePass *createAArch64LowerHomogeneousPrologEpilogPass();
 FunctionPass *createAArch64SIMDInstrOptPass();
 ModulePass *createAArch64PromoteConstantPass();
 FunctionPass *createAArch64ConditionOptimizerLegacyPass();
-FunctionPass *createAArch64A57FPLoadBalancing();
+FunctionPass *createAArch64A57FPLoadBalancingLegacyPass();
 FunctionPass *createAArch64A53Fix835769LegacyPass();
 FunctionPass *createFalkorHWPFFixPass();
 FunctionPass *createFalkorMarkStridedAccessesPass();
@@ -111,7 +111,7 @@ FunctionPass *createAArch64StackTaggingPreRAPass();
 ModulePass *createAArch64Arm64ECCallLoweringPass();
 
 void initializeAArch64A53Fix835769LegacyPass(PassRegistry &);
-void initializeAArch64A57FPLoadBalancingPass(PassRegistry&);
+void initializeAArch64A57FPLoadBalancingLegacyPass(PassRegistry &);
 void initializeAArch64AdvSIMDScalarLegacyPass(PassRegistry &);
 void initializeAArch64AsmPrinterPass(PassRegistry &);
 void initializeAArch64PointerAuthLegacyPass(PassRegistry &);
@@ -153,6 +153,13 @@ void initializeAArch64SRLTDefineSuperRegsPass(PassRegistry &);
 void initializeSVEIntrinsicOptsPass(PassRegistry &);
 void initializeAArch64Arm64ECCallLoweringPass(PassRegistry &);
 
+class AArch64A57FPLoadBalancingPass
+    : public PassInfoMixin<AArch64A57FPLoadBalancingPass> {
+public:
+  PreservedAnalyses run(MachineFunction &MF,
+                        MachineFunctionAnalysisManager &MFAM);
+};
+
 class AArch64LoadStoreOptPass : public PassInfoMixin<AArch64LoadStoreOptPass> {
 public:
   PreservedAnalyses run(MachineFunction &MF,

diff  --git a/llvm/lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp b/llvm/lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp
index b816f11508bed..b39f6056d751c 100644
--- a/llvm/lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp
+++ b/llvm/lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp
@@ -105,16 +105,35 @@ static const char *ColorNames[2] = { "Even", "Odd" };
 
 class Chain;
 
-class AArch64A57FPLoadBalancing : public MachineFunctionPass {
+class AArch64A57FPLoadBalancingImpl {
+public:
+  bool run(MachineFunction &MF);
+
+private:
   MachineRegisterInfo *MRI;
   const TargetRegisterInfo *TRI;
   RegisterClassInfo RCI;
 
+  bool runOnBasicBlock(MachineBasicBlock &MBB);
+  bool colorChainSet(std::vector<Chain *> GV, MachineBasicBlock &MBB,
+                     int &Balance);
+  bool colorChain(Chain *G, Color C, MachineBasicBlock &MBB);
+  int scavengeRegister(Chain *G, Color C, MachineBasicBlock &MBB);
+  void scanInstruction(MachineInstr *MI, unsigned Idx,
+                       std::map<unsigned, Chain *> &Active,
+                       std::vector<std::unique_ptr<Chain>> &AllChains);
+  void maybeKillChain(MachineOperand &MO, unsigned Idx,
+                      std::map<unsigned, Chain *> &RegChains);
+  Color getColor(unsigned Register);
+  Chain *getAndEraseNext(Color PreferredColor, std::vector<Chain *> &L);
+};
+
+class AArch64A57FPLoadBalancingLegacy : public MachineFunctionPass {
 public:
   static char ID;
-  explicit AArch64A57FPLoadBalancing() : MachineFunctionPass(ID) {}
+  explicit AArch64A57FPLoadBalancingLegacy() : MachineFunctionPass(ID) {}
 
-  bool runOnMachineFunction(MachineFunction &F) override;
+  bool runOnMachineFunction(MachineFunction &MF) override;
 
   MachineFunctionProperties getRequiredProperties() const override {
     return MachineFunctionProperties().setNoVRegs();
@@ -128,28 +147,14 @@ class AArch64A57FPLoadBalancing : public MachineFunctionPass {
     AU.setPreservesCFG();
     MachineFunctionPass::getAnalysisUsage(AU);
   }
-
-private:
-  bool runOnBasicBlock(MachineBasicBlock &MBB);
-  bool colorChainSet(std::vector<Chain*> GV, MachineBasicBlock &MBB,
-                     int &Balance);
-  bool colorChain(Chain *G, Color C, MachineBasicBlock &MBB);
-  int scavengeRegister(Chain *G, Color C, MachineBasicBlock &MBB);
-  void scanInstruction(MachineInstr *MI, unsigned Idx,
-                       std::map<unsigned, Chain*> &Active,
-                       std::vector<std::unique_ptr<Chain>> &AllChains);
-  void maybeKillChain(MachineOperand &MO, unsigned Idx,
-                      std::map<unsigned, Chain*> &RegChains);
-  Color getColor(unsigned Register);
-  Chain *getAndEraseNext(Color PreferredColor, std::vector<Chain*> &L);
 };
 }
 
-char AArch64A57FPLoadBalancing::ID = 0;
+char AArch64A57FPLoadBalancingLegacy::ID = 0;
 
-INITIALIZE_PASS_BEGIN(AArch64A57FPLoadBalancing, DEBUG_TYPE,
+INITIALIZE_PASS_BEGIN(AArch64A57FPLoadBalancingLegacy, DEBUG_TYPE,
                       "AArch64 A57 FP Load-Balancing", false, false)
-INITIALIZE_PASS_END(AArch64A57FPLoadBalancing, DEBUG_TYPE,
+INITIALIZE_PASS_END(AArch64A57FPLoadBalancingLegacy, DEBUG_TYPE,
                     "AArch64 A57 FP Load-Balancing", false, false)
 
 namespace {
@@ -302,28 +307,43 @@ class Chain {
 
 //===----------------------------------------------------------------------===//
 
-bool AArch64A57FPLoadBalancing::runOnMachineFunction(MachineFunction &F) {
-  if (skipFunction(F.getFunction()))
-    return false;
-
-  if (!F.getSubtarget<AArch64Subtarget>().balanceFPOps())
+bool AArch64A57FPLoadBalancingImpl::run(MachineFunction &MF) {
+  if (!MF.getSubtarget<AArch64Subtarget>().balanceFPOps())
     return false;
 
   bool Changed = false;
   LLVM_DEBUG(dbgs() << "***** AArch64A57FPLoadBalancing *****\n");
 
-  MRI = &F.getRegInfo();
-  TRI = F.getRegInfo().getTargetRegisterInfo();
-  RCI.runOnMachineFunction(F);
+  MRI = &MF.getRegInfo();
+  TRI = MF.getRegInfo().getTargetRegisterInfo();
+  RCI.runOnMachineFunction(MF);
 
-  for (auto &MBB : F) {
+  for (auto &MBB : MF) {
     Changed |= runOnBasicBlock(MBB);
   }
 
   return Changed;
 }
 
-bool AArch64A57FPLoadBalancing::runOnBasicBlock(MachineBasicBlock &MBB) {
+bool AArch64A57FPLoadBalancingLegacy::runOnMachineFunction(
+    MachineFunction &MF) {
+  if (skipFunction(MF.getFunction()))
+    return false;
+  return AArch64A57FPLoadBalancingImpl().run(MF);
+}
+
+PreservedAnalyses
+AArch64A57FPLoadBalancingPass::run(MachineFunction &MF,
+                                   MachineFunctionAnalysisManager &MFAM) {
+  if (AArch64A57FPLoadBalancingImpl().run(MF)) {
+    PreservedAnalyses PA = getMachineFunctionPassPreservedAnalyses();
+    PA.preserveSet<CFGAnalyses>();
+    return PA;
+  }
+  return PreservedAnalyses::all();
+}
+
+bool AArch64A57FPLoadBalancingImpl::runOnBasicBlock(MachineBasicBlock &MBB) {
   bool Changed = false;
   LLVM_DEBUG(dbgs() << "Running on MBB: " << MBB
                     << " - scanning instructions...\n");
@@ -398,8 +418,8 @@ bool AArch64A57FPLoadBalancing::runOnBasicBlock(MachineBasicBlock &MBB) {
   return Changed;
 }
 
-Chain *AArch64A57FPLoadBalancing::getAndEraseNext(Color PreferredColor,
-                                                  std::vector<Chain*> &L) {
+Chain *AArch64A57FPLoadBalancingImpl::getAndEraseNext(Color PreferredColor,
+                                                      std::vector<Chain *> &L) {
   if (L.empty())
     return nullptr;
 
@@ -434,9 +454,9 @@ Chain *AArch64A57FPLoadBalancing::getAndEraseNext(Color PreferredColor,
   return Ch;
 }
 
-bool AArch64A57FPLoadBalancing::colorChainSet(std::vector<Chain*> GV,
-                                              MachineBasicBlock &MBB,
-                                              int &Parity) {
+bool AArch64A57FPLoadBalancingImpl::colorChainSet(std::vector<Chain *> GV,
+                                                  MachineBasicBlock &MBB,
+                                                  int &Parity) {
   bool Changed = false;
   LLVM_DEBUG(dbgs() << "colorChainSet(): #sets=" << GV.size() << "\n");
 
@@ -491,8 +511,8 @@ bool AArch64A57FPLoadBalancing::colorChainSet(std::vector<Chain*> GV,
   return Changed;
 }
 
-int AArch64A57FPLoadBalancing::scavengeRegister(Chain *G, Color C,
-                                                MachineBasicBlock &MBB) {
+int AArch64A57FPLoadBalancingImpl::scavengeRegister(Chain *G, Color C,
+                                                    MachineBasicBlock &MBB) {
   // Can we find an appropriate register that is available throughout the life
   // of the chain? Simulate liveness backwards until the end of the chain.
   LiveRegUnits Units(*TRI);
@@ -525,8 +545,8 @@ int AArch64A57FPLoadBalancing::scavengeRegister(Chain *G, Color C,
   return -1;
 }
 
-bool AArch64A57FPLoadBalancing::colorChain(Chain *G, Color C,
-                                           MachineBasicBlock &MBB) {
+bool AArch64A57FPLoadBalancingImpl::colorChain(Chain *G, Color C,
+                                               MachineBasicBlock &MBB) {
   bool Changed = false;
   LLVM_DEBUG(dbgs() << " - colorChain(" << G->str() << ", "
                     << ColorNames[(int)C] << ")\n");
@@ -595,7 +615,7 @@ bool AArch64A57FPLoadBalancing::colorChain(Chain *G, Color C,
   return Changed;
 }
 
-void AArch64A57FPLoadBalancing::scanInstruction(
+void AArch64A57FPLoadBalancingImpl::scanInstruction(
     MachineInstr *MI, unsigned Idx, std::map<unsigned, Chain *> &ActiveChains,
     std::vector<std::unique_ptr<Chain>> &AllChains) {
   // Inspect "MI", updating ActiveChains and AllChains.
@@ -675,9 +695,9 @@ void AArch64A57FPLoadBalancing::scanInstruction(
   }
 }
 
-void AArch64A57FPLoadBalancing::
-maybeKillChain(MachineOperand &MO, unsigned Idx,
-               std::map<unsigned, Chain*> &ActiveChains) {
+void AArch64A57FPLoadBalancingImpl::maybeKillChain(
+    MachineOperand &MO, unsigned Idx,
+    std::map<unsigned, Chain *> &ActiveChains) {
   // Given an operand and the set of active chains (keyed by register),
   // determine if a chain should be ended and remove from ActiveChains.
   MachineInstr *MI = MO.getParent();
@@ -708,7 +728,7 @@ maybeKillChain(MachineOperand &MO, unsigned Idx,
   }
 }
 
-Color AArch64A57FPLoadBalancing::getColor(unsigned Reg) {
+Color AArch64A57FPLoadBalancingImpl::getColor(unsigned Reg) {
   if ((TRI->getEncodingValue(Reg) % 2) == 0)
     return Color::Even;
   else
@@ -716,6 +736,6 @@ Color AArch64A57FPLoadBalancing::getColor(unsigned Reg) {
 }
 
 // Factory function used by AArch64TargetMachine to add the pass to the passmanager.
-FunctionPass *llvm::createAArch64A57FPLoadBalancing() {
-  return new AArch64A57FPLoadBalancing();
+FunctionPass *llvm::createAArch64A57FPLoadBalancingLegacyPass() {
+  return new AArch64A57FPLoadBalancingLegacy();
 }

diff  --git a/llvm/lib/Target/AArch64/AArch64PassRegistry.def b/llvm/lib/Target/AArch64/AArch64PassRegistry.def
index 39085fc033c12..2fcd42b90caa8 100644
--- a/llvm/lib/Target/AArch64/AArch64PassRegistry.def
+++ b/llvm/lib/Target/AArch64/AArch64PassRegistry.def
@@ -26,6 +26,7 @@
 #ifndef MACHINE_FUNCTION_PASS
 #define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS)
 #endif
+MACHINE_FUNCTION_PASS("aarch64-a57-fp-load-balancing", AArch64A57FPLoadBalancingPass())
 MACHINE_FUNCTION_PASS("aarch64-branch-targets", AArch64BranchTargetsPass())
 MACHINE_FUNCTION_PASS("aarch64-collect-loh", AArch64CollectLOHPass())
 MACHINE_FUNCTION_PASS("aarch64-condopt", AArch64ConditionOptimizerPass())

diff  --git a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
index 950d274ceae75..fab2804f531f2 100644
--- a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
+++ b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
@@ -244,7 +244,7 @@ LLVMInitializeAArch64Target() {
   auto &PR = *PassRegistry::getPassRegistry();
   initializeGlobalISel(PR);
   initializeAArch64A53Fix835769LegacyPass(PR);
-  initializeAArch64A57FPLoadBalancingPass(PR);
+  initializeAArch64A57FPLoadBalancingLegacyPass(PR);
   initializeAArch64AdvSIMDScalarLegacyPass(PR);
   initializeAArch64AsmPrinterPass(PR);
   initializeAArch64BranchTargetsLegacyPass(PR);
@@ -867,7 +867,7 @@ void AArch64PassConfig::addPostRegAlloc() {
 
   if (TM->getOptLevel() != CodeGenOptLevel::None && usingDefaultRegAlloc())
     // Improve performance for some FP/SIMD code for A57.
-    addPass(createAArch64A57FPLoadBalancing());
+    addPass(createAArch64A57FPLoadBalancingLegacyPass());
 }
 
 void AArch64PassConfig::addPreSched2() {


        


More information about the llvm-commits mailing list