diff --git a/llvm/lib/Target/AArch64/AArch64.h b/llvm/lib/Target/AArch64/AArch64.h index ca9a78114158e..aa8ba0600fed5 100644 --- a/llvm/lib/Target/AArch64/AArch64.h +++ b/llvm/lib/Target/AArch64/AArch64.h @@ -87,7 +87,7 @@ void initializeAArch64AsmPrinterPass(PassRegistry &); void initializeAArch64PointerAuthPass(PassRegistry&); void initializeAArch64BranchTargetsLegacyPass(PassRegistry &); void initializeAArch64CFIFixupPass(PassRegistry&); -void initializeAArch64CollectLOHPass(PassRegistry &); +void initializeAArch64CollectLOHLegacyPass(PassRegistry &); void initializeAArch64CompressJumpTablesPass(PassRegistry&); void initializeAArch64CondBrTuningPass(PassRegistry &); void initializeAArch64ConditionOptimizerPass(PassRegistry&); @@ -149,6 +149,12 @@ class AArch64AdvSIMDScalarPass MachineFunctionAnalysisManager &MFAM); }; +class AArch64CollectLOHPass : public PassInfoMixin { +public: + PreservedAnalyses run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM); +}; + } // end namespace llvm #endif diff --git a/llvm/lib/Target/AArch64/AArch64CollectLOH.cpp b/llvm/lib/Target/AArch64/AArch64CollectLOH.cpp index 069147a1b669b..58ed6ff35c068 100644 --- a/llvm/lib/Target/AArch64/AArch64CollectLOH.cpp +++ b/llvm/lib/Target/AArch64/AArch64CollectLOH.cpp @@ -123,33 +123,6 @@ STATISTIC(NumADRSimpleCandidate, "Number of simplifiable ADRP + ADD"); #define AARCH64_COLLECT_LOH_NAME "AArch64 Collect Linker Optimization Hint (LOH)" -namespace { - -struct AArch64CollectLOH : public MachineFunctionPass { - static char ID; - AArch64CollectLOH() : MachineFunctionPass(ID) {} - - bool runOnMachineFunction(MachineFunction &MF) override; - - MachineFunctionProperties getRequiredProperties() const override { - return MachineFunctionProperties().setNoVRegs(); - } - - StringRef getPassName() const override { return AARCH64_COLLECT_LOH_NAME; } - - void getAnalysisUsage(AnalysisUsage &AU) const override { - MachineFunctionPass::getAnalysisUsage(AU); - AU.setPreservesAll(); - } -}; - -char AArch64CollectLOH::ID = 0; - -} // end anonymous namespace. - -INITIALIZE_PASS(AArch64CollectLOH, "aarch64-collect-loh", - AARCH64_COLLECT_LOH_NAME, false, false) - static bool canAddBePartOfLOH(const MachineInstr &MI) { // Check immediate to see if the immediate is an address. switch (MI.getOperand(2).getType()) { @@ -536,10 +509,9 @@ static void handleNormalInst(const MachineInstr &MI, LOHInfo *LOHInfos) { } } -bool AArch64CollectLOH::runOnMachineFunction(MachineFunction &MF) { - if (skipFunction(MF.getFunction())) - return false; +namespace { +void runAArch64CollectLOH(MachineFunction &MF) { LLVM_DEBUG(dbgs() << "********** AArch64 Collect LOH **********\n" << "Looking in function " << MF.getName() << '\n'); @@ -590,11 +562,49 @@ bool AArch64CollectLOH::runOnMachineFunction(MachineFunction &MF) { handleNormalInst(MI, LOHInfos); } } +} - // Return "no change": The pass only collects information. - return false; +struct AArch64CollectLOHLegacy : public MachineFunctionPass { + static char ID; + AArch64CollectLOHLegacy() : MachineFunctionPass(ID) {} + + bool runOnMachineFunction(MachineFunction &MF) override { + if (skipFunction(MF.getFunction())) + return false; + runAArch64CollectLOH(MF); + + // Return "no change": The pass only collects information. + return false; + } + + MachineFunctionProperties getRequiredProperties() const override { + return MachineFunctionProperties().setNoVRegs(); + } + + StringRef getPassName() const override { return AARCH64_COLLECT_LOH_NAME; } + + void getAnalysisUsage(AnalysisUsage &AU) const override { + MachineFunctionPass::getAnalysisUsage(AU); + AU.setPreservesAll(); + } +}; + +char AArch64CollectLOHLegacy::ID = 0; + +} // end anonymous namespace. + +INITIALIZE_PASS(AArch64CollectLOHLegacy, "aarch64-collect-loh", + AARCH64_COLLECT_LOH_NAME, false, false) + +PreservedAnalyses +AArch64CollectLOHPass::run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM) { + runAArch64CollectLOH(MF); + + // This pass only collects information. + return PreservedAnalyses::all(); } FunctionPass *llvm::createAArch64CollectLOHPass() { - return new AArch64CollectLOH(); + return new AArch64CollectLOHLegacy(); } diff --git a/llvm/lib/Target/AArch64/AArch64PassRegistry.def b/llvm/lib/Target/AArch64/AArch64PassRegistry.def index 47e6130d6891b..de1f08025edbc 100644 --- a/llvm/lib/Target/AArch64/AArch64PassRegistry.def +++ b/llvm/lib/Target/AArch64/AArch64PassRegistry.def @@ -27,6 +27,7 @@ #define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) #endif MACHINE_FUNCTION_PASS("aarch64-branch-targets", AArch64BranchTargetsPass()) +MACHINE_FUNCTION_PASS("aarch64-collect-loh", AArch64CollectLOHPass()) MACHINE_FUNCTION_PASS("aarch64-fix-cortex-a53-835769", AArch64A53Fix835769Pass()) MACHINE_FUNCTION_PASS("aarch64-ldst-opt", AArch64LoadStoreOptPass()) MACHINE_FUNCTION_PASS("aarch64-simd-scalar", AArch64AdvSIMDScalarPass()) diff --git a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp index 45d01c7d3ae93..4c2caab8c8cd3 100644 --- a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp +++ b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp @@ -248,7 +248,7 @@ LLVMInitializeAArch64Target() { initializeAArch64AdvSIMDScalarLegacyPass(PR); initializeAArch64AsmPrinterPass(PR); initializeAArch64BranchTargetsLegacyPass(PR); - initializeAArch64CollectLOHPass(PR); + initializeAArch64CollectLOHLegacyPass(PR); initializeAArch64CompressJumpTablesPass(PR); initializeAArch64ConditionalComparesPass(PR); initializeAArch64ConditionOptimizerPass(PR);