[llvm] d67ab11 - [SPIR-V] Move structurizer to ISel prepare (#157886)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 11 06:02:48 PDT 2025
Author: Nathan Gauër
Date: 2025-09-11T15:02:43+02:00
New Revision: d67ab11f2edcadd3fe1997eb691821fb7ee8e8c2
URL: https://github.com/llvm/llvm-project/commit/d67ab11f2edcadd3fe1997eb691821fb7ee8e8c2
DIFF: https://github.com/llvm/llvm-project/commit/d67ab11f2edcadd3fe1997eb691821fb7ee8e8c2.diff
LOG: [SPIR-V] Move structurizer to ISel prepare (#157886)
Some passes like LoopSimplify/SimplifyCFF are running between IRPasses
and ISelPrepare. This is an issue because the structurizer generates
OpSelectionMerge/OpLoopMerge instructions at specific places, and those
passes are moving them.
Moving the structurizer later solves this issue.
Added:
llvm/test/CodeGen/SPIRV/structurizer/switch-fallthrough.ll
Modified:
llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp
index e0bfb77f4b530..9c58f468c9bd6 100644
--- a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp
@@ -189,6 +189,11 @@ TargetPassConfig *SPIRVTargetMachine::createPassConfig(PassManagerBase &PM) {
void SPIRVPassConfig::addIRPasses() {
TargetPassConfig::addIRPasses();
+ addPass(createSPIRVRegularizerPass());
+ addPass(createSPIRVPrepareFunctionsPass(TM));
+}
+
+void SPIRVPassConfig::addISelPrepare() {
if (TM.getSubtargetImpl()->isShader()) {
// Vulkan does not allow address space casts. This pass is run to remove
// address space casts that can be removed.
@@ -220,12 +225,7 @@ void SPIRVPassConfig::addIRPasses() {
addPass(createPromoteMemoryToRegisterPass());
}
- addPass(createSPIRVRegularizerPass());
- addPass(createSPIRVPrepareFunctionsPass(TM));
addPass(createSPIRVStripConvergenceIntrinsicsPass());
-}
-
-void SPIRVPassConfig::addISelPrepare() {
addPass(createSPIRVLegalizeImplicitBindingPass());
addPass(createSPIRVEmitIntrinsicsPass(&getTM<SPIRVTargetMachine>()));
if (TM.getSubtargetImpl()->isLogicalSPIRV())
diff --git a/llvm/test/CodeGen/SPIRV/structurizer/switch-fallthrough.ll b/llvm/test/CodeGen/SPIRV/structurizer/switch-fallthrough.ll
new file mode 100644
index 0000000000000..2e5e39c88b02c
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/structurizer/switch-fallthrough.ll
@@ -0,0 +1,42 @@
+; RUN: %if spirv-tools %{ llc -O3 -mtriple=spirv-unknown-vulkan-compute %s -o - -filetype=obj | spirv-val %}
+
+target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64-G10"
+target triple = "spirv1.6-unknown-vulkan1.3-compute"
+
+define spir_func noundef i32 @_Z7processv() #0 {
+entry:
+ %0 = tail call token @llvm.experimental.convergence.entry()
+ %2 = tail call i32 @llvm.spv.thread.id.i32(i32 0)
+ switch i32 %2, label %sw1 [
+ i32 0, label %sw0
+ i32 2, label %sw0
+ ]
+
+sw0:
+ %5 = call spir_func i1 @llvm.spv.wave.any(i1 false) [ "convergencectrl"(token %0) ]
+ br label %exit
+
+sw1:
+ %6 = call spir_func i1 @llvm.spv.wave.any(i1 false) [ "convergencectrl"(token %0) ]
+ br label %exit
+
+exit:
+ %.sink = phi i1 [ %5, %sw0 ], [ %6, %sw1 ]
+ %conv.i = zext i1 %.sink to i32
+ ret i32 %conv.i
+}
+
+define internal spir_func void @main() #0 {
+entry:
+ %0 = call token @llvm.experimental.convergence.entry()
+ %call1 = call spir_func noundef i32 @_Z7processv() #0 [ "convergencectrl"(token %0) ]
+ ret void
+}
+
+declare i1 @llvm.spv.wave.any(i1) #0
+declare i32 @llvm.spv.thread.id.i32(i32) #2
+declare token @llvm.experimental.convergence.entry() #0
+
+attributes #0 = { convergent mustprogress nocallback nofree nosync nounwind willreturn memory(none) }
+attributes #1 = { convergent mustprogress nofree noinline norecurse nosync nounwind willreturn memory(readwrite, inaccessiblemem: none) "frame-pointer"="all" "hlsl.numthreads"="4,1,1" "hlsl.shader"="compute" "no-infs-fp-math"="true" "no-nans-fp-math"="true" "no-signed-zeros-fp-math"="true" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
+attributes #2 = { mustprogress nofree nosync nounwind willreturn memory(none) }
More information about the llvm-commits
mailing list