[Mlir-commits] [mlir] e7f357e - [mlir][SPIR-V] Fix deserializer crash on entry block selection header (#237137)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Fri Oct 30 02:59:40 PDT 2026
Author: Arseniy Obolenskiy
Date: 2026-10-30T10:59:36+01:00
New Revision: e7f357eef80501922ff47cf877e83da2343963a7
URL: https://github.com/llvm/llvm-project/commit/e7f357eef80501922ff47cf877e83da2343963a7
DIFF: https://github.com/llvm/llvm-project/commit/e7f357eef80501922ff47cf877e83da2343963a7.diff
LOG: [mlir][SPIR-V] Fix deserializer crash on entry block selection header (#237137)
Split the entry block when it also starts a selection, since it cannot
move into the region
Added:
mlir/test/Target/SPIRV/selection-entry-block.spvasm
Modified:
mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
Removed:
################################################################################
diff --git a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
index 42e5620e308e71..545ece9b7fb0a8 100644
--- a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
+++ b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
@@ -3056,8 +3056,9 @@ LogicalResult spirv::Deserializer::splitSelectionHeader() {
// Do not split a block that only contains a conditional branch / switch,
// unless it is also a merge block of another construct - in that case we
// want to split the block. We do not want two constructs to share header /
- // merge block.
- if (!llvm::hasSingleElement(*block) || splitHeaderMergeBlock) {
+ // merge block. The entry block cannot join a region, so split it too.
+ if (!llvm::hasSingleElement(*block) || splitHeaderMergeBlock ||
+ isFnEntryBlock(block)) {
Block *newBlock = block->splitBlock(terminator);
OpBuilder builder(block, block->end());
spirv::BranchOp::create(builder, block->getParent()->getLoc(), newBlock);
diff --git a/mlir/test/Target/SPIRV/selection-entry-block.spvasm b/mlir/test/Target/SPIRV/selection-entry-block.spvasm
new file mode 100644
index 00000000000000..3c3c5fc68f69ee
--- /dev/null
+++ b/mlir/test/Target/SPIRV/selection-entry-block.spvasm
@@ -0,0 +1,56 @@
+; RUN: %if spirv-tools %{ spirv-as --target-env spv1.0 %s -o - | mlir-translate --deserialize-spirv - -o - | FileCheck %s %}
+
+; COM: Check that a selection header that is also the function entry block is
+; COM: split, so the entry block stays outside the selection region.
+
+; CHECK-LABEL: spirv.func @branch_conditional
+; CHECK-NEXT: spirv.Branch ^[[HEADER:.+]]
+; CHECK-NEXT: ^[[HEADER]]:
+; CHECK-NEXT: spirv.mlir.selection {
+; CHECK-NEXT: spirv.BranchConditional
+; CHECK: spirv.mlir.merge
+; CHECK-NEXT: }
+; CHECK-NEXT: spirv.Return
+
+; CHECK-LABEL: spirv.func @switch
+; CHECK-NEXT: spirv.Branch ^[[HEADER:.+]]
+; CHECK-NEXT: ^[[HEADER]]:
+; CHECK-NEXT: spirv.mlir.selection {
+; CHECK-NEXT: spirv.Switch
+; CHECK: spirv.mlir.merge
+; CHECK-NEXT: }
+; CHECK-NEXT: spirv.Return
+
+ OpCapability Shader
+ OpCapability Linkage
+ OpMemoryModel Logical GLSL450
+ OpName %branch_conditional "branch_conditional"
+ OpName %switch "switch"
+ %void = OpTypeVoid
+ %bool = OpTypeBool
+ %int = OpTypeInt 32 1
+ %int_1 = OpConstant %int 1
+ %fn_bool = OpTypeFunction %void %bool
+ %fn_int = OpTypeFunction %void %int
+%branch_conditional = OpFunction %void None %fn_bool
+ %cond = OpFunctionParameter %bool
+ %bc_entry = OpLabel
+ OpSelectionMerge %bc_merge None
+ OpBranchConditional %cond %bc_true %bc_merge
+ %bc_true = OpLabel
+ %bc_add = OpIAdd %int %int_1 %int_1
+ OpBranch %bc_merge
+ %bc_merge = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %switch = OpFunction %void None %fn_int
+ %sel = OpFunctionParameter %int
+ %sw_entry = OpLabel
+ OpSelectionMerge %sw_merge None
+ OpSwitch %sel %sw_merge 1 %sw_case
+ %sw_case = OpLabel
+ %sw_add = OpIAdd %int %sel %sel
+ OpBranch %sw_merge
+ %sw_merge = OpLabel
+ OpReturn
+ OpFunctionEnd
More information about the Mlir-commits
mailing list