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 | |
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.
-rw-r--r-- | llvm/include/llvm/CodeGen/Passes.h | 2 | ||||
-rw-r--r-- | llvm/include/llvm/CodeGen/PeepholeOptimizer.h | 29 | ||||
-rw-r--r-- | llvm/include/llvm/InitializePasses.h | 2 | ||||
-rw-r--r-- | llvm/include/llvm/Passes/CodeGenPassBuilder.h | 1 | ||||
-rw-r--r-- | llvm/include/llvm/Passes/MachinePassRegistry.def | 2 | ||||
-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 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/csinc-cmp-removal.mir | 1 | ||||
-rw-r--r-- | llvm/test/CodeGen/AMDGPU/fold-immediate-output-mods.mir | 1 | ||||
-rw-r--r-- | llvm/test/CodeGen/ARM/cmp1-peephole-thumb.mir | 1 | ||||
-rw-r--r-- | llvm/test/CodeGen/Lanai/peephole-compare.mir | 1 | ||||
-rw-r--r-- | llvm/test/CodeGen/PowerPC/bitcast-peephole.mir | 1 |
16 files changed, 111 insertions, 42 deletions
diff --git a/llvm/include/llvm/CodeGen/Passes.h b/llvm/include/llvm/CodeGen/Passes.h index 708ff46..7698f55 100644 --- a/llvm/include/llvm/CodeGen/Passes.h +++ b/llvm/include/llvm/CodeGen/Passes.h @@ -363,7 +363,7 @@ namespace llvm { /// PeepholeOptimizer - This pass performs peephole optimizations - /// like extension and comparison eliminations. - extern char &PeepholeOptimizerID; + extern char &PeepholeOptimizerLegacyID; /// OptimizePHIs - This pass optimizes machine instruction PHIs /// to take advantage of opportunities created during DAG legalization. diff --git a/llvm/include/llvm/CodeGen/PeepholeOptimizer.h b/llvm/include/llvm/CodeGen/PeepholeOptimizer.h new file mode 100644 index 0000000..f3968eb --- /dev/null +++ b/llvm/include/llvm/CodeGen/PeepholeOptimizer.h @@ -0,0 +1,29 @@ +//===- llvm/CodeGen/PeepholeOptimizer.h -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CODEGEN_PEEPHOLEOPTIMIZER_H +#define LLVM_CODEGEN_PEEPHOLEOPTIMIZER_H + +#include "llvm/CodeGen/MachinePassManager.h" + +namespace llvm { + +class PeepholeOptimizerPass : public PassInfoMixin<PeepholeOptimizerPass> { +public: + PreservedAnalyses run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM); + + MachineFunctionProperties getRequiredProperties() const { + return MachineFunctionProperties().set( + MachineFunctionProperties::Property::IsSSA); + } +}; + +} // namespace llvm + +#endif // LLVM_CODEGEN_PEEPHOLEOPTIMIZER_H diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h index 7ecd59a..af93d5e 100644 --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.h @@ -227,7 +227,7 @@ void initializePEIPass(PassRegistry &); void initializePHIEliminationPass(PassRegistry &); void initializePartiallyInlineLibCallsLegacyPassPass(PassRegistry &); void initializePatchableFunctionPass(PassRegistry &); -void initializePeepholeOptimizerPass(PassRegistry &); +void initializePeepholeOptimizerLegacyPass(PassRegistry &); void initializePhiValuesWrapperPassPass(PassRegistry &); void initializePhysicalRegisterUsageInfoWrapperLegacyPass(PassRegistry &); void initializePlaceBackedgeSafepointsLegacyPassPass(PassRegistry &); diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h b/llvm/include/llvm/Passes/CodeGenPassBuilder.h index ab16d79..d2e9e8185 100644 --- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h +++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h @@ -52,6 +52,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/include/llvm/Passes/MachinePassRegistry.def b/llvm/include/llvm/Passes/MachinePassRegistry.def index 375709e..851561f 100644 --- a/llvm/include/llvm/Passes/MachinePassRegistry.def +++ b/llvm/include/llvm/Passes/MachinePassRegistry.def @@ -142,6 +142,7 @@ MACHINE_FUNCTION_PASS("machine-cse", MachineCSEPass()) MACHINE_FUNCTION_PASS("machinelicm", MachineLICMPass()) MACHINE_FUNCTION_PASS("no-op-machine-function", NoOpMachineFunctionPass()) MACHINE_FUNCTION_PASS("opt-phis", OptimizePHIsPass()) +MACHINE_FUNCTION_PASS("peephole-opt", PeepholeOptimizerPass()) MACHINE_FUNCTION_PASS("phi-node-elimination", PHIEliminationPass()) MACHINE_FUNCTION_PASS("print", PrintMIRPass()) MACHINE_FUNCTION_PASS("print<live-intervals>", LiveIntervalsPrinterPass(dbgs())) @@ -240,7 +241,6 @@ DUMMY_MACHINE_FUNCTION_PASS("machine-uniformity", MachineUniformityInfoWrapperPa DUMMY_MACHINE_FUNCTION_PASS("machineinstr-printer", MachineFunctionPrinterPass) DUMMY_MACHINE_FUNCTION_PASS("mirfs-discriminators", MIRAddFSDiscriminatorsPass) DUMMY_MACHINE_FUNCTION_PASS("patchable-function", PatchableFunctionPass) -DUMMY_MACHINE_FUNCTION_PASS("peephole-opt", PeepholeOptimizerPass) DUMMY_MACHINE_FUNCTION_PASS("post-RA-sched", PostRASchedulerPass) DUMMY_MACHINE_FUNCTION_PASS("postmisched", PostMachineSchedulerPass) DUMMY_MACHINE_FUNCTION_PASS("postra-machine-sink", PostRAMachineSinkingPass) 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"); } diff --git a/llvm/test/CodeGen/AArch64/csinc-cmp-removal.mir b/llvm/test/CodeGen/AArch64/csinc-cmp-removal.mir index 2098218..81abbbf 100644 --- a/llvm/test/CodeGen/AArch64/csinc-cmp-removal.mir +++ b/llvm/test/CodeGen/AArch64/csinc-cmp-removal.mir @@ -1,5 +1,6 @@ # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py # RUN: llc -mtriple=aarch64 -run-pass=peephole-opt -verify-machineinstrs %s -o - | FileCheck %s +# RUN: llc -mtriple=aarch64 -passes=peephole-opt -verify-machineinstrs %s -o - | FileCheck %s --- name: remove_subswr_after_csincwr tracksRegLiveness: true diff --git a/llvm/test/CodeGen/AMDGPU/fold-immediate-output-mods.mir b/llvm/test/CodeGen/AMDGPU/fold-immediate-output-mods.mir index f8e8ac8..64a4708 100644 --- a/llvm/test/CodeGen/AMDGPU/fold-immediate-output-mods.mir +++ b/llvm/test/CodeGen/AMDGPU/fold-immediate-output-mods.mir @@ -1,4 +1,5 @@ # RUN: llc -mtriple=amdgcn -run-pass peephole-opt -verify-machineinstrs %s -o - | FileCheck -check-prefix=GCN %s +# RUN: llc -mtriple=amdgcn -passes peephole-opt -verify-machineinstrs %s -o - | FileCheck -check-prefix=GCN %s ... # GCN-LABEL: name: no_fold_imm_madak_mac_clamp_f32 # GCN: %23:vgpr_32 = V_MOV_B32_e32 1090519040, implicit $exec diff --git a/llvm/test/CodeGen/ARM/cmp1-peephole-thumb.mir b/llvm/test/CodeGen/ARM/cmp1-peephole-thumb.mir index c277515..6832482 100644 --- a/llvm/test/CodeGen/ARM/cmp1-peephole-thumb.mir +++ b/llvm/test/CodeGen/ARM/cmp1-peephole-thumb.mir @@ -1,5 +1,6 @@ # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py # RUN: llc -run-pass=peephole-opt %s -o - | FileCheck %s +# RUN: llc -passes=peephole-opt %s -o - | FileCheck %s --- | ; ModuleID = '<stdin>' diff --git a/llvm/test/CodeGen/Lanai/peephole-compare.mir b/llvm/test/CodeGen/Lanai/peephole-compare.mir index 10735170..04274a2 100644 --- a/llvm/test/CodeGen/Lanai/peephole-compare.mir +++ b/llvm/test/CodeGen/Lanai/peephole-compare.mir @@ -1,4 +1,5 @@ # RUN: llc -run-pass=peephole-opt %s -o - | FileCheck %s +# RUN: llc -passes=peephole-opt %s -o - | FileCheck %s # Test the compare fold peephole. diff --git a/llvm/test/CodeGen/PowerPC/bitcast-peephole.mir b/llvm/test/CodeGen/PowerPC/bitcast-peephole.mir index 1523857..e797c5d 100644 --- a/llvm/test/CodeGen/PowerPC/bitcast-peephole.mir +++ b/llvm/test/CodeGen/PowerPC/bitcast-peephole.mir @@ -1,5 +1,6 @@ # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py # RUN: llc -mtriple=powerpc64le-linux-gnu -run-pass=peephole-opt -verify-machineinstrs -o - %s | FileCheck %s +# RUN: llc -mtriple=powerpc64le-linux-gnu -passes=peephole-opt -verify-machineinstrs -o - %s | FileCheck %s --- name: bitCast |