diff options
author | Akshat Oke <Akshat.Oke@amd.com> | 2024-11-18 11:02:01 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-18 11:02:01 +0530 |
commit | 3f9d02aae87b7c778b86cb79ebd4b64760653079 (patch) | |
tree | a1566979017c4e0abb68b2ca7add90d7248b3130 /llvm/lib | |
parent | 00aa08119aa03ea4722196bc7d0e84a4e2a044c7 (diff) | |
download | llvm-3f9d02aae87b7c778b86cb79ebd4b64760653079.zip llvm-3f9d02aae87b7c778b86cb79ebd4b64760653079.tar.gz llvm-3f9d02aae87b7c778b86cb79ebd4b64760653079.tar.bz2 |
[CodeGen][NewPM] Port PeepholeOptimizer to NPM (#116326)
With this, all machine SSA optimization passes are available in the new codegen pipeline.
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/CodeGen.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/CodeGen/PeepholeOptimizer.cpp | 103 | ||||
-rw-r--r-- | llvm/lib/CodeGen/TargetPassConfig.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/Passes/PassBuilder.cpp | 1 | ||||
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64TargetMachine.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp | 2 |
6 files changed, 73 insertions, 39 deletions
diff --git a/llvm/lib/CodeGen/CodeGen.cpp b/llvm/lib/CodeGen/CodeGen.cpp index 013a9b3..408395f 100644 --- a/llvm/lib/CodeGen/CodeGen.cpp +++ b/llvm/lib/CodeGen/CodeGen.cpp @@ -103,7 +103,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) { initializePEIPass(Registry); initializePHIEliminationPass(Registry); initializePatchableFunctionPass(Registry); - initializePeepholeOptimizerPass(Registry); + initializePeepholeOptimizerLegacyPass(Registry); initializePostMachineSchedulerPass(Registry); initializePostRAHazardRecognizerPass(Registry); initializePostRAMachineSinkingPass(Registry); diff --git a/llvm/lib/CodeGen/PeepholeOptimizer.cpp b/llvm/lib/CodeGen/PeepholeOptimizer.cpp index 12b276f..ad5796a 100644 --- a/llvm/lib/CodeGen/PeepholeOptimizer.cpp +++ b/llvm/lib/CodeGen/PeepholeOptimizer.cpp @@ -65,6 +65,7 @@ // C = copy A <-- same-bank copy //===----------------------------------------------------------------------===// +#include "llvm/CodeGen/PeepholeOptimizer.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallSet.h" @@ -78,6 +79,7 @@ #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineLoopInfo.h" #include "llvm/CodeGen/MachineOperand.h" +#include "llvm/CodeGen/MachinePassManager.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/TargetInstrInfo.h" #include "llvm/CodeGen/TargetOpcodes.h" @@ -147,8 +149,7 @@ namespace { class ValueTrackerResult; class RecurrenceInstr; -class PeepholeOptimizer : public MachineFunctionPass, - private MachineFunction::Delegate { +class PeepholeOptimizer : private MachineFunction::Delegate { const TargetInstrInfo *TII = nullptr; const TargetRegisterInfo *TRI = nullptr; MachineRegisterInfo *MRI = nullptr; @@ -156,30 +157,10 @@ class PeepholeOptimizer : public MachineFunctionPass, MachineLoopInfo *MLI = nullptr; public: - static char ID; // Pass identification - - PeepholeOptimizer() : MachineFunctionPass(ID) { - initializePeepholeOptimizerPass(*PassRegistry::getPassRegistry()); - } - - bool runOnMachineFunction(MachineFunction &MF) override; - - void getAnalysisUsage(AnalysisUsage &AU) const override { - AU.setPreservesCFG(); - MachineFunctionPass::getAnalysisUsage(AU); - AU.addRequired<MachineLoopInfoWrapperPass>(); - AU.addPreserved<MachineLoopInfoWrapperPass>(); - if (Aggressive) { - AU.addRequired<MachineDominatorTreeWrapperPass>(); - AU.addPreserved<MachineDominatorTreeWrapperPass>(); - } - } - - MachineFunctionProperties getRequiredProperties() const override { - return MachineFunctionProperties().set( - MachineFunctionProperties::Property::IsSSA); - } + PeepholeOptimizer(MachineDominatorTree *DT, MachineLoopInfo *MLI) + : DT(DT), MLI(MLI) {} + bool run(MachineFunction &MF); /// Track Def -> Use info used for rewriting copies. using RewriteMapTy = SmallDenseMap<RegSubRegPair, ValueTrackerResult>; @@ -294,6 +275,33 @@ private: } }; +class PeepholeOptimizerLegacy : public MachineFunctionPass { +public: + static char ID; // Pass identification + + PeepholeOptimizerLegacy() : MachineFunctionPass(ID) { + initializePeepholeOptimizerLegacyPass(*PassRegistry::getPassRegistry()); + } + + bool runOnMachineFunction(MachineFunction &MF) override; + + void getAnalysisUsage(AnalysisUsage &AU) const override { + AU.setPreservesCFG(); + MachineFunctionPass::getAnalysisUsage(AU); + AU.addRequired<MachineLoopInfoWrapperPass>(); + AU.addPreserved<MachineLoopInfoWrapperPass>(); + if (Aggressive) { + AU.addRequired<MachineDominatorTreeWrapperPass>(); + AU.addPreserved<MachineDominatorTreeWrapperPass>(); + } + } + + MachineFunctionProperties getRequiredProperties() const override { + return MachineFunctionProperties().set( + MachineFunctionProperties::Property::IsSSA); + } +}; + /// Helper class to hold instructions that are inside recurrence cycles. /// The recurrence cycle is formulated around 1) a def operand and its /// tied use operand, or 2) a def operand and a use operand that is commutable @@ -469,16 +477,16 @@ public: } // end anonymous namespace -char PeepholeOptimizer::ID = 0; +char PeepholeOptimizerLegacy::ID = 0; -char &llvm::PeepholeOptimizerID = PeepholeOptimizer::ID; +char &llvm::PeepholeOptimizerLegacyID = PeepholeOptimizerLegacy::ID; -INITIALIZE_PASS_BEGIN(PeepholeOptimizer, DEBUG_TYPE, "Peephole Optimizations", - false, false) +INITIALIZE_PASS_BEGIN(PeepholeOptimizerLegacy, DEBUG_TYPE, + "Peephole Optimizations", false, false) INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass) INITIALIZE_PASS_DEPENDENCY(MachineLoopInfoWrapperPass) -INITIALIZE_PASS_END(PeepholeOptimizer, DEBUG_TYPE, "Peephole Optimizations", - false, false) +INITIALIZE_PASS_END(PeepholeOptimizerLegacy, DEBUG_TYPE, + "Peephole Optimizations", false, false) /// If instruction is a copy-like instruction, i.e. it reads a single register /// and writes a single register and it does not modify the source, and if the @@ -1644,9 +1652,37 @@ bool PeepholeOptimizer::optimizeRecurrence(MachineInstr &PHI) { return Changed; } -bool PeepholeOptimizer::runOnMachineFunction(MachineFunction &MF) { +PreservedAnalyses +PeepholeOptimizerPass::run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM) { + MFPropsModifier _(*this, MF); + auto *DT = + Aggressive ? &MFAM.getResult<MachineDominatorTreeAnalysis>(MF) : nullptr; + auto *MLI = &MFAM.getResult<MachineLoopAnalysis>(MF); + PeepholeOptimizer Impl(DT, MLI); + bool Changed = Impl.run(MF); + if (!Changed) + return PreservedAnalyses::all(); + + auto PA = getMachineFunctionPassPreservedAnalyses(); + PA.preserve<MachineDominatorTreeAnalysis>(); + PA.preserve<MachineLoopAnalysis>(); + PA.preserveSet<CFGAnalyses>(); + return PA; +} + +bool PeepholeOptimizerLegacy::runOnMachineFunction(MachineFunction &MF) { if (skipFunction(MF.getFunction())) return false; + auto *DT = Aggressive + ? &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree() + : nullptr; + auto *MLI = &getAnalysis<MachineLoopInfoWrapperPass>().getLI(); + PeepholeOptimizer Impl(DT, MLI); + return Impl.run(MF); +} + +bool PeepholeOptimizer::run(MachineFunction &MF) { LLVM_DEBUG(dbgs() << "********** PEEPHOLE OPTIMIZER **********\n"); LLVM_DEBUG(dbgs() << "********** Function: " << MF.getName() << '\n'); @@ -1657,9 +1693,6 @@ bool PeepholeOptimizer::runOnMachineFunction(MachineFunction &MF) { TII = MF.getSubtarget().getInstrInfo(); TRI = MF.getSubtarget().getRegisterInfo(); MRI = &MF.getRegInfo(); - DT = Aggressive ? &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree() - : nullptr; - MLI = &getAnalysis<MachineLoopInfoWrapperPass>().getLI(); MF.setDelegate(this); bool Changed = false; diff --git a/llvm/lib/CodeGen/TargetPassConfig.cpp b/llvm/lib/CodeGen/TargetPassConfig.cpp index 249407f..a6159a3 100644 --- a/llvm/lib/CodeGen/TargetPassConfig.cpp +++ b/llvm/lib/CodeGen/TargetPassConfig.cpp @@ -1315,7 +1315,7 @@ void TargetPassConfig::addMachineSSAOptimization() { addPass(&MachineSinkingID); - addPass(&PeepholeOptimizerID); + addPass(&PeepholeOptimizerLegacyID); // Clean-up the dead code that may have been generated by peephole // rewriting. addPass(&DeadMachineInstructionElimID); diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index a181a28..bc6b449 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -118,6 +118,7 @@ #include "llvm/CodeGen/MachineVerifier.h" #include "llvm/CodeGen/OptimizePHIs.h" #include "llvm/CodeGen/PHIElimination.h" +#include "llvm/CodeGen/PeepholeOptimizer.h" #include "llvm/CodeGen/PreISelIntrinsicLowering.h" #include "llvm/CodeGen/RegAllocFast.h" #include "llvm/CodeGen/RegUsageInfoCollector.h" diff --git a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp index 074f39c..8297f84 100644 --- a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp +++ b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp @@ -810,7 +810,7 @@ void AArch64PassConfig::addPreRegAlloc() { addPass(createAArch64AdvSIMDScalar()); // The AdvSIMD pass may produce copies that can be rewritten to // be register coalescer friendly. - addPass(&PeepholeOptimizerID); + addPass(&PeepholeOptimizerLegacyID); } if (TM->getOptLevel() != CodeGenOptLevel::None && EnableMachinePipeliner) addPass(&MachinePipelinerID); diff --git a/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp b/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp index 9611f5f..b9bbe24 100644 --- a/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp @@ -498,6 +498,6 @@ void NVPTXPassConfig::addMachineSSAOptimization() { addPass(&MachineSinkingID); printAndVerify("After Machine LICM, CSE and Sinking passes"); - addPass(&PeepholeOptimizerID); + addPass(&PeepholeOptimizerLegacyID); printAndVerify("After codegen peephole optimization pass"); } |