[llvm-branch-commits] [SPIRV][NewPM] Port SPIRVPreLegalizerCombiner (PR #219108)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Aug 26 21:38:31 PDT 2026
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
More information about the llvm-branch-commits
mailing list