diff --git a/llvm/include/llvm/CodeGen/DetectDeadLanes.h b/llvm/include/llvm/CodeGen/DetectDeadLanes.h index 349bf794627b0..5efe65962cf07 100644 --- a/llvm/include/llvm/CodeGen/DetectDeadLanes.h +++ b/llvm/include/llvm/CodeGen/DetectDeadLanes.h @@ -29,6 +29,7 @@ #define LLVM_CODEGEN_DETECTDEADLANES_H #include "llvm/ADT/BitVector.h" +#include "llvm/CodeGen/MachinePassManager.h" #include "llvm/MC/LaneBitmask.h" #include @@ -115,6 +116,13 @@ class DeadLaneDetector { BitVector DefinedByCopy; }; +class DetectDeadLanesPass : public PassInfoMixin { +public: + PreservedAnalyses run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM); + static bool isRequired() { return true; } +}; + } // end namespace llvm #endif // LLVM_CODEGEN_DETECTDEADLANES_H diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h index a05e876806ab5..862cdd754f315 100644 --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.h @@ -89,7 +89,7 @@ void initializeDXILResourceTypeWrapperPassPass(PassRegistry &); void initializeDeadMachineInstructionElimPass(PassRegistry &); void initializeDebugifyMachineModulePass(PassRegistry &); void initializeDependenceAnalysisWrapperPassPass(PassRegistry &); -void initializeDetectDeadLanesPass(PassRegistry &); +void initializeDetectDeadLanesLegacyPass(PassRegistry &); void initializeDomOnlyPrinterWrapperPassPass(PassRegistry &); void initializeDomOnlyViewerWrapperPassPass(PassRegistry &); void initializeDomPrinterWrapperPassPass(PassRegistry &); diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h b/llvm/include/llvm/Passes/CodeGenPassBuilder.h index 25899d04dc664..10a97b57a3a4f 100644 --- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h +++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h @@ -26,6 +26,7 @@ #include "llvm/CodeGen/CallBrPrepare.h" #include "llvm/CodeGen/CodeGenPrepare.h" #include "llvm/CodeGen/DeadMachineInstructionElim.h" +#include "llvm/CodeGen/DetectDeadLanes.h" #include "llvm/CodeGen/DwarfEHPrepare.h" #include "llvm/CodeGen/EarlyIfConversion.h" #include "llvm/CodeGen/ExpandLargeDivRem.h" diff --git a/llvm/include/llvm/Passes/MachinePassRegistry.def b/llvm/include/llvm/Passes/MachinePassRegistry.def index f99a5f2c74bf3..33b2fd0bda357 100644 --- a/llvm/include/llvm/Passes/MachinePassRegistry.def +++ b/llvm/include/llvm/Passes/MachinePassRegistry.def @@ -138,6 +138,7 @@ MACHINE_FUNCTION_ANALYSIS("virtregmap", VirtRegMapAnalysis()) #define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) #endif MACHINE_FUNCTION_PASS("dead-mi-elimination", DeadMachineInstructionElimPass()) +MACHINE_FUNCTION_PASS("detect-dead-lanes", DetectDeadLanesPass()) MACHINE_FUNCTION_PASS("early-ifcvt", EarlyIfConverterPass()) MACHINE_FUNCTION_PASS("early-machinelicm", EarlyMachineLICMPass()) MACHINE_FUNCTION_PASS("early-tailduplication", EarlyTailDuplicatePass()) @@ -249,7 +250,6 @@ DUMMY_MACHINE_FUNCTION_PASS("break-false-deps", BreakFalseDepsPass) DUMMY_MACHINE_FUNCTION_PASS("cfguard-longjmp", CFGuardLongjmpPass) DUMMY_MACHINE_FUNCTION_PASS("cfi-fixup", CFIFixupPass) DUMMY_MACHINE_FUNCTION_PASS("cfi-instr-inserter", CFIInstrInserterPass) -DUMMY_MACHINE_FUNCTION_PASS("detect-dead-lanes", DetectDeadLanesPass) DUMMY_MACHINE_FUNCTION_PASS("dot-machine-cfg", MachineCFGPrinter) DUMMY_MACHINE_FUNCTION_PASS("fentry-insert", FEntryInserterPass) DUMMY_MACHINE_FUNCTION_PASS("fs-profile-loader", MIRProfileLoaderNewPass) diff --git a/llvm/lib/CodeGen/CodeGen.cpp b/llvm/lib/CodeGen/CodeGen.cpp index beb7fb284a376..54823c1dac66b 100644 --- a/llvm/lib/CodeGen/CodeGen.cpp +++ b/llvm/lib/CodeGen/CodeGen.cpp @@ -33,7 +33,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) { initializeCodeGenPrepareLegacyPassPass(Registry); initializeDeadMachineInstructionElimPass(Registry); initializeDebugifyMachineModulePass(Registry); - initializeDetectDeadLanesPass(Registry); + initializeDetectDeadLanesLegacyPass(Registry); initializeDwarfEHPrepareLegacyPassPass(Registry); initializeEarlyIfConverterLegacyPass(Registry); initializeEarlyIfPredicatorPass(Registry); diff --git a/llvm/lib/CodeGen/DetectDeadLanes.cpp b/llvm/lib/CodeGen/DetectDeadLanes.cpp index 01da473268706..d2522fd5eb0e3 100644 --- a/llvm/lib/CodeGen/DetectDeadLanes.cpp +++ b/llvm/lib/CodeGen/DetectDeadLanes.cpp @@ -373,19 +373,9 @@ LaneBitmask DeadLaneDetector::determineInitialUsedLanes(Register Reg) { namespace { -class DetectDeadLanes : public MachineFunctionPass { +class DetectDeadLanes { public: - bool runOnMachineFunction(MachineFunction &MF) override; - - static char ID; - DetectDeadLanes() : MachineFunctionPass(ID) {} - - StringRef getPassName() const override { return "Detect Dead Lanes"; } - - void getAnalysisUsage(AnalysisUsage &AU) const override { - AU.setPreservesCFG(); - MachineFunctionPass::getAnalysisUsage(AU); - } + bool run(MachineFunction &MF); private: /// update the operand status. @@ -407,12 +397,29 @@ class DetectDeadLanes : public MachineFunctionPass { const TargetRegisterInfo *TRI = nullptr; }; +struct DetectDeadLanesLegacy : public MachineFunctionPass { + static char ID; + DetectDeadLanesLegacy() : MachineFunctionPass(ID) {} + + StringRef getPassName() const override { return "Detect Dead Lanes"; } + + void getAnalysisUsage(AnalysisUsage &AU) const override { + AU.setPreservesCFG(); + MachineFunctionPass::getAnalysisUsage(AU); + } + + bool runOnMachineFunction(MachineFunction &MF) override { + return DetectDeadLanes().run(MF); + } +}; + } // end anonymous namespace -char DetectDeadLanes::ID = 0; -char &llvm::DetectDeadLanesID = DetectDeadLanes::ID; +char DetectDeadLanesLegacy::ID = 0; +char &llvm::DetectDeadLanesID = DetectDeadLanesLegacy::ID; -INITIALIZE_PASS(DetectDeadLanes, DEBUG_TYPE, "Detect Dead Lanes", false, false) +INITIALIZE_PASS(DetectDeadLanesLegacy, DEBUG_TYPE, "Detect Dead Lanes", false, + false) bool DetectDeadLanes::isUndefRegAtInput( const MachineOperand &MO, const DeadLaneDetector::VRegInfo &RegInfo) const { @@ -537,7 +544,17 @@ DetectDeadLanes::modifySubRegisterOperandStatus(const DeadLaneDetector &DLD, return std::make_pair(Changed, Again); } -bool DetectDeadLanes::runOnMachineFunction(MachineFunction &MF) { +PreservedAnalyses +DetectDeadLanesPass::run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM) { + if (!DetectDeadLanes().run(MF)) + return PreservedAnalyses::all(); + auto PA = getMachineFunctionPassPreservedAnalyses(); + PA.preserveSet(); + return PA; +} + +bool DetectDeadLanes::run(MachineFunction &MF) { // Don't bother if we won't track subregister liveness later. This pass is // required for correctness if subregister liveness is enabled because the // register coalescer cannot deal with hidden dead defs. However without diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index 8080059f0bb03..1f1e9561fefac 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -84,6 +84,7 @@ #include "llvm/CodeGen/CodeGenPrepare.h" #include "llvm/CodeGen/ComplexDeinterleavingPass.h" #include "llvm/CodeGen/DeadMachineInstructionElim.h" +#include "llvm/CodeGen/DetectDeadLanes.h" #include "llvm/CodeGen/DwarfEHPrepare.h" #include "llvm/CodeGen/EarlyIfConversion.h" #include "llvm/CodeGen/EdgeBundles.h" diff --git a/llvm/test/CodeGen/AMDGPU/detect-dead-lanes.mir b/llvm/test/CodeGen/AMDGPU/detect-dead-lanes.mir index f58c7d357b29f..df64d247d15ce 100644 --- a/llvm/test/CodeGen/AMDGPU/detect-dead-lanes.mir +++ b/llvm/test/CodeGen/AMDGPU/detect-dead-lanes.mir @@ -1,4 +1,5 @@ # RUN: llc -mtriple=amdgcn -run-pass detect-dead-lanes -o - %s | FileCheck %s +# RUN: llc -mtriple=amdgcn -passes detect-dead-lanes -o - %s | FileCheck %s ... --- # Combined use/def transfer check, the basics.