[spirv-reader][ir] Mark loop bodies unreachable if possible.
If there was no terminator added to a loop body, then we know we can't
reach the end of the body, so mark it as `unreachable` instead of
injecting a `continue`.
Change-Id: I04687e47528613aae8acc35a87b98465cea6f319
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/245295
Reviewed-by: James Price <jrprice@google.com>
Auto-Submit: dan sinclair <dsinclair@chromium.org>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/spirv/reader/parser/branch_test.cc b/src/tint/lang/spirv/reader/parser/branch_test.cc
index d0fc55d..a10d2df 100644
--- a/src/tint/lang/spirv/reader/parser/branch_test.cc
+++ b/src/tint/lang/spirv/reader/parser/branch_test.cc
@@ -1379,7 +1379,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -1470,7 +1470,7 @@
unreachable
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -1523,7 +1523,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -1576,7 +1576,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -1630,7 +1630,7 @@
continue # -> $B3
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -1684,7 +1684,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -1737,7 +1737,7 @@
continue # -> $B3
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -1790,7 +1790,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -1854,7 +1854,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -1918,7 +1918,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -1987,7 +1987,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -2054,7 +2054,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -2118,7 +2118,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -2182,7 +2182,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -2249,7 +2249,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -2379,7 +2379,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -2450,7 +2450,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -2505,7 +2505,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -2566,7 +2566,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
if true [t: $B6, f: $B7] { # if_2
@@ -2628,7 +2628,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
break_if false # -> [t: exit_loop loop_1, f: $B2]
@@ -2682,7 +2682,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
%2:bool = not false
@@ -2750,7 +2750,7 @@
exit_loop # loop_2
}
}
- continue # -> $B7
+ unreachable
}
$B7: { # continuing
next_iteration # -> $B6
@@ -2762,7 +2762,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -2837,7 +2837,7 @@
exit_loop # loop_2
}
}
- continue # -> $B7
+ unreachable
}
$B7: { # continuing
next_iteration # -> $B6
@@ -2849,7 +2849,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -2924,7 +2924,7 @@
exit_loop # loop_2
}
}
- continue # -> $B7
+ unreachable
}
$B7: { # continuing
next_iteration # -> $B6
@@ -2936,7 +2936,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -3003,7 +3003,7 @@
exit_loop # loop_2
}
}
- continue # -> $B7
+ unreachable
}
$B7: { # continuing
%2:bool = not true
@@ -3016,7 +3016,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -3078,7 +3078,7 @@
exit_loop # loop_1
}
}
- continue # -> $B5
+ unreachable
}
$B5: { # continuing
next_iteration # -> $B4
@@ -3142,7 +3142,7 @@
exit_loop # loop_1
}
}
- continue # -> $B5
+ unreachable
}
$B5: { # continuing
next_iteration # -> $B4
@@ -3437,7 +3437,7 @@
unreachable
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -3729,7 +3729,7 @@
unreachable
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
%4:i32 = spirv.add<i32> 2i, 2i
@@ -3790,7 +3790,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
%4:i32 = spirv.add<i32> 3i, 3i
@@ -3851,7 +3851,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
%4:i32 = spirv.add<i32> 3i, 3i
@@ -4025,7 +4025,7 @@
continue # -> $B3
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
%3:i32 = spirv.add<i32> 2i, 2i
@@ -4084,7 +4084,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
%3:i32 = spirv.add<i32> 2i, 2i
@@ -4145,7 +4145,7 @@
continue # -> $B3
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
%4:i32 = spirv.add<i32> 3i, 3i
@@ -4206,7 +4206,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
%4:i32 = spirv.add<i32> 3i, 3i
@@ -4607,7 +4607,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
%2:bool = not true
@@ -4940,7 +4940,7 @@
continue # -> $B3
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -4995,7 +4995,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
next_iteration # -> $B2
@@ -5506,7 +5506,7 @@
unreachable
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
%5:i32 = spirv.add<i32> 3i, 3i
@@ -5570,7 +5570,7 @@
unreachable
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
%6:i32 = spirv.add<i32> 1i, 2i
@@ -5804,7 +5804,7 @@
exit_loop # loop_1
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
%6:i32 = spirv.add<i32> 1i, 3i
@@ -5872,7 +5872,7 @@
continue # -> $B3
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
%6:i32 = spirv.add<i32> 1i, 3i
@@ -5932,7 +5932,7 @@
unreachable
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
%5:i32 = spirv.add<i32> 3i, 3i
@@ -5996,7 +5996,7 @@
unreachable
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
%6:i32 = spirv.add<i32> 1i, 2i
@@ -6476,7 +6476,7 @@
continue # -> $B3
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
%6:i32 = spirv.add<i32> 1i, 3i
@@ -6544,7 +6544,7 @@
continue # -> $B3
}
}
- continue # -> $B3
+ unreachable
}
$B3: { # continuing
%6:i32 = spirv.add<i32> 1i, 3i
diff --git a/src/tint/lang/spirv/reader/parser/parser.cc b/src/tint/lang/spirv/reader/parser/parser.cc
index 872c48b..893370d 100644
--- a/src/tint/lang/spirv/reader/parser/parser.cc
+++ b/src/tint/lang/spirv/reader/parser/parser.cc
@@ -1481,14 +1481,9 @@
EmitBlockParent(loop->Continuing(), *bb_continue);
}
- // Add the body terminator after processing the continuing block in
- // case we've propagated values through the continue.
+ // Add the body terminator if necessary
if (!loop->Body()->Terminator()) {
- if (loop->Continuing()->Params().IsEmpty()) {
- loop->Body()->Append(b_.Continue(loop));
- } else {
- loop->Body()->Append(b_.Unreachable());
- }
+ loop->Body()->Append(b_.Unreachable());
}
if (!loop->Continuing()->Terminator()) {
loop->Continuing()->Append(b_.NextIteration(loop));