llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-backend-spir-v Author: Aiden Grossman (boomanaiden154) <details> <summary>Changes</summary> Standard NewPM pass porting. We do need to move the rule config parsing into being per MF, but this should not be a noticeable regression. --- Full diff: https://github.com/llvm/llvm-project/pull/219108.diff 5 Files Affected: - (modified) llvm/lib/Target/SPIRV/SPIRV.h (+10-2) - (modified) llvm/lib/Target/SPIRV/SPIRVCodeGenPassBuilder.cpp (+1-2) - (modified) llvm/lib/Target/SPIRV/SPIRVPassRegistry.def (+1) - (modified) llvm/lib/Target/SPIRV/SPIRVPreLegalizerCombiner.cpp (+51-22) - (modified) llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp (+2-2) ``````````diff diff --git a/llvm/lib/Target/SPIRV/SPIRV.h b/llvm/lib/Target/SPIRV/SPIRV.h index cb6405a0ee785..cbf951443f0bf 100644 --- a/llvm/lib/Target/SPIRV/SPIRV.h +++ b/llvm/lib/Target/SPIRV/SPIRV.h @@ -127,7 +127,15 @@ class SPIRVPreLegalizerPass }; FunctionPass *createSPIRVPreLegalizerLegacyPass(); -FunctionPass *createSPIRVPreLegalizerCombiner(); + +class SPIRVPreLegalizerCombinerPass + : public RequiredPassInfoMixin<SPIRVPreLegalizerCombinerPass> { +public: + PreservedAnalyses run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM); +}; + +FunctionPass *createSPIRVPreLegalizerCombinerLegacyPass(); FunctionPass *createSPIRVPostLegalizerPass(); class SPIRVEmitIntrinsicsPass @@ -166,7 +174,7 @@ void initializeSPIRVModuleAnalysisPass(PassRegistry &); void initializeSPIRVAsmPrinterPass(PassRegistry &); void initializeSPIRVConvergenceRegionAnalysisWrapperPassPass(PassRegistry &); void initializeSPIRVPreLegalizerLegacyPass(PassRegistry &); -void initializeSPIRVPreLegalizerCombinerPass(PassRegistry &); +void initializeSPIRVPreLegalizerCombinerLegacyPass(PassRegistry &); void initializeSPIRVPostLegalizerPass(PassRegistry &); void initializeSPIRVStructurizerPass(PassRegistry &); void initializeSPIRVCBufferAccessLegacyPass(PassRegistry &); diff --git a/llvm/lib/Target/SPIRV/SPIRVCodeGenPassBuilder.cpp b/llvm/lib/Target/SPIRV/SPIRVCodeGenPassBuilder.cpp index 08bf905075f30..e01b8c296f0d8 100644 --- a/llvm/lib/Target/SPIRV/SPIRVCodeGenPassBuilder.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVCodeGenPassBuilder.cpp @@ -151,8 +151,7 @@ Error SPIRVCodeGenPassBuilder::addIRTranslator(PassManagerWrapper &PMW) { } void SPIRVCodeGenPassBuilder::addPreLegalizeMachineIR(PassManagerWrapper &PMW) { - // TODO(boomanaiden154): Add SPIRVPreLegalizerCombiner when it has been - // ported. + addMachineFunctionPass(SPIRVPreLegalizerCombinerPass(), PMW); addMachineFunctionPass(SPIRVPreLegalizerPass(), PMW); } diff --git a/llvm/lib/Target/SPIRV/SPIRVPassRegistry.def b/llvm/lib/Target/SPIRV/SPIRVPassRegistry.def index 1135f48cecba4..b759ab117f98c 100644 --- a/llvm/lib/Target/SPIRV/SPIRVPassRegistry.def +++ b/llvm/lib/Target/SPIRV/SPIRVPassRegistry.def @@ -46,4 +46,5 @@ FUNCTION_ANALYSIS("spirv-convergence-region", SPIRVConvergenceRegionAnalysis()) #define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) #endif MACHINE_FUNCTION_PASS("spirv-prelegalizer", SPIRVPreLegalizerPass()) +MACHINE_FUNCTION_PASS("spirv-prelegalizer-combiner", SPIRVPreLegalizerCombinerPass()) #undef MACHINE_FUNCTION_PASS diff --git a/llvm/lib/Target/SPIRV/SPIRVPreLegalizerCombiner.cpp b/llvm/lib/Target/SPIRV/SPIRVPreLegalizerCombiner.cpp index c7d90f51046d4..1e1fbe75f53c2 100644 --- a/llvm/lib/Target/SPIRV/SPIRVPreLegalizerCombiner.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVPreLegalizerCombiner.cpp @@ -21,8 +21,11 @@ #include "llvm/CodeGen/GlobalISel/GISelValueTracking.h" #include "llvm/CodeGen/GlobalISel/MIPatternMatch.h" #include "llvm/CodeGen/MachineDominators.h" +#include "llvm/CodeGen/MachineFunctionAnalysisManager.h" #include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/CodeGen/MachinePassManager.h" #include "llvm/CodeGen/TargetPassConfig.h" +#include "llvm/IR/Analysis.h" #define GET_GICOMBINER_DEPS #include "SPIRVGenPreLegalizeGICombiner.inc" @@ -91,25 +94,23 @@ bool SPIRVPreLegalizerCombinerImpl::tryCombineAll(MachineInstr &MI) const { // Pass boilerplate // ================ -class SPIRVPreLegalizerCombiner : public MachineFunctionPass { +class SPIRVPreLegalizerCombinerLegacy : public MachineFunctionPass { public: static char ID; - SPIRVPreLegalizerCombiner(); + SPIRVPreLegalizerCombinerLegacy(); StringRef getPassName() const override { return "SPIRVPreLegalizerCombiner"; } bool runOnMachineFunction(MachineFunction &MF) override; void getAnalysisUsage(AnalysisUsage &AU) const override; - -private: - SPIRVPreLegalizerCombinerImplRuleConfig RuleConfig; }; } // end anonymous namespace -void SPIRVPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const { +void SPIRVPreLegalizerCombinerLegacy::getAnalysisUsage( + AnalysisUsage &AU) const { AU.setPreservesCFG(); getSelectionDAGFallbackAnalysisUsage(AU); AU.addRequired<GISelValueTrackingAnalysisLegacy>(); @@ -118,26 +119,28 @@ void SPIRVPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const { MachineFunctionPass::getAnalysisUsage(AU); } -SPIRVPreLegalizerCombiner::SPIRVPreLegalizerCombiner() - : MachineFunctionPass(ID) { - if (!RuleConfig.parseCommandLineOption()) - report_fatal_error("Invalid rule identifier"); -} +SPIRVPreLegalizerCombinerLegacy::SPIRVPreLegalizerCombinerLegacy() + : MachineFunctionPass(ID) {} -bool SPIRVPreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) { +static bool +runPreLegalizerCombiner(MachineFunction &MF, bool ShouldSkip, + function_ref<GISelValueTracking *()> GetVT, + function_ref<MachineDominatorTree *()> GetMDT) { if (MF.getProperties().hasFailedISel()) return false; + SPIRVPreLegalizerCombinerImplRuleConfig RuleConfig; + if (!RuleConfig.parseCommandLineOption()) + reportFatalUsageError("Invalid rule identifier"); + const SPIRVSubtarget &ST = MF.getSubtarget<SPIRVSubtarget>(); const auto *LI = ST.getLegalizerInfo(); const Function &F = MF.getFunction(); bool EnableOpt = - MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F); - GISelValueTracking *VT = - &getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF); - MachineDominatorTree *MDT = - &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree(); + MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !ShouldSkip; + GISelValueTracking *VT = GetVT(); + MachineDominatorTree *MDT = GetMDT(); CombinerInfo CInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false, /*LegalizerInfo*/ nullptr, EnableOpt, F.hasOptSize(), F.hasMinSize()); @@ -152,17 +155,43 @@ bool SPIRVPreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) { return Impl.combineMachineInstrs(); } -char SPIRVPreLegalizerCombiner::ID = 0; -INITIALIZE_PASS_BEGIN(SPIRVPreLegalizerCombiner, DEBUG_TYPE, +char SPIRVPreLegalizerCombinerLegacy::ID = 0; +INITIALIZE_PASS_BEGIN(SPIRVPreLegalizerCombinerLegacy, DEBUG_TYPE, "Combine SPIRV machine instrs before legalization", false, false) INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy) -INITIALIZE_PASS_END(SPIRVPreLegalizerCombiner, DEBUG_TYPE, +INITIALIZE_PASS_END(SPIRVPreLegalizerCombinerLegacy, DEBUG_TYPE, "Combine SPIRV machine instrs before legalization", false, false) namespace llvm { -FunctionPass *createSPIRVPreLegalizerCombiner() { - return new SPIRVPreLegalizerCombiner(); +FunctionPass *createSPIRVPreLegalizerCombinerLegacyPass() { + return new SPIRVPreLegalizerCombinerLegacy(); } } // end namespace llvm + +bool SPIRVPreLegalizerCombinerLegacy::runOnMachineFunction( + MachineFunction &MF) { + return runPreLegalizerCombiner( + MF, skipFunction(MF.getFunction()), + [&]() { + return &getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF); + }, + [&]() { + return &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree(); + }); +} + +PreservedAnalyses +SPIRVPreLegalizerCombinerPass::run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM) { + bool Changed = runPreLegalizerCombiner( + MF, MF.getFunction().hasOptNone(), + [&]() { return &MFAM.getResult<GISelValueTrackingAnalysis>(MF); }, + [&]() { return &MFAM.getResult<MachineDominatorTreeAnalysis>(MF); }); + if (!Changed) + return PreservedAnalyses::all(); + return getMachineFunctionPassPreservedAnalyses() + .preserveSet<CFGAnalyses>() + .preserve<GISelValueTrackingAnalysis>(); +} diff --git a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp index 7482919967c1a..e69eaab88c369 100644 --- a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp @@ -52,7 +52,7 @@ extern "C" LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeSPIRVTarget() { initializeSPIRVStructurizerPass(PR); initializeSPIRVCBufferAccessLegacyPass(PR); initializeSPIRVPushConstantAccessLegacyPass(PR); - initializeSPIRVPreLegalizerCombinerPass(PR); + initializeSPIRVPreLegalizerCombinerLegacyPass(PR); initializeSPIRVLegalizePointerCastLegacyPass(PR); initializeSPIRVLegalizeZeroSizeArraysLegacyPass(PR); initializeSPIRVRegularizerLegacyPass(PR); @@ -240,7 +240,7 @@ bool SPIRVPassConfig::addIRTranslator() { } void SPIRVPassConfig::addPreLegalizeMachineIR() { - addPass(createSPIRVPreLegalizerCombiner()); + addPass(createSPIRVPreLegalizerCombinerLegacyPass()); addPass(createSPIRVPreLegalizerLegacyPass()); } `````````` </details> https://github.com/llvm/llvm-project/pull/219108 _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
