[spirv-reader][ir] Fix premerge calculation. When determining the premerge block for an `if` instruction, make sure we don't select a walk stop block (like a `merge` instruction). This block can't be a premerge block as it has to come after the `if` merge block itself. Change-Id: I973fde66cf790d002562dcf19021d35462c8c4f4 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/245335 Commit-Queue: dan sinclair <dsinclair@chromium.org> Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/tint/lang/spirv/reader/parser/branch_test.cc b/src/tint/lang/spirv/reader/parser/branch_test.cc index 566c562..a0d7b17 100644 --- a/src/tint/lang/spirv/reader/parser/branch_test.cc +++ b/src/tint/lang/spirv/reader/parser/branch_test.cc
@@ -520,21 +520,21 @@ %main_start = OpLabel OpBranch %10 %10 = OpLabel - OpLoopMerge %merge %cont None + OpLoopMerge %99 %80 None OpBranch %20 %20 = OpLabel %foo = OpIAdd %i32 %one %two OpSelectionMerge %50 None OpBranchConditional %true %30 %40 %30 = OpLabel - OpBranch %merge + OpBranch %99 %40 = OpLabel - OpBranch %merge + OpBranch %99 %50 = OpLabel OpUnreachable - %cont = OpLabel + %80 = OpLabel OpBranch %10 - %merge = OpLabel + %99 = OpLabel %foo2 = OpCopyObject %i32 %foo OpReturn OpFunctionEnd @@ -553,22 +553,13 @@ exit_loop %3 # loop_1 } } - if true [t: $B6, f: $B7] { # if_2 - $B6: { # true - %4:i32 = let %3 - ret - } - $B7: { # false - unreachable - } - } unreachable } $B3: { # continuing next_iteration # -> $B2 } } - %5:i32 = let %2 + %4:i32 = let %2 ret } }
diff --git a/src/tint/lang/spirv/reader/parser/parser.cc b/src/tint/lang/spirv/reader/parser/parser.cc index 7801b9c..fe9c4e8 100644 --- a/src/tint/lang/spirv/reader/parser/parser.cc +++ b/src/tint/lang/spirv/reader/parser/parser.cc
@@ -1851,6 +1851,11 @@ true_blocks.pop_back(); false_blocks.pop_back(); } + + // If this is already a stop block, so it can't be a premerge + if (id.has_value() && walk_stop_blocks_.contains(id.value())) { + return std::nullopt; + } return id; }