[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