[spirv] Use PreventInfiniteLoops transform
This hardens potentially infinite loops to prevent them from being
exploited to circumvent bounds checks.
Add support for loop results in the transform. This won't happen for
any WGSL shader input, but some if the backend unit tests do this.
Bug: 380090814
Change-Id: I7c940c86b5b0194ba4fc7ea09e8148761de28430
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/217374
Commit-Queue: James Price <jrprice@google.com>
Reviewed-by: David Neto <dneto@google.com>
Commit-Queue: David Neto <dneto@google.com>
diff --git a/src/tint/lang/core/ir/transform/prevent_infinite_loops.cc b/src/tint/lang/core/ir/transform/prevent_infinite_loops.cc
index 0c8568b..cff5685 100644
--- a/src/tint/lang/core/ir/transform/prevent_infinite_loops.cc
+++ b/src/tint/lang/core/ir/transform/prevent_infinite_loops.cc
@@ -27,6 +27,8 @@
#include "src/tint/lang/core/ir/transform/prevent_infinite_loops.h"
+#include <utility>
+
#include "src/tint/lang/core/ir/analysis/loop_analysis.h"
#include "src/tint/lang/core/ir/builder.h"
#include "src/tint/lang/core/ir/module.h"
@@ -88,7 +90,13 @@
auto* ifelse = b.If(
b.Call<bool>(BuiltinFn::kAll,
b.Equal<vec2<bool>>(b.Load(idx), b.Splat<vec2<u32>>(u32::Highest()))));
- b.Append(ifelse->True(), [&] { b.ExitLoop(loop); });
+ b.Append(ifelse->True(), [&] {
+ // If the loop produces result values, just use `undef` as this exit condition
+ // should never actually be hit.
+ Vector<Value*, 1> results;
+ results.Resize(loop->Results().Length(), nullptr);
+ b.ExitLoop(loop, std::move(results));
+ });
});
// Increment the index variable at the top of the continuing block.
diff --git a/src/tint/lang/core/ir/transform/prevent_infinite_loops_test.cc b/src/tint/lang/core/ir/transform/prevent_infinite_loops_test.cc
index 7de5a56..64849d8 100644
--- a/src/tint/lang/core/ir/transform/prevent_infinite_loops_test.cc
+++ b/src/tint/lang/core/ir/transform/prevent_infinite_loops_test.cc
@@ -721,5 +721,130 @@
EXPECT_EQ(expect, str());
}
+TEST_F(IR_PreventInfiniteLoopsTest, LoopResults) {
+ auto* func = b.Function("func", ty.void_());
+ b.Append(func->Block(), [&] { //
+ auto* loop = b.Loop();
+ loop->SetResults(Vector{
+ b.InstructionResult<u32>(),
+ b.InstructionResult<i32>(),
+ b.InstructionResult<f32>(),
+ b.InstructionResult<bool>(),
+ });
+ b.Append(loop->Initializer(), [&] {
+ auto* idx = b.Var<function, u32>("idx");
+ b.NextIteration(loop);
+
+ b.Append(loop->Body(), [&] {
+ auto* ifelse = b.If(b.LessThan<bool>(b.Load(idx), 10_u));
+ b.Append(ifelse->True(), [&] { //
+ b.ExitIf(ifelse);
+ });
+ b.Append(ifelse->False(), [&] { //
+ b.ExitLoop(loop, 1_u, 2_i, 3_f, true);
+ });
+ b.Store(idx, 0_u);
+ b.Continue(loop);
+
+ b.Append(loop->Continuing(), [&] { //
+ b.Store(idx, b.Add<u32>(b.Load(idx), 1_u));
+ b.NextIteration(loop);
+ });
+ });
+ });
+ b.Return(func);
+ });
+
+ auto* src = R"(
+%func = func():void {
+ $B1: {
+ %2:u32, %3:i32, %4:f32, %5:bool = loop [i: $B2, b: $B3, c: $B4] { # loop_1
+ $B2: { # initializer
+ %idx:ptr<function, u32, read_write> = var
+ next_iteration # -> $B3
+ }
+ $B3: { # body
+ %7:u32 = load %idx
+ %8:bool = lt %7, 10u
+ if %8 [t: $B5, f: $B6] { # if_1
+ $B5: { # true
+ exit_if # if_1
+ }
+ $B6: { # false
+ exit_loop 1u, 2i, 3.0f, true # loop_1
+ }
+ }
+ store %idx, 0u
+ continue # -> $B4
+ }
+ $B4: { # continuing
+ %9:u32 = load %idx
+ %10:u32 = add %9, 1u
+ store %idx, %10
+ next_iteration # -> $B3
+ }
+ }
+ ret
+ }
+}
+)";
+ EXPECT_EQ(src, str());
+
+ auto* expect = R"(
+%func = func():void {
+ $B1: {
+ %2:u32, %3:i32, %4:f32, %5:bool = loop [i: $B2, b: $B3, c: $B4] { # loop_1
+ $B2: { # initializer
+ %tint_loop_idx:ptr<function, vec2<u32>, read_write> = var
+ %idx:ptr<function, u32, read_write> = var
+ next_iteration # -> $B3
+ }
+ $B3: { # body
+ %8:vec2<u32> = load %tint_loop_idx
+ %9:vec2<bool> = eq %8, vec2<u32>(4294967295u)
+ %10:bool = all %9
+ if %10 [t: $B5] { # if_1
+ $B5: { # true
+ exit_loop undef, undef, undef, undef # loop_1
+ }
+ }
+ %11:u32 = load %idx
+ %12:bool = lt %11, 10u
+ if %12 [t: $B6, f: $B7] { # if_2
+ $B6: { # true
+ exit_if # if_2
+ }
+ $B7: { # false
+ exit_loop 1u, 2i, 3.0f, true # loop_1
+ }
+ }
+ store %idx, 0u
+ continue # -> $B4
+ }
+ $B4: { # continuing
+ %13:u32 = load_vector_element %tint_loop_idx, 0u
+ %tint_low_inc:u32 = add %13, 1u
+ store_vector_element %tint_loop_idx, 0u, %tint_low_inc
+ %15:bool = eq %tint_low_inc, 0u
+ %tint_carry:u32 = convert %15
+ %17:u32 = load_vector_element %tint_loop_idx, 1u
+ %18:u32 = add %17, %tint_carry
+ store_vector_element %tint_loop_idx, 1u, %18
+ %19:u32 = load %idx
+ %20:u32 = add %19, 1u
+ store %idx, %20
+ next_iteration # -> $B3
+ }
+ }
+ ret
+ }
+}
+)";
+
+ Run(PreventInfiniteLoops);
+
+ EXPECT_EQ(expect, str());
+}
+
} // namespace
} // namespace tint::core::ir::transform
diff --git a/src/tint/lang/spirv/writer/loop_test.cc b/src/tint/lang/spirv/writer/loop_test.cc
index 524d7de..9aaefa2 100644
--- a/src/tint/lang/spirv/writer/loop_test.cc
+++ b/src/tint/lang/spirv/writer/loop_test.cc
@@ -46,7 +46,9 @@
b.Return(func);
});
- ASSERT_TRUE(Generate()) << Error() << output_;
+ Options options;
+ options.disable_robustness = true;
+ ASSERT_TRUE(Generate(options)) << Error() << output_;
EXPECT_INST(R"(
%4 = OpLabel
OpBranch %7
@@ -63,6 +65,62 @@
)");
}
+TEST_F(SpirvWriterTest, Loop_BreakIf_WithRobustness) {
+ auto* func = b.Function("foo", ty.void_());
+ b.Append(func->Block(), [&] {
+ auto* loop = b.Loop();
+ b.Append(loop->Body(), [&] { //
+ b.Continue(loop);
+
+ b.Append(loop->Continuing(), [&] { //
+ b.BreakIf(loop, true);
+ });
+ });
+ b.Return(func);
+ });
+
+ ASSERT_TRUE(Generate()) << Error() << output_;
+ EXPECT_INST("%17 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295");
+ EXPECT_INST(R"(
+ %4 = OpLabel
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %14
+ OpBranch %5
+ %5 = OpLabel
+ OpBranch %8
+ %8 = OpLabel
+ OpLoopMerge %9 %7 None
+ OpBranch %6
+ %6 = OpLabel
+ %15 = OpLoad %v2uint %tint_loop_idx None
+ %16 = OpIEqual %v2bool %15 %17
+ %21 = OpAll %bool %16
+ OpSelectionMerge %22 None
+ OpBranchConditional %21 %23 %22
+ %23 = OpLabel
+ OpBranch %9
+ %22 = OpLabel
+ OpBranch %7
+ %7 = OpLabel
+ %24 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %27 = OpLoad %uint %24 None
+%tint_low_inc = OpIAdd %uint %27 %uint_1
+ %30 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %30 %tint_low_inc None
+ %31 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %31 %uint_1 %uint_0
+ %33 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %34 = OpLoad %uint %33 None
+ %35 = OpIAdd %uint %34 %tint_carry
+ %36 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %36 %35 None
+ OpBranchConditional %true %9 %8
+ %9 = OpLabel
+ OpReturn
+ OpFunctionEnd
+
+)");
+}
+
// Test that we still emit the continuing block with a back-edge, even when it is unreachable.
TEST_F(SpirvWriterTest, Loop_UnconditionalBreakInBody) {
auto* func = b.Function("foo", ty.void_());
@@ -74,7 +132,9 @@
b.Return(func);
});
- ASSERT_TRUE(Generate()) << Error() << output_;
+ Options options;
+ options.disable_robustness = true;
+ ASSERT_TRUE(Generate(options)) << Error() << output_;
EXPECT_INST(R"(
%4 = OpLabel
OpBranch %7
@@ -112,7 +172,9 @@
b.Return(func);
});
- ASSERT_TRUE(Generate()) << Error() << output_;
+ Options options;
+ options.disable_robustness = true;
+ ASSERT_TRUE(Generate(options)) << Error() << output_;
EXPECT_INST(R"(
%4 = OpLabel
OpBranch %7
@@ -155,7 +217,9 @@
b.Return(func);
});
- ASSERT_TRUE(Generate()) << Error() << output_;
+ Options options;
+ options.disable_robustness = true;
+ ASSERT_TRUE(Generate(options)) << Error() << output_;
EXPECT_INST(R"(
%4 = OpLabel
OpBranch %7
@@ -189,7 +253,9 @@
b.Unreachable();
});
- ASSERT_TRUE(Generate()) << Error() << output_;
+ Options options;
+ options.disable_robustness = true;
+ ASSERT_TRUE(Generate(options)) << Error() << output_;
EXPECT_INST(R"(
%4 = OpLabel
OpBranch %7
@@ -221,7 +287,9 @@
b.Return(func);
});
- ASSERT_TRUE(Generate()) << Error() << output_;
+ Options options;
+ options.disable_robustness = true;
+ ASSERT_TRUE(Generate(options)) << Error() << output_;
EXPECT_INST(R"(
%4 = OpLabel
OpBranch %7
@@ -262,7 +330,9 @@
b.Return(func);
});
- ASSERT_TRUE(Generate()) << Error() << output_;
+ Options options;
+ options.disable_robustness = true;
+ ASSERT_TRUE(Generate(options)) << Error() << output_;
EXPECT_INST(R"(
%4 = OpLabel
OpBranch %7
@@ -310,7 +380,9 @@
b.Return(func);
});
- ASSERT_TRUE(Generate()) << Error() << output_;
+ Options options;
+ options.disable_robustness = true;
+ ASSERT_TRUE(Generate(options)) << Error() << output_;
EXPECT_INST(R"(
%4 = OpLabel
OpBranch %7
@@ -369,7 +441,9 @@
b.Return(func);
});
- ASSERT_TRUE(Generate()) << Error() << output_;
+ Options options;
+ options.disable_robustness = true;
+ ASSERT_TRUE(Generate(options)) << Error() << output_;
EXPECT_INST(R"(
%4 = OpLabel
OpBranch %7
@@ -435,7 +509,9 @@
b.Return(func, outer_result);
});
- ASSERT_TRUE(Generate()) << Error() << output_;
+ Options options;
+ options.disable_robustness = true;
+ ASSERT_TRUE(Generate(options)) << Error() << output_;
EXPECT_INST(R"(
%4 = OpLabel
OpBranch %7
@@ -504,7 +580,9 @@
b.Return(func);
});
- ASSERT_TRUE(Generate()) << Error() << output_;
+ Options options;
+ options.disable_robustness = true;
+ ASSERT_TRUE(Generate(options)) << Error() << output_;
EXPECT_INST(R"(
%5 = OpLabel
OpBranch %8
@@ -556,7 +634,9 @@
b.Return(func);
});
- ASSERT_TRUE(Generate()) << Error() << output_;
+ Options options;
+ options.disable_robustness = true;
+ ASSERT_TRUE(Generate(options)) << Error() << output_;
EXPECT_INST(R"(
%5 = OpLabel
OpBranch %8
@@ -613,7 +693,9 @@
b.Return(func);
});
- ASSERT_TRUE(Generate()) << Error() << output_;
+ Options options;
+ options.disable_robustness = true;
+ ASSERT_TRUE(Generate(options)) << Error() << output_;
EXPECT_INST(R"(
%4 = OpLabel
OpBranch %5
@@ -679,7 +761,9 @@
b.Return(func);
});
- ASSERT_TRUE(Generate()) << Error() << output_;
+ Options options;
+ options.disable_robustness = true;
+ ASSERT_TRUE(Generate(options)) << Error() << output_;
EXPECT_INST(R"(
%4 = OpLabel
OpBranch %5
@@ -735,7 +819,9 @@
b.Return(func);
});
- ASSERT_TRUE(Generate()) << Error() << output_;
+ Options options;
+ options.disable_robustness = true;
+ ASSERT_TRUE(Generate(options)) << Error() << output_;
EXPECT_INST("%15 = OpUndef %bool");
EXPECT_INST(R"(
%4 = OpLabel
@@ -786,7 +872,9 @@
}
)");
- ASSERT_TRUE(Generate()) << Error() << output_;
+ Options options;
+ options.disable_robustness = true;
+ ASSERT_TRUE(Generate(options)) << Error() << output_;
EXPECT_INST(R"(
%4 = OpLabel
OpBranch %7
@@ -845,7 +933,9 @@
}
)");
- ASSERT_TRUE(Generate()) << Error() << output_;
+ Options options;
+ options.disable_robustness = true;
+ ASSERT_TRUE(Generate(options)) << Error() << output_;
EXPECT_INST(R"(
%4 = OpLabel
OpBranch %7
diff --git a/src/tint/lang/spirv/writer/raise/raise.cc b/src/tint/lang/spirv/writer/raise/raise.cc
index e3b1231..871590e 100644
--- a/src/tint/lang/spirv/writer/raise/raise.cc
+++ b/src/tint/lang/spirv/writer/raise/raise.cc
@@ -41,6 +41,7 @@
#include "src/tint/lang/core/ir/transform/direct_variable_access.h"
#include "src/tint/lang/core/ir/transform/multiplanar_external_texture.h"
#include "src/tint/lang/core/ir/transform/preserve_padding.h"
+#include "src/tint/lang/core/ir/transform/prevent_infinite_loops.h"
#include "src/tint/lang/core/ir/transform/robustness.h"
#include "src/tint/lang/core/ir/transform/std140.h"
#include "src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors.h"
@@ -72,6 +73,10 @@
RUN_TRANSFORM(core::ir::transform::BindingRemapper, module, remapper_data);
+ if (!options.disable_robustness) {
+ RUN_TRANSFORM(core::ir::transform::PreventInfiniteLoops, module);
+ }
+
core::ir::transform::BinaryPolyfillConfig binary_polyfills;
binary_polyfills.bitshift_modulo = true;
binary_polyfills.int_div_mod = !options.disable_polyfill_integer_div_mod;
diff --git a/src/tint/lang/spirv/writer/writer_test.cc b/src/tint/lang/spirv/writer/writer_test.cc
index eb4e367..55a2a6b 100644
--- a/src/tint/lang/spirv/writer/writer_test.cc
+++ b/src/tint/lang/spirv/writer/writer_test.cc
@@ -72,7 +72,9 @@
b.Return(func);
});
- ASSERT_TRUE(Generate()) << Error() << output_;
+ Options options;
+ options.disable_robustness = true;
+ ASSERT_TRUE(Generate(options)) << Error() << output_;
EXPECT_INST(R"(
%foo = OpFunction %void None %3
%4 = OpLabel
diff --git a/test/tint/bug/chromium/1403752.wgsl.expected.spvasm b/test/tint/bug/chromium/1403752.wgsl.expected.spvasm
index ede4c3b..5218a0f 100644
--- a/test/tint/bug/chromium/1403752.wgsl.expected.spvasm
+++ b/test/tint/bug/chromium/1403752.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 19
+; Bound: 46
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -9,34 +9,70 @@
OpExecutionMode %unused_entry_point LocalSize 1 1 1
OpName %d "d"
OpName %j "j"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%void = OpTypeVoid
%3 = OpTypeFunction %void
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%8 = OpConstantNull %int
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %18 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%false = OpConstantFalse %bool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%d = OpFunction %void None %3
%4 = OpLabel
%j = OpVariable %_ptr_Function_int Function %8
- OpBranch %11
- %11 = OpLabel
- OpLoopMerge %12 %10 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %18
OpBranch %9
%9 = OpLabel
- OpSelectionMerge %13 None
- OpBranchConditional %false %13 %14
- %14 = OpLabel
OpBranch %12
- %13 = OpLabel
+ %12 = OpLabel
+ OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
+ %27 = OpLabel
+ OpBranch %13
+ %26 = OpLabel
+ OpSelectionMerge %28 None
+ OpBranchConditional %false %28 %29
+ %29 = OpLabel
+ OpBranch %13
+ %28 = OpLabel
OpBranch %11
- %12 = OpLabel
+ %11 = OpLabel
+ %31 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %34 = OpLoad %uint %31 None
+%tint_low_inc = OpIAdd %uint %34 %uint_1
+ %37 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %37 %tint_low_inc None
+ %38 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %38 %uint_1 %uint_0
+ %40 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %41 = OpLoad %uint %40 None
+ %42 = OpIAdd %uint %41 %tint_carry
+ %43 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %43 %42 None
+ OpBranch %12
+ %13 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %3
- %18 = OpLabel
+ %45 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/bug/chromium/1449538.wgsl.expected.spvasm b/test/tint/bug/chromium/1449538.wgsl.expected.spvasm
index c8d6def..f880bdb 100644
--- a/test/tint/bug/chromium/1449538.wgsl.expected.spvasm
+++ b/test/tint/bug/chromium/1449538.wgsl.expected.spvasm
@@ -1,38 +1,80 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 76
+; Bound: 214
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
OpExecutionMode %unused_entry_point LocalSize 1 1 1
OpName %f "f"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %i0520 "i0520"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
+ OpName %tint_loop_idx_0 "tint_loop_idx"
OpName %i62 "i62"
+ OpName %tint_low_inc_1 "tint_low_inc_1"
+ OpName %tint_carry_1 "tint_carry_1"
+ OpName %tint_loop_idx_1 "tint_loop_idx"
OpName %i0520_0 "i0520"
+ OpName %tint_low_inc_2 "tint_low_inc_2"
+ OpName %tint_carry_2 "tint_carry_2"
+ OpName %tint_loop_idx_2 "tint_loop_idx"
OpName %i62_0 "i62"
+ OpName %tint_low_inc_3 "tint_low_inc_3"
+ OpName %tint_carry_3 "tint_carry_3"
+ OpName %tint_loop_idx_3 "tint_loop_idx"
OpName %i62_1 "i62"
+ OpName %tint_low_inc_4 "tint_low_inc_4"
+ OpName %tint_carry_4 "tint_carry_4"
+ OpName %tint_loop_idx_4 "tint_loop_idx"
OpName %i60 "i60"
+ OpName %tint_low_inc_5 "tint_low_inc_5"
+ OpName %tint_carry_5 "tint_carry_5"
+ OpName %tint_loop_idx_5 "tint_loop_idx"
OpName %i62_2 "i62"
+ OpName %tint_low_inc_6 "tint_low_inc_6"
+ OpName %tint_carry_6 "tint_carry_6"
+ OpName %tint_loop_idx_6 "tint_loop_idx"
OpName %i60_0 "i60"
+ OpName %tint_low_inc_7 "tint_low_inc_7"
+ OpName %tint_carry_7 "tint_carry_7"
OpName %unused_entry_point "unused_entry_point"
%void = OpTypeVoid
%3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %14 = OpConstantNull %v2uint
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%false = OpConstantFalse %bool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%f = OpFunction %void None %3
%4 = OpLabel
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %14
%i0520 = OpVariable %_ptr_Function_int Function
+%tint_loop_idx_0 = OpVariable %_ptr_Function_v2uint Function %14
%i62 = OpVariable %_ptr_Function_int Function
+%tint_loop_idx_1 = OpVariable %_ptr_Function_v2uint Function %14
%i0520_0 = OpVariable %_ptr_Function_int Function
+%tint_loop_idx_2 = OpVariable %_ptr_Function_v2uint Function %14
%i62_0 = OpVariable %_ptr_Function_int Function
+%tint_loop_idx_3 = OpVariable %_ptr_Function_v2uint Function %14
%i62_1 = OpVariable %_ptr_Function_int Function
+%tint_loop_idx_4 = OpVariable %_ptr_Function_v2uint Function %14
%i60 = OpVariable %_ptr_Function_int Function
+%tint_loop_idx_5 = OpVariable %_ptr_Function_v2uint Function %14
%i62_2 = OpVariable %_ptr_Function_int Function
+%tint_loop_idx_6 = OpVariable %_ptr_Function_v2uint Function %14
%i60_0 = OpVariable %_ptr_Function_int Function
OpBranch %5
%5 = OpLabel
@@ -42,137 +84,297 @@
OpLoopMerge %9 %7 None
OpBranch %6
%6 = OpLabel
- OpSelectionMerge %14 None
- OpBranchConditional %false %14 %15
- %15 = OpLabel
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
+ %27 = OpLabel
OpBranch %9
- %14 = OpLabel
+ %26 = OpLabel
+ OpSelectionMerge %28 None
+ OpBranchConditional %false %28 %29
+ %29 = OpLabel
+ OpBranch %9
+ %28 = OpLabel
OpBranch %7
%7 = OpLabel
+ %31 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %34 = OpLoad %uint %31 None
+%tint_low_inc = OpIAdd %uint %34 %uint_1
+ %37 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %37 %tint_low_inc None
+ %38 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %38 %uint_1 %uint_0
+ %40 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %41 = OpLoad %uint %40 None
+ %42 = OpIAdd %uint %41 %tint_carry
+ %43 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %43 %42 None
OpBranch %8
%9 = OpLabel
- OpBranch %18
- %18 = OpLabel
- OpStore %i62 %int_0
- OpBranch %21
- %21 = OpLabel
- OpLoopMerge %22 %20 None
- OpBranch %19
- %19 = OpLabel
- OpSelectionMerge %24 None
- OpBranchConditional %false %24 %25
- %25 = OpLabel
- OpBranch %22
- %24 = OpLabel
- OpBranch %20
- %20 = OpLabel
- OpBranch %21
- %22 = OpLabel
- OpBranch %26
- %26 = OpLabel
- OpStore %i0520_0 %int_0
- OpBranch %29
- %29 = OpLabel
- OpLoopMerge %30 %28 None
- OpBranch %27
- %27 = OpLabel
- OpSelectionMerge %32 None
- OpBranchConditional %false %32 %33
- %33 = OpLabel
- OpBranch %30
- %32 = OpLabel
- OpBranch %28
- %28 = OpLabel
- OpBranch %29
- %30 = OpLabel
- OpBranch %34
- %34 = OpLabel
- OpStore %i62_0 %int_0
- OpBranch %37
- %37 = OpLabel
- OpLoopMerge %38 %36 None
- OpBranch %35
- %35 = OpLabel
- OpSelectionMerge %40 None
- OpBranchConditional %false %40 %41
- %41 = OpLabel
- OpBranch %38
- %40 = OpLabel
- OpBranch %36
- %36 = OpLabel
- OpBranch %37
- %38 = OpLabel
- OpBranch %42
- %42 = OpLabel
- OpStore %i62_1 %int_0
- OpBranch %45
- %45 = OpLabel
- OpLoopMerge %46 %44 None
- OpBranch %43
- %43 = OpLabel
- OpSelectionMerge %48 None
- OpBranchConditional %false %48 %49
- %49 = OpLabel
- OpBranch %46
- %48 = OpLabel
OpBranch %44
%44 = OpLabel
+ OpStore %i62 %int_0
+ OpBranch %47
+ %47 = OpLabel
+ OpLoopMerge %48 %46 None
OpBranch %45
- %46 = OpLabel
- OpBranch %50
- %50 = OpLabel
- OpStore %i60 %int_0
- OpBranch %53
- %53 = OpLabel
- OpLoopMerge %54 %52 None
- OpBranch %51
- %51 = OpLabel
+ %45 = OpLabel
+ %51 = OpLoad %v2uint %tint_loop_idx_0 None
+ %52 = OpIEqual %v2bool %51 %21
+ %53 = OpAll %bool %52
+ OpSelectionMerge %54 None
+ OpBranchConditional %53 %55 %54
+ %55 = OpLabel
+ OpBranch %48
+ %54 = OpLabel
OpSelectionMerge %56 None
OpBranchConditional %false %56 %57
%57 = OpLabel
- OpBranch %54
+ OpBranch %48
%56 = OpLabel
- OpBranch %52
- %52 = OpLabel
- OpBranch %53
- %54 = OpLabel
- OpBranch %58
- %58 = OpLabel
- OpStore %i62_2 %int_0
- OpBranch %61
- %61 = OpLabel
- OpLoopMerge %62 %60 None
- OpBranch %59
- %59 = OpLabel
- OpSelectionMerge %64 None
- OpBranchConditional %false %64 %65
- %65 = OpLabel
- OpBranch %62
- %64 = OpLabel
- OpBranch %60
- %60 = OpLabel
- OpBranch %61
- %62 = OpLabel
- OpBranch %66
- %66 = OpLabel
- OpStore %i60_0 %int_0
- OpBranch %69
- %69 = OpLabel
- OpLoopMerge %70 %68 None
- OpBranch %67
- %67 = OpLabel
- OpSelectionMerge %72 None
- OpBranchConditional %false %72 %73
- %73 = OpLabel
- OpBranch %70
- %72 = OpLabel
+ OpBranch %46
+ %46 = OpLabel
+ %58 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ %59 = OpLoad %uint %58 None
+%tint_low_inc_1 = OpIAdd %uint %59 %uint_1
+ %61 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ OpStore %61 %tint_low_inc_1 None
+ %62 = OpIEqual %bool %tint_low_inc_1 %uint_0
+%tint_carry_1 = OpSelect %uint %62 %uint_1 %uint_0
+ %64 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ %65 = OpLoad %uint %64 None
+ %66 = OpIAdd %uint %65 %tint_carry_1
+ %67 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ OpStore %67 %66 None
+ OpBranch %47
+ %48 = OpLabel
OpBranch %68
%68 = OpLabel
+ OpStore %i0520_0 %int_0
+ OpBranch %71
+ %71 = OpLabel
+ OpLoopMerge %72 %70 None
OpBranch %69
+ %69 = OpLabel
+ %75 = OpLoad %v2uint %tint_loop_idx_1 None
+ %76 = OpIEqual %v2bool %75 %21
+ %77 = OpAll %bool %76
+ OpSelectionMerge %78 None
+ OpBranchConditional %77 %79 %78
+ %79 = OpLabel
+ OpBranch %72
+ %78 = OpLabel
+ OpSelectionMerge %80 None
+ OpBranchConditional %false %80 %81
+ %81 = OpLabel
+ OpBranch %72
+ %80 = OpLabel
+ OpBranch %70
%70 = OpLabel
+ %82 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_1 %uint_0
+ %83 = OpLoad %uint %82 None
+%tint_low_inc_2 = OpIAdd %uint %83 %uint_1
+ %85 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_1 %uint_0
+ OpStore %85 %tint_low_inc_2 None
+ %86 = OpIEqual %bool %tint_low_inc_2 %uint_0
+%tint_carry_2 = OpSelect %uint %86 %uint_1 %uint_0
+ %88 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_1 %uint_1
+ %89 = OpLoad %uint %88 None
+ %90 = OpIAdd %uint %89 %tint_carry_2
+ %91 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_1 %uint_1
+ OpStore %91 %90 None
+ OpBranch %71
+ %72 = OpLabel
+ OpBranch %92
+ %92 = OpLabel
+ OpStore %i62_0 %int_0
+ OpBranch %95
+ %95 = OpLabel
+ OpLoopMerge %96 %94 None
+ OpBranch %93
+ %93 = OpLabel
+ %99 = OpLoad %v2uint %tint_loop_idx_2 None
+ %100 = OpIEqual %v2bool %99 %21
+ %101 = OpAll %bool %100
+ OpSelectionMerge %102 None
+ OpBranchConditional %101 %103 %102
+ %103 = OpLabel
+ OpBranch %96
+ %102 = OpLabel
+ OpSelectionMerge %104 None
+ OpBranchConditional %false %104 %105
+ %105 = OpLabel
+ OpBranch %96
+ %104 = OpLabel
+ OpBranch %94
+ %94 = OpLabel
+ %106 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_2 %uint_0
+ %107 = OpLoad %uint %106 None
+%tint_low_inc_3 = OpIAdd %uint %107 %uint_1
+ %109 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_2 %uint_0
+ OpStore %109 %tint_low_inc_3 None
+ %110 = OpIEqual %bool %tint_low_inc_3 %uint_0
+%tint_carry_3 = OpSelect %uint %110 %uint_1 %uint_0
+ %112 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_2 %uint_1
+ %113 = OpLoad %uint %112 None
+ %114 = OpIAdd %uint %113 %tint_carry_3
+ %115 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_2 %uint_1
+ OpStore %115 %114 None
+ OpBranch %95
+ %96 = OpLabel
+ OpBranch %116
+ %116 = OpLabel
+ OpStore %i62_1 %int_0
+ OpBranch %119
+ %119 = OpLabel
+ OpLoopMerge %120 %118 None
+ OpBranch %117
+ %117 = OpLabel
+ %123 = OpLoad %v2uint %tint_loop_idx_3 None
+ %124 = OpIEqual %v2bool %123 %21
+ %125 = OpAll %bool %124
+ OpSelectionMerge %126 None
+ OpBranchConditional %125 %127 %126
+ %127 = OpLabel
+ OpBranch %120
+ %126 = OpLabel
+ OpSelectionMerge %128 None
+ OpBranchConditional %false %128 %129
+ %129 = OpLabel
+ OpBranch %120
+ %128 = OpLabel
+ OpBranch %118
+ %118 = OpLabel
+ %130 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_3 %uint_0
+ %131 = OpLoad %uint %130 None
+%tint_low_inc_4 = OpIAdd %uint %131 %uint_1
+ %133 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_3 %uint_0
+ OpStore %133 %tint_low_inc_4 None
+ %134 = OpIEqual %bool %tint_low_inc_4 %uint_0
+%tint_carry_4 = OpSelect %uint %134 %uint_1 %uint_0
+ %136 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_3 %uint_1
+ %137 = OpLoad %uint %136 None
+ %138 = OpIAdd %uint %137 %tint_carry_4
+ %139 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_3 %uint_1
+ OpStore %139 %138 None
+ OpBranch %119
+ %120 = OpLabel
+ OpBranch %140
+ %140 = OpLabel
+ OpStore %i60 %int_0
+ OpBranch %143
+ %143 = OpLabel
+ OpLoopMerge %144 %142 None
+ OpBranch %141
+ %141 = OpLabel
+ %147 = OpLoad %v2uint %tint_loop_idx_4 None
+ %148 = OpIEqual %v2bool %147 %21
+ %149 = OpAll %bool %148
+ OpSelectionMerge %150 None
+ OpBranchConditional %149 %151 %150
+ %151 = OpLabel
+ OpBranch %144
+ %150 = OpLabel
+ OpSelectionMerge %152 None
+ OpBranchConditional %false %152 %153
+ %153 = OpLabel
+ OpBranch %144
+ %152 = OpLabel
+ OpBranch %142
+ %142 = OpLabel
+ %154 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_4 %uint_0
+ %155 = OpLoad %uint %154 None
+%tint_low_inc_5 = OpIAdd %uint %155 %uint_1
+ %157 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_4 %uint_0
+ OpStore %157 %tint_low_inc_5 None
+ %158 = OpIEqual %bool %tint_low_inc_5 %uint_0
+%tint_carry_5 = OpSelect %uint %158 %uint_1 %uint_0
+ %160 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_4 %uint_1
+ %161 = OpLoad %uint %160 None
+ %162 = OpIAdd %uint %161 %tint_carry_5
+ %163 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_4 %uint_1
+ OpStore %163 %162 None
+ OpBranch %143
+ %144 = OpLabel
+ OpBranch %164
+ %164 = OpLabel
+ OpStore %i62_2 %int_0
+ OpBranch %167
+ %167 = OpLabel
+ OpLoopMerge %168 %166 None
+ OpBranch %165
+ %165 = OpLabel
+ %171 = OpLoad %v2uint %tint_loop_idx_5 None
+ %172 = OpIEqual %v2bool %171 %21
+ %173 = OpAll %bool %172
+ OpSelectionMerge %174 None
+ OpBranchConditional %173 %175 %174
+ %175 = OpLabel
+ OpBranch %168
+ %174 = OpLabel
+ OpSelectionMerge %176 None
+ OpBranchConditional %false %176 %177
+ %177 = OpLabel
+ OpBranch %168
+ %176 = OpLabel
+ OpBranch %166
+ %166 = OpLabel
+ %178 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_5 %uint_0
+ %179 = OpLoad %uint %178 None
+%tint_low_inc_6 = OpIAdd %uint %179 %uint_1
+ %181 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_5 %uint_0
+ OpStore %181 %tint_low_inc_6 None
+ %182 = OpIEqual %bool %tint_low_inc_6 %uint_0
+%tint_carry_6 = OpSelect %uint %182 %uint_1 %uint_0
+ %184 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_5 %uint_1
+ %185 = OpLoad %uint %184 None
+ %186 = OpIAdd %uint %185 %tint_carry_6
+ %187 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_5 %uint_1
+ OpStore %187 %186 None
+ OpBranch %167
+ %168 = OpLabel
+ OpBranch %188
+ %188 = OpLabel
+ OpStore %i60_0 %int_0
+ OpBranch %191
+ %191 = OpLabel
+ OpLoopMerge %192 %190 None
+ OpBranch %189
+ %189 = OpLabel
+ %195 = OpLoad %v2uint %tint_loop_idx_6 None
+ %196 = OpIEqual %v2bool %195 %21
+ %197 = OpAll %bool %196
+ OpSelectionMerge %198 None
+ OpBranchConditional %197 %199 %198
+ %199 = OpLabel
+ OpBranch %192
+ %198 = OpLabel
+ OpSelectionMerge %200 None
+ OpBranchConditional %false %200 %201
+ %201 = OpLabel
+ OpBranch %192
+ %200 = OpLabel
+ OpBranch %190
+ %190 = OpLabel
+ %202 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_6 %uint_0
+ %203 = OpLoad %uint %202 None
+%tint_low_inc_7 = OpIAdd %uint %203 %uint_1
+ %205 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_6 %uint_0
+ OpStore %205 %tint_low_inc_7 None
+ %206 = OpIEqual %bool %tint_low_inc_7 %uint_0
+%tint_carry_7 = OpSelect %uint %206 %uint_1 %uint_0
+ %208 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_6 %uint_1
+ %209 = OpLoad %uint %208 None
+ %210 = OpIAdd %uint %209 %tint_carry_7
+ %211 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_6 %uint_1
+ OpStore %211 %210 None
+ OpBranch %191
+ %192 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %3
- %75 = OpLabel
+ %213 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.spvasm b/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.spvasm
index 42df0a0..b30a673 100644
--- a/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.spvasm
+++ b/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 78
+; Bound: 105
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -16,8 +16,11 @@
OpName %vUV "vUV"
OpName %random "random"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %offset "offset"
OpName %sampleDepth "sampleDepth"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %main "main"
OpDecorate %Sampler DescriptorSet 0
OpDecorate %Sampler Binding 0
@@ -47,91 +50,124 @@
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
- %int_1 = OpConstant %int 1
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %39 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %42 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %int_1 = OpConstant %int 1
%sampleDepth = OpConstant %float 0
%true = OpConstantTrue %bool
%float_1 = OpConstant %float 1
- %71 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
+ %98 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
%void = OpTypeVoid
- %74 = OpTypeFunction %void
+ %101 = OpTypeFunction %void
%main_inner = OpFunction %v4float None %17
%vUV = OpFunctionParameter %v2float
%18 = OpLabel
%i = OpVariable %_ptr_Function_int Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %39
%19 = OpLoad %6 %randomTexture None
%20 = OpLoad %3 %Sampler None
%21 = OpSampledImage %22 %19 %20
%23 = OpImageSampleImplicitLod %v4float %21 %vUV None
%random = OpVectorShuffle %v3float %23 %23 0 1 2
OpStore %i %int_0
- OpBranch %32
- %32 = OpLabel
- OpLoopMerge %33 %31 None
OpBranch %30
%30 = OpLabel
- %34 = OpLoad %int %i None
- %35 = OpSLessThan %bool %34 %int_1
- OpSelectionMerge %38 None
- OpBranchConditional %35 %38 %39
- %39 = OpLabel
OpBranch %33
- %38 = OpLabel
- %40 = OpCompositeExtract %float %random 0
- %offset = OpCompositeConstruct %v3float %40 %40 %40
- %42 = OpCompositeExtract %float %offset 0
- %43 = OpFOrdLessThan %bool %42 %sampleDepth
- OpSelectionMerge %45 None
- OpBranchConditional %43 %46 %47
- %46 = OpLabel
- OpBranch %45
+ %33 = OpLabel
+ OpLoopMerge %34 %32 None
+ OpBranch %31
+ %31 = OpLabel
+ %40 = OpLoad %v2uint %tint_loop_idx None
+ %41 = OpIEqual %v2bool %40 %42
+ %46 = OpAll %bool %41
+ OpSelectionMerge %47 None
+ OpBranchConditional %46 %48 %47
+ %48 = OpLabel
+ OpBranch %34
%47 = OpLabel
- %48 = OpCompositeExtract %float %offset 1
- %49 = OpFOrdLessThan %bool %48 %sampleDepth
- OpBranch %45
- %45 = OpLabel
- %50 = OpPhi %bool %true %46 %49 %47
+ %49 = OpLoad %int %i None
+ %50 = OpSLessThan %bool %49 %int_1
OpSelectionMerge %52 None
- OpBranchConditional %50 %53 %54
+ OpBranchConditional %50 %52 %53
%53 = OpLabel
- OpBranch %52
- %54 = OpLabel
- %55 = OpCompositeExtract %float %offset 0
- %56 = OpFOrdGreaterThan %bool %55 %float_1
- OpBranch %52
+ OpBranch %34
%52 = OpLabel
- %58 = OpPhi %bool %true %53 %56 %54
+ %54 = OpCompositeExtract %float %random 0
+ %offset = OpCompositeConstruct %v3float %54 %54 %54
+ %56 = OpCompositeExtract %float %offset 0
+ %57 = OpFOrdLessThan %bool %56 %sampleDepth
OpSelectionMerge %59 None
- OpBranchConditional %58 %60 %61
+ OpBranchConditional %57 %60 %61
%60 = OpLabel
OpBranch %59
%61 = OpLabel
%62 = OpCompositeExtract %float %offset 1
- %63 = OpFOrdGreaterThan %bool %62 %float_1
+ %63 = OpFOrdLessThan %bool %62 %sampleDepth
OpBranch %59
%59 = OpLabel
%64 = OpPhi %bool %true %60 %63 %61
- OpSelectionMerge %65 None
- OpBranchConditional %64 %66 %65
+ OpSelectionMerge %66 None
+ OpBranchConditional %64 %67 %68
+ %67 = OpLabel
+ OpBranch %66
+ %68 = OpLabel
+ %69 = OpCompositeExtract %float %offset 0
+ %70 = OpFOrdGreaterThan %bool %69 %float_1
+ OpBranch %66
%66 = OpLabel
- %67 = OpLoad %int %i None
- %68 = OpIAdd %int %67 %int_1
- OpStore %i %68 None
- OpBranch %31
- %65 = OpLabel
- %69 = OpLoad %int %i None
- %70 = OpIAdd %int %69 %int_1
- OpStore %i %70 None
- OpBranch %31
- %31 = OpLabel
- OpBranch %32
- %33 = OpLabel
- OpReturnValue %71
- OpFunctionEnd
- %main = OpFunction %void None %74
+ %72 = OpPhi %bool %true %67 %70 %68
+ OpSelectionMerge %73 None
+ OpBranchConditional %72 %74 %75
+ %74 = OpLabel
+ OpBranch %73
%75 = OpLabel
- %76 = OpLoad %v2float %main_loc0_Input None
- %77 = OpFunctionCall %v4float %main_inner %76
- OpStore %main_loc0_Output %77 None
+ %76 = OpCompositeExtract %float %offset 1
+ %77 = OpFOrdGreaterThan %bool %76 %float_1
+ OpBranch %73
+ %73 = OpLabel
+ %78 = OpPhi %bool %true %74 %77 %75
+ OpSelectionMerge %79 None
+ OpBranchConditional %78 %80 %79
+ %80 = OpLabel
+ %81 = OpLoad %int %i None
+ %82 = OpIAdd %int %81 %int_1
+ OpStore %i %82 None
+ OpBranch %32
+ %79 = OpLabel
+ %83 = OpLoad %int %i None
+ %84 = OpIAdd %int %83 %int_1
+ OpStore %i %84 None
+ OpBranch %32
+ %32 = OpLabel
+ %85 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %88 = OpLoad %uint %85 None
+%tint_low_inc = OpIAdd %uint %88 %uint_1
+ %91 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %91 %tint_low_inc None
+ %92 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %92 %uint_1 %uint_0
+ %94 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %95 = OpLoad %uint %94 None
+ %96 = OpIAdd %uint %95 %tint_carry
+ %97 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %97 %96 None
+ OpBranch %33
+ %34 = OpLabel
+ OpReturnValue %98
+ OpFunctionEnd
+ %main = OpFunction %void None %101
+ %102 = OpLabel
+ %103 = OpLoad %v2float %main_loc0_Input None
+ %104 = OpFunctionCall %v4float %main_inner %103
+ OpStore %main_loc0_Output %104 None
OpReturn
OpFunctionEnd
diff --git a/test/tint/bug/tint/1064.wgsl.expected.spvasm b/test/tint/bug/tint/1064.wgsl.expected.spvasm
index 0581512..431e4d7 100644
--- a/test/tint/bug/tint/1064.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/1064.wgsl.expected.spvasm
@@ -1,32 +1,68 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 13
+; Bound: 40
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main"
OpExecutionMode %main OriginUpperLeft
OpName %main "main"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
%void = OpTypeVoid
%3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %14 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %17 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%false = OpConstantFalse %bool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%main = OpFunction %void None %3
%4 = OpLabel
- OpBranch %7
- %7 = OpLabel
- OpLoopMerge %8 %6 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %14
OpBranch %5
%5 = OpLabel
- OpSelectionMerge %9 None
- OpBranchConditional %false %9 %10
- %10 = OpLabel
OpBranch %8
- %9 = OpLabel
+ %8 = OpLabel
+ OpLoopMerge %9 %7 None
OpBranch %6
%6 = OpLabel
- OpBranchConditional %false %8 %7
- %8 = OpLabel
+ %15 = OpLoad %v2uint %tint_loop_idx None
+ %16 = OpIEqual %v2bool %15 %17
+ %21 = OpAll %bool %16
+ OpSelectionMerge %22 None
+ OpBranchConditional %21 %23 %22
+ %23 = OpLabel
+ OpBranch %9
+ %22 = OpLabel
+ OpSelectionMerge %24 None
+ OpBranchConditional %false %24 %25
+ %25 = OpLabel
+ OpBranch %9
+ %24 = OpLabel
+ OpBranch %7
+ %7 = OpLabel
+ %27 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %30 = OpLoad %uint %27 None
+%tint_low_inc = OpIAdd %uint %30 %uint_1
+ %33 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %33 %tint_low_inc None
+ %34 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %34 %uint_1 %uint_0
+ %36 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %37 = OpLoad %uint %36 None
+ %38 = OpIAdd %uint %37 %tint_carry
+ %39 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %39 %38 None
+ OpBranchConditional %false %9 %8
+ %9 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/bug/tint/1081.wgsl.expected.spvasm b/test/tint/bug/tint/1081.wgsl.expected.spvasm
index 4a48eda..ab00b07 100644
--- a/test/tint/bug/tint/1081.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/1081.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 48
+; Bound: 75
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -15,7 +15,10 @@
OpName %main_inner "main_inner"
OpName %x_0 "x"
OpName %y "y"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %r "r"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %main "main"
OpDecorate %main_loc1_Input Location 1
OpDecorate %main_loc1_Input Flat
@@ -35,9 +38,19 @@
%false = OpConstantFalse %bool
%22 = OpTypeFunction %int %v3int
%_ptr_Function_int = OpTypePointer Function %int
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %36 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %39 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %v2bool = OpTypeVector %bool 2
%int_0 = OpConstant %int 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%void = OpTypeVoid
- %44 = OpTypeFunction %void
+ %71 = OpTypeFunction %void
%f = OpFunction %int None %13
%x = OpFunctionParameter %int
%14 = OpLabel
@@ -54,39 +67,62 @@
%x_0 = OpFunctionParameter %v3int
%23 = OpLabel
%y = OpVariable %_ptr_Function_int Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %36
%24 = OpCompositeExtract %int %x_0 0
OpStore %y %24
- OpBranch %29
- %29 = OpLabel
- OpLoopMerge %30 %28 None
OpBranch %27
%27 = OpLabel
- %31 = OpLoad %int %y None
- %r = OpFunctionCall %int %f %31
- %33 = OpIEqual %bool %r %int_0
- OpSelectionMerge %35 None
- OpBranchConditional %33 %36 %35
- %36 = OpLabel
OpBranch %30
- %35 = OpLabel
+ %30 = OpLabel
+ OpLoopMerge %31 %29 None
OpBranch %28
%28 = OpLabel
+ %37 = OpLoad %v2uint %tint_loop_idx None
+ %38 = OpIEqual %v2bool %37 %39
+ %42 = OpAll %bool %38
+ OpSelectionMerge %43 None
+ OpBranchConditional %42 %44 %43
+ %44 = OpLabel
+ OpBranch %31
+ %43 = OpLabel
+ %45 = OpLoad %int %y None
+ %r = OpFunctionCall %int %f %45
+ %47 = OpIEqual %bool %r %int_0
+ OpSelectionMerge %49 None
+ OpBranchConditional %47 %50 %49
+ %50 = OpLabel
+ OpBranch %31
+ %49 = OpLabel
OpBranch %29
- %30 = OpLabel
- %37 = OpLoad %int %y None
- %38 = OpLoad %bool %continue_execution None
- %39 = OpLogicalNot %bool %38
- OpSelectionMerge %40 None
- OpBranchConditional %39 %41 %40
- %41 = OpLabel
+ %29 = OpLabel
+ %51 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %54 = OpLoad %uint %51 None
+%tint_low_inc = OpIAdd %uint %54 %uint_1
+ %57 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %57 %tint_low_inc None
+ %58 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %58 %uint_1 %uint_0
+ %60 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %61 = OpLoad %uint %60 None
+ %62 = OpIAdd %uint %61 %tint_carry
+ %63 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %63 %62 None
+ OpBranch %30
+ %31 = OpLabel
+ %64 = OpLoad %int %y None
+ %65 = OpLoad %bool %continue_execution None
+ %66 = OpLogicalNot %bool %65
+ OpSelectionMerge %67 None
+ OpBranchConditional %66 %68 %67
+ %68 = OpLabel
OpKill
- %40 = OpLabel
- OpReturnValue %37
+ %67 = OpLabel
+ OpReturnValue %64
OpFunctionEnd
- %main = OpFunction %void None %44
- %45 = OpLabel
- %46 = OpLoad %v3int %main_loc1_Input None
- %47 = OpFunctionCall %int %main_inner %46
- OpStore %main_loc2_Output %47 None
+ %main = OpFunction %void None %71
+ %72 = OpLabel
+ %73 = OpLoad %v3int %main_loc1_Input None
+ %74 = OpFunctionCall %int %main_inner %73
+ OpStore %main_loc2_Output %74 None
OpReturn
OpFunctionEnd
diff --git a/test/tint/bug/tint/1321.wgsl.expected.spvasm b/test/tint/bug/tint/1321.wgsl.expected.spvasm
index a4e2ac5..224f7ed 100644
--- a/test/tint/bug/tint/1321.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/1321.wgsl.expected.spvasm
@@ -1,18 +1,21 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 30
+; Bound: 56
; Schema: 0
OpCapability Shader
- %25 = OpExtInstImport "GLSL.std.450"
+ %29 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main"
OpExecutionMode %main OriginUpperLeft
OpName %foo "foo"
OpName %main "main"
OpName %arr "arr"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %a "a"
OpName %x "x"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpDecorate %_arr_float_uint_4 ArrayStride 4
%int = OpTypeInt 32 1
%3 = OpTypeFunction %int
@@ -25,8 +28,18 @@
%_arr_float_uint_4 = OpTypeArray %float %uint_4
%_ptr_Function__arr_float_uint_4 = OpTypePointer Function %_arr_float_uint_4
%16 = OpConstantNull %_arr_float_uint_4
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %25 = OpConstantNull %v2uint
%uint_3 = OpConstant %uint 3
%_ptr_Function_float = OpTypePointer Function %float
+%uint_4294967295 = OpConstant %uint 4294967295
+ %35 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%foo = OpFunction %int None %3
%4 = OpLabel
OpReturnValue %int_1
@@ -34,21 +47,42 @@
%main = OpFunction %void None %8
%9 = OpLabel
%arr = OpVariable %_ptr_Function__arr_float_uint_4 Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %25
OpStore %arr %16
OpBranch %17
%17 = OpLabel
- %22 = OpFunctionCall %int %foo
- %23 = OpBitcast %uint %22
- %24 = OpExtInst %uint %25 UMin %23 %uint_3
- %a = OpAccessChain %_ptr_Function_float %arr %24
+ %26 = OpFunctionCall %int %foo
+ %27 = OpBitcast %uint %26
+ %28 = OpExtInst %uint %29 UMin %27 %uint_3
+ %a = OpAccessChain %_ptr_Function_float %arr %28
OpBranch %20
%20 = OpLabel
OpLoopMerge %21 %19 None
OpBranch %18
%18 = OpLabel
+ %33 = OpLoad %v2uint %tint_loop_idx None
+ %34 = OpIEqual %v2bool %33 %35
+ %39 = OpAll %bool %34
+ OpSelectionMerge %40 None
+ OpBranchConditional %39 %41 %40
+ %41 = OpLabel
+ OpBranch %21
+ %40 = OpLabel
%x = OpLoad %float %a None
OpBranch %21
%19 = OpLabel
+ %43 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %46 = OpLoad %uint %43 None
+%tint_low_inc = OpIAdd %uint %46 %uint_1
+ %49 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %49 %tint_low_inc None
+ %50 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %50 %uint_1 %uint_0
+ %52 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %53 = OpLoad %uint %52 None
+ %54 = OpIAdd %uint %53 %tint_carry
+ %55 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %55 %54 None
OpBranch %20
%21 = OpLabel
OpReturn
diff --git a/test/tint/bug/tint/1474-a.wgsl.expected.spvasm b/test/tint/bug/tint/1474-a.wgsl.expected.spvasm
index 1a8225b..87aa060 100644
--- a/test/tint/bug/tint/1474-a.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/1474-a.wgsl.expected.spvasm
@@ -1,42 +1,78 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 18
+; Bound: 45
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main"
OpExecutionMode %main LocalSize 1 1 1
OpName %main "main"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %x "x"
%void = OpTypeVoid
%3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %14 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %17 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%true = OpConstantTrue %bool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%int = OpTypeInt 32 1
%x = OpConstant %int 5
%main = OpFunction %void None %3
%4 = OpLabel
- OpBranch %7
- %7 = OpLabel
- OpLoopMerge %8 %6 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %14
OpBranch %5
%5 = OpLabel
- OpSelectionMerge %9 None
- OpBranchConditional %true %9 %10
- %10 = OpLabel
OpBranch %8
- %9 = OpLabel
- OpSelectionMerge %13 None
- OpBranchConditional %true %14 %15
- %14 = OpLabel
- OpBranch %8
- %15 = OpLabel
- OpReturn
- %13 = OpLabel
+ %8 = OpLabel
+ OpLoopMerge %9 %7 None
OpBranch %6
%6 = OpLabel
+ %15 = OpLoad %v2uint %tint_loop_idx None
+ %16 = OpIEqual %v2bool %15 %17
+ %21 = OpAll %bool %16
+ OpSelectionMerge %22 None
+ OpBranchConditional %21 %23 %22
+ %23 = OpLabel
+ OpBranch %9
+ %22 = OpLabel
+ OpSelectionMerge %24 None
+ OpBranchConditional %true %24 %25
+ %25 = OpLabel
+ OpBranch %9
+ %24 = OpLabel
+ OpSelectionMerge %27 None
+ OpBranchConditional %true %28 %29
+ %28 = OpLabel
+ OpBranch %9
+ %29 = OpLabel
+ OpReturn
+ %27 = OpLabel
OpBranch %7
- %8 = OpLabel
+ %7 = OpLabel
+ %30 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %33 = OpLoad %uint %30 None
+%tint_low_inc = OpIAdd %uint %33 %uint_1
+ %36 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %36 %tint_low_inc None
+ %37 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %37 %uint_1 %uint_0
+ %39 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %40 = OpLoad %uint %39 None
+ %41 = OpIAdd %uint %40 %tint_carry
+ %42 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %42 %41 None
+ OpBranch %8
+ %9 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/bug/tint/1538.wgsl.expected.spvasm b/test/tint/bug/tint/1538.wgsl.expected.spvasm
index 5970166..1e909fd 100644
--- a/test/tint/bug/tint/1538.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/1538.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 40
+; Bound: 81
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -11,9 +11,15 @@
OpName %buf_block "buf_block"
OpName %g "g"
OpName %f "f"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %o "o"
OpName %main "main"
+ OpName %tint_loop_idx_0 "tint_loop_idx"
OpName %s "s"
+ OpName %tint_low_inc_1 "tint_low_inc_1"
+ OpName %tint_carry_1 "tint_carry_1"
OpDecorate %_arr_uint_uint_1 ArrayStride 4
OpMemberDecorate %buf_block 0 Offset 0
OpDecorate %buf_block Block
@@ -29,11 +35,18 @@
%int = OpTypeInt 32 1
%9 = OpTypeFunction %int
%int_0 = OpConstant %int 0
- %void = OpTypeVoid
- %22 = OpTypeFunction %void
-%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
- %uint_0 = OpConstant %uint 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %22 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %25 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %void = OpTypeVoid
+ %48 = OpTypeFunction %void
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
%_ptr_Function_int = OpTypePointer Function %int
%g = OpFunction %int None %9
%10 = OpLabel
@@ -41,42 +54,88 @@
OpFunctionEnd
%f = OpFunction %int None %9
%13 = OpLabel
- OpBranch %16
- %16 = OpLabel
- OpLoopMerge %17 %15 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %22
OpBranch %14
%14 = OpLabel
- %18 = OpFunctionCall %int %g
OpBranch %17
- %15 = OpLabel
- OpBranch %16
%17 = OpLabel
+ OpLoopMerge %18 %16 None
+ OpBranch %15
+ %15 = OpLabel
+ %23 = OpLoad %v2uint %tint_loop_idx None
+ %24 = OpIEqual %v2bool %23 %25
+ %29 = OpAll %bool %24
+ OpSelectionMerge %30 None
+ OpBranchConditional %29 %31 %30
+ %31 = OpLabel
+ OpBranch %18
+ %30 = OpLabel
+ %32 = OpFunctionCall %int %g
+ OpBranch %18
+ %16 = OpLabel
+ %33 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %36 = OpLoad %uint %33 None
+%tint_low_inc = OpIAdd %uint %36 %uint_1
+ %38 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %38 %tint_low_inc None
+ %39 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %39 %uint_1 %uint_0
+ %41 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %42 = OpLoad %uint %41 None
+ %43 = OpIAdd %uint %42 %tint_carry
+ %44 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %44 %43 None
+ OpBranch %17
+ %18 = OpLabel
%o = OpFunctionCall %int %g
OpReturnValue %int_0
OpFunctionEnd
- %main = OpFunction %void None %22
- %23 = OpLabel
+ %main = OpFunction %void None %48
+ %49 = OpLabel
+%tint_loop_idx_0 = OpVariable %_ptr_Function_v2uint Function %22
%s = OpVariable %_ptr_Function_int Function
- OpBranch %26
- %26 = OpLabel
- OpLoopMerge %27 %25 None
- OpBranch %24
- %24 = OpLabel
- %28 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0 %uint_0
- %31 = OpLoad %uint %28 None
- %32 = OpIEqual %bool %31 %uint_0
- OpSelectionMerge %34 None
- OpBranchConditional %32 %35 %34
- %35 = OpLabel
- OpBranch %27
- %34 = OpLabel
- %36 = OpFunctionCall %int %f
- OpStore %s %36
- %39 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0 %uint_0
- OpStore %39 %uint_0 None
- OpBranch %25
- %25 = OpLabel
- OpBranch %26
- %27 = OpLabel
+ OpBranch %50
+ %50 = OpLabel
+ OpBranch %53
+ %53 = OpLabel
+ OpLoopMerge %54 %52 None
+ OpBranch %51
+ %51 = OpLabel
+ %56 = OpLoad %v2uint %tint_loop_idx_0 None
+ %57 = OpIEqual %v2bool %56 %25
+ %58 = OpAll %bool %57
+ OpSelectionMerge %59 None
+ OpBranchConditional %58 %60 %59
+ %60 = OpLabel
+ OpBranch %54
+ %59 = OpLabel
+ %61 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0 %uint_0
+ %63 = OpLoad %uint %61 None
+ %64 = OpIEqual %bool %63 %uint_0
+ OpSelectionMerge %65 None
+ OpBranchConditional %64 %66 %65
+ %66 = OpLabel
+ OpBranch %54
+ %65 = OpLabel
+ %67 = OpFunctionCall %int %f
+ OpStore %s %67
+ %70 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0 %uint_0
+ OpStore %70 %uint_0 None
+ OpBranch %52
+ %52 = OpLabel
+ %71 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ %72 = OpLoad %uint %71 None
+%tint_low_inc_1 = OpIAdd %uint %72 %uint_1
+ %74 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ OpStore %74 %tint_low_inc_1 None
+ %75 = OpIEqual %bool %tint_low_inc_1 %uint_0
+%tint_carry_1 = OpSelect %uint %75 %uint_1 %uint_0
+ %77 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ %78 = OpLoad %uint %77 None
+ %79 = OpIAdd %uint %78 %tint_carry_1
+ %80 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ OpStore %80 %79 None
+ OpBranch %53
+ %54 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/bug/tint/1557.wgsl.expected.spvasm b/test/tint/bug/tint/1557.wgsl.expected.spvasm
index cfc1bff..2bb1f50 100644
--- a/test/tint/bug/tint/1557.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/1557.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 45
+; Bound: 70
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -12,7 +12,10 @@
OpName %f "f"
OpName %g "g"
OpName %j "j"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %k "k"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %main "main"
OpMemberDecorate %u_block 0 Offset 0
OpDecorate %u_block Block
@@ -28,11 +31,19 @@
%void = OpTypeVoid
%11 = OpTypeFunction %void
%_ptr_Function_int = OpTypePointer Function %int
- %int_1 = OpConstant %int 1
- %bool = OpTypeBool
-%_ptr_Uniform_int = OpTypePointer Uniform %int
%uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %24 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %27 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %int_1 = OpConstant %int 1
+%_ptr_Function_uint = OpTypePointer Function %uint
%uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
%f = OpFunction %int None %6
%7 = OpLabel
OpReturnValue %int_0
@@ -40,51 +51,74 @@
%g = OpFunction %void None %11
%12 = OpLabel
%j = OpVariable %_ptr_Function_int Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %24
%k = OpVariable %_ptr_Function_int Function
OpStore %j %int_0
- OpBranch %17
- %17 = OpLabel
- OpLoopMerge %18 %16 None
OpBranch %15
%15 = OpLabel
- %19 = OpLoad %int %j None
- %20 = OpSGreaterThanEqual %bool %19 %int_1
- OpSelectionMerge %23 None
- OpBranchConditional %20 %24 %23
- %24 = OpLabel
OpBranch %18
- %23 = OpLabel
- %25 = OpLoad %int %j None
- %26 = OpIAdd %int %25 %int_1
- OpStore %j %26 None
- %27 = OpFunctionCall %int %f
- OpStore %k %27
+ %18 = OpLabel
+ OpLoopMerge %19 %17 None
OpBranch %16
%16 = OpLabel
+ %25 = OpLoad %v2uint %tint_loop_idx None
+ %26 = OpIEqual %v2bool %25 %27
+ %31 = OpAll %bool %26
+ OpSelectionMerge %32 None
+ OpBranchConditional %31 %33 %32
+ %33 = OpLabel
+ OpBranch %19
+ %32 = OpLabel
+ %34 = OpLoad %int %j None
+ %35 = OpSGreaterThanEqual %bool %34 %int_1
+ OpSelectionMerge %37 None
+ OpBranchConditional %35 %38 %37
+ %38 = OpLabel
+ OpBranch %19
+ %37 = OpLabel
+ %39 = OpLoad %int %j None
+ %40 = OpIAdd %int %39 %int_1
+ OpStore %j %40 None
+ %41 = OpFunctionCall %int %f
+ OpStore %k %41
OpBranch %17
- %18 = OpLabel
+ %17 = OpLabel
+ %43 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %46 = OpLoad %uint %43 None
+%tint_low_inc = OpIAdd %uint %46 %uint_1
+ %49 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %49 %tint_low_inc None
+ %50 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %50 %uint_1 %uint_0
+ %52 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %53 = OpLoad %uint %52 None
+ %54 = OpIAdd %uint %53 %tint_carry
+ %55 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %55 %54 None
+ OpBranch %18
+ %19 = OpLabel
OpReturn
OpFunctionEnd
%main = OpFunction %void None %11
- %30 = OpLabel
- %31 = OpAccessChain %_ptr_Uniform_int %1 %uint_0
- %35 = OpLoad %int %31 None
- OpSelectionMerge %38 None
- OpSwitch %35 %36 0 %37
- %37 = OpLabel
- %39 = OpAccessChain %_ptr_Uniform_int %1 %uint_0
- %40 = OpLoad %int %39 None
- OpSelectionMerge %43 None
- OpSwitch %40 %41 0 %42
- %42 = OpLabel
- OpBranch %43
- %41 = OpLabel
- %44 = OpFunctionCall %void %g
- OpBranch %43
- %43 = OpLabel
- OpBranch %38
- %36 = OpLabel
- OpBranch %38
- %38 = OpLabel
+ %57 = OpLabel
+ %58 = OpAccessChain %_ptr_Uniform_int %1 %uint_0
+ %60 = OpLoad %int %58 None
+ OpSelectionMerge %63 None
+ OpSwitch %60 %61 0 %62
+ %62 = OpLabel
+ %64 = OpAccessChain %_ptr_Uniform_int %1 %uint_0
+ %65 = OpLoad %int %64 None
+ OpSelectionMerge %68 None
+ OpSwitch %65 %66 0 %67
+ %67 = OpLabel
+ OpBranch %68
+ %66 = OpLabel
+ %69 = OpFunctionCall %void %g
+ OpBranch %68
+ %68 = OpLabel
+ OpBranch %63
+ %61 = OpLabel
+ OpBranch %63
+ %63 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/bug/tint/1604.wgsl.expected.spvasm b/test/tint/bug/tint/1604.wgsl.expected.spvasm
index eed0c38..0535ba7 100644
--- a/test/tint/bug/tint/1604.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/1604.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 21
+; Bound: 47
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -10,6 +10,9 @@
OpMemberName %x_block 0 "inner"
OpName %x_block "x_block"
OpName %main "main"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpMemberDecorate %x_block 0 Offset 0
OpDecorate %x_block Block
OpDecorate %1 DescriptorSet 0
@@ -24,22 +27,54 @@
%_ptr_Uniform_int = OpTypePointer Uniform %int
%uint = OpTypeInt 32 0
%uint_0 = OpConstant %uint 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %25 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %28 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_1 = OpConstant %uint 1
%main = OpFunction %void None %7
%8 = OpLabel
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %25
%9 = OpAccessChain %_ptr_Uniform_int %1 %uint_0
%13 = OpLoad %int %9 None
OpSelectionMerge %16 None
OpSwitch %13 %14 0 %15
%15 = OpLabel
- OpBranch %19
- %19 = OpLabel
- OpLoopMerge %20 %18 None
OpBranch %17
%17 = OpLabel
- OpReturn
- %18 = OpLabel
- OpBranch %19
+ OpBranch %20
%20 = OpLabel
+ OpLoopMerge %21 %19 None
+ OpBranch %18
+ %18 = OpLabel
+ %26 = OpLoad %v2uint %tint_loop_idx None
+ %27 = OpIEqual %v2bool %26 %28
+ %32 = OpAll %bool %27
+ OpSelectionMerge %33 None
+ OpBranchConditional %32 %34 %33
+ %34 = OpLabel
+ OpBranch %21
+ %33 = OpLabel
+ OpReturn
+ %19 = OpLabel
+ %35 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %37 = OpLoad %uint %35 None
+%tint_low_inc = OpIAdd %uint %37 %uint_1
+ %40 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %40 %tint_low_inc None
+ %41 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %41 %uint_1 %uint_0
+ %43 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %44 = OpLoad %uint %43 None
+ %45 = OpIAdd %uint %44 %tint_carry
+ %46 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %46 %45 None
+ OpBranch %20
+ %21 = OpLabel
OpBranch %16
%14 = OpLabel
OpBranch %16
diff --git a/test/tint/bug/tint/1605.wgsl.expected.spvasm b/test/tint/bug/tint/1605.wgsl.expected.spvasm
index b8c0c3e..4e214cc 100644
--- a/test/tint/bug/tint/1605.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/1605.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 60
+; Bound: 100
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -12,8 +12,14 @@
OpName %func_3 "func_3"
OpName %return_value "return_value"
OpName %continue_execution "continue_execution"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %i "i"
+ OpName %tint_loop_idx_0 "tint_loop_idx"
OpName %j "j"
+ OpName %tint_low_inc_1 "tint_low_inc_1"
+ OpName %tint_carry_1 "tint_carry_1"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %main "main"
OpMemberDecorate %b_block 0 Offset 0
OpDecorate %b_block Block
@@ -29,21 +35,31 @@
%_ptr_Function_bool = OpTypePointer Function %bool
%11 = OpConstantNull %bool
%true = OpConstantTrue %bool
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %23 = OpConstantNull %v2uint
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
+%uint_4294967295 = OpConstant %uint 4294967295
+ %29 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %v2bool = OpTypeVector %bool 2
%_ptr_Uniform_int = OpTypePointer Uniform %int
- %uint = OpTypeInt 32 0
%uint_0 = OpConstant %uint 0
%int_n1 = OpConstant %int -1
%int_1 = OpConstant %int 1
%false = OpConstantFalse %bool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_1 = OpConstant %uint 1
%void = OpTypeVoid
- %57 = OpTypeFunction %void
+ %97 = OpTypeFunction %void
%func_3 = OpFunction %bool None %7
%8 = OpLabel
%return_value = OpVariable %_ptr_Function_bool Function %11
%continue_execution = OpVariable %_ptr_Function_bool Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %23
%i = OpVariable %_ptr_Function_int Function
+%tint_loop_idx_0 = OpVariable %_ptr_Function_v2uint Function %23
%j = OpVariable %_ptr_Function_int Function
OpStore %continue_execution %true
OpBranch %14
@@ -54,64 +70,104 @@
OpLoopMerge %18 %16 None
OpBranch %15
%15 = OpLabel
- %22 = OpLoad %int %i None
- %23 = OpAccessChain %_ptr_Uniform_int %1 %uint_0
- %27 = OpLoad %int %23 None
- %28 = OpSLessThan %bool %22 %27
- OpSelectionMerge %29 None
- OpBranchConditional %28 %29 %30
- %30 = OpLabel
- OpBranch %18
- %29 = OpLabel
- OpBranch %31
- %31 = OpLabel
- OpStore %j %int_n1
- OpBranch %34
+ %27 = OpLoad %v2uint %tint_loop_idx None
+ %28 = OpIEqual %v2bool %27 %29
+ %32 = OpAll %bool %28
+ OpSelectionMerge %33 None
+ OpBranchConditional %32 %34 %33
%34 = OpLabel
- OpLoopMerge %35 %33 None
- OpBranch %32
- %32 = OpLabel
- %38 = OpLoad %int %j None
- %39 = OpIEqual %bool %38 %int_1
+ OpBranch %18
+ %33 = OpLabel
+ %35 = OpLoad %int %i None
+ %36 = OpAccessChain %_ptr_Uniform_int %1 %uint_0
+ %39 = OpLoad %int %36 None
+ %40 = OpSLessThan %bool %35 %39
OpSelectionMerge %41 None
- OpBranchConditional %39 %41 %42
+ OpBranchConditional %40 %41 %42
%42 = OpLabel
- OpBranch %35
+ OpBranch %18
%41 = OpLabel
+ OpBranch %43
+ %43 = OpLabel
+ OpStore %j %int_n1
+ OpBranch %46
+ %46 = OpLabel
+ OpLoopMerge %47 %45 None
+ OpBranch %44
+ %44 = OpLabel
+ %51 = OpLoad %v2uint %tint_loop_idx_0 None
+ %52 = OpIEqual %v2bool %51 %29
+ %53 = OpAll %bool %52
+ OpSelectionMerge %54 None
+ OpBranchConditional %53 %55 %54
+ %55 = OpLabel
+ OpBranch %47
+ %54 = OpLabel
+ %56 = OpLoad %int %j None
+ %57 = OpIEqual %bool %56 %int_1
+ OpSelectionMerge %59 None
+ OpBranchConditional %57 %59 %60
+ %60 = OpLabel
+ OpBranch %47
+ %59 = OpLabel
OpStore %continue_execution %false None
OpStore %return_value %false None
- OpBranch %35
- %33 = OpLabel
- %44 = OpLoad %int %j None
- %45 = OpIAdd %int %44 %int_1
- OpStore %j %45 None
- OpBranch %34
- %35 = OpLabel
- %46 = OpLoad %bool %continue_execution None
- OpSelectionMerge %47 None
- OpBranchConditional %46 %48 %47
- %48 = OpLabel
- OpBranch %16
+ OpBranch %47
+ %45 = OpLabel
+ %62 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ %64 = OpLoad %uint %62 None
+%tint_low_inc_1 = OpIAdd %uint %64 %uint_1
+ %67 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ OpStore %67 %tint_low_inc_1 None
+ %68 = OpIEqual %bool %tint_low_inc_1 %uint_0
+%tint_carry_1 = OpSelect %uint %68 %uint_1 %uint_0
+ %70 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ %71 = OpLoad %uint %70 None
+ %72 = OpIAdd %uint %71 %tint_carry_1
+ %73 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ OpStore %73 %72 None
+ %74 = OpLoad %int %j None
+ %75 = OpIAdd %int %74 %int_1
+ OpStore %j %75 None
+ OpBranch %46
%47 = OpLabel
+ %76 = OpLoad %bool %continue_execution None
+ OpSelectionMerge %77 None
+ OpBranchConditional %76 %78 %77
+ %78 = OpLabel
+ OpBranch %16
+ %77 = OpLabel
OpBranch %18
%16 = OpLabel
- %49 = OpLoad %int %i None
- %50 = OpIAdd %int %49 %int_1
- OpStore %i %50 None
+ %79 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %80 = OpLoad %uint %79 None
+%tint_low_inc = OpIAdd %uint %80 %uint_1
+ %82 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %82 %tint_low_inc None
+ %83 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %83 %uint_1 %uint_0
+ %85 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %86 = OpLoad %uint %85 None
+ %87 = OpIAdd %uint %86 %tint_carry
+ %88 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %88 %87 None
+ %89 = OpLoad %int %i None
+ %90 = OpIAdd %int %89 %int_1
+ OpStore %i %90 None
OpBranch %17
%18 = OpLabel
- %51 = OpLoad %bool %continue_execution None
- OpSelectionMerge %52 None
- OpBranchConditional %51 %53 %52
- %53 = OpLabel
+ %91 = OpLoad %bool %continue_execution None
+ OpSelectionMerge %92 None
+ OpBranchConditional %91 %93 %92
+ %93 = OpLabel
OpStore %return_value %false None
- OpBranch %52
- %52 = OpLabel
- %54 = OpLoad %bool %return_value None
- OpReturnValue %54
+ OpBranch %92
+ %92 = OpLabel
+ %94 = OpLoad %bool %return_value None
+ OpReturnValue %94
OpFunctionEnd
- %main = OpFunction %void None %57
- %58 = OpLabel
- %59 = OpFunctionCall %bool %func_3
+ %main = OpFunction %void None %97
+ %98 = OpLabel
+ %99 = OpFunctionCall %bool %func_3
OpReturn
OpFunctionEnd
diff --git a/test/tint/bug/tint/2010.spvasm.expected.spvasm b/test/tint/bug/tint/2010.spvasm.expected.spvasm
index 6fc8747..2f4d128 100644
--- a/test/tint/bug/tint/2010.spvasm.expected.spvasm
+++ b/test/tint/bug/tint/2010.spvasm.expected.spvasm
@@ -1,10 +1,10 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 232
+; Bound: 271
; Schema: 0
OpCapability Shader
- %77 = OpExtInstImport "GLSL.std.450"
+ %90 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %main_local_invocation_id_Input %main_local_invocation_index_Input
OpExecutionMode %main LocalSize 32 1 1
@@ -37,14 +37,18 @@
OpName %x_85 "x_85"
OpName %x_88 "x_88"
OpName %x_52 "x_52"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %x_55 "x_55"
OpName %x_62 "x_62"
OpName %x_67 "x_67"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %x_74 "x_74"
OpName %x_76 "x_76"
OpName %x_80 "x_80"
OpName %x_81 "x_81"
OpName %x_82 "x_82"
+ OpName %tint_loop_idx_0 "tint_loop_idx"
OpName %x_111 "x_111"
OpName %x_86 "x_86"
OpName %x_89 "x_89"
@@ -58,6 +62,8 @@
OpName %x_105 "x_105"
OpName %x_107 "x_107"
OpName %x_109_1 "x_109_1"
+ OpName %tint_low_inc_1 "tint_low_inc_1"
+ OpName %tint_carry_1 "tint_carry_1"
OpName %x_114 "x_114"
OpName %x_117 "x_117"
OpName %x_120 "x_120"
@@ -131,8 +137,14 @@
%45 = OpConstantNull %v4float
%_ptr_Private_uint = OpTypePointer Private %uint
%uint_0 = OpConstant %uint 0
-%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %59 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %62 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%_ptr_StorageBuffer__runtimearr_v4float = OpTypePointer StorageBuffer %_runtimearr_v4float
%uint_1 = OpConstant %uint 1
%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float
@@ -144,21 +156,22 @@
%uint_264 = OpConstant %uint 264
%int = OpTypeInt 32 1
%_ptr_Workgroup_v2float = OpTypePointer Workgroup %v2float
- %v2uint = OpTypeVector %uint 2
%_ptr_Function_float = OpTypePointer Function %float
%uint_3 = OpConstant %uint 3
%_ptr_StorageBuffer__runtimearr_v4float_0 = OpTypePointer StorageBuffer %_runtimearr_v4float
%int_0 = OpConstant %int 0
%_ptr_StorageBuffer_v4float_0 = OpTypePointer StorageBuffer %v4float
- %204 = OpTypeFunction %void %v3uint %uint
- %224 = OpConstantNull %S
+ %243 = OpTypeFunction %void %v3uint %uint
+ %263 = OpConstantNull %S
%main_1 = OpFunction %void None %37
%38 = OpLabel
%x_54 = OpVariable %_ptr_Function_uint Function %41
%x_58 = OpVariable %_ptr_Function_uint Function %41
%x_85 = OpVariable %_ptr_Function_v4float Function %45
%x_88 = OpVariable %_ptr_Function_uint Function %41
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %59
%x_55 = OpVariable %_ptr_Function_uint Function %41
+%tint_loop_idx_0 = OpVariable %_ptr_Function_v2uint Function %59
%x_111 = OpVariable %_ptr_Function_v4float Function %45
%x_86 = OpVariable %_ptr_Function_v4float Function %45
%x_89 = OpVariable %_ptr_Function_uint Function %41
@@ -168,63 +181,85 @@
%47 = OpAccessChain %_ptr_Private_uint %x_3 %uint_0
%x_52 = OpLoad %uint %47 None
OpStore %x_54 %uint_0 None
- OpBranch %53
- %53 = OpLabel
- OpLoopMerge %54 %52 None
OpBranch %51
%51 = OpLabel
- %56 = OpAccessChain %_ptr_Uniform_uint %18 %uint_0 %uint_0 %uint_0
- %58 = OpLoad %uint %56 None
- OpStore %x_58 %58 None
- %59 = OpLoad %uint %x_54 None
- %60 = OpLoad %uint %x_58 None
- %61 = OpULessThan %bool %59 %60
- OpSelectionMerge %63 None
- OpBranchConditional %61 %63 %64
- %64 = OpLabel
OpBranch %54
- %63 = OpLabel
- %65 = OpLoad %uint %x_54 None
- %x_62 = OpIAdd %uint %65 %x_52
- %67 = OpLoad %uint %x_58 None
- %68 = OpUGreaterThanEqual %bool %x_62 %67
- OpSelectionMerge %69 None
- OpBranchConditional %68 %70 %69
- %70 = OpLabel
- %71 = OpAccessChain %_ptr_StorageBuffer__runtimearr_v4float %x_9 %uint_0
- %73 = OpArrayLength %uint %x_9 0
- %74 = OpISub %uint %73 %uint_1
- %76 = OpExtInst %uint %77 UMin %x_62 %74
- %78 = OpAccessChain %_ptr_StorageBuffer_v4float %x_9 %uint_0 %76
- %x_67 = OpLoad %v4float %78 None
- %81 = OpExtInst %uint %77 UMin %x_62 %uint_4095
- %83 = OpAccessChain %_ptr_Workgroup_S %x_28 %81
- %85 = OpVectorShuffle %v2float %x_67 %x_67 0 1
- %86 = OpVectorShuffle %v2float %x_67 %x_67 2 3
- %87 = OpFAdd %v2float %85 %86
- %88 = OpVectorTimesScalar %v2float %87 %float_0_5
- %90 = OpCompositeConstruct %S %88 %x_62
- OpStore %83 %90 None
- OpBranch %69
- %69 = OpLabel
+ %54 = OpLabel
+ OpLoopMerge %55 %53 None
OpBranch %52
%52 = OpLabel
- %91 = OpLoad %uint %x_54 None
- %92 = OpIAdd %uint %91 %uint_32
- OpStore %x_55 %92 None
- %94 = OpLoad %uint %x_55 None
- OpStore %x_54 %94 None
+ %60 = OpLoad %v2uint %tint_loop_idx None
+ %61 = OpIEqual %v2bool %60 %62
+ %66 = OpAll %bool %61
+ OpSelectionMerge %67 None
+ OpBranchConditional %66 %68 %67
+ %68 = OpLabel
+ OpBranch %55
+ %67 = OpLabel
+ %70 = OpAccessChain %_ptr_Uniform_uint %18 %uint_0 %uint_0 %uint_0
+ %72 = OpLoad %uint %70 None
+ OpStore %x_58 %72 None
+ %73 = OpLoad %uint %x_54 None
+ %74 = OpLoad %uint %x_58 None
+ %75 = OpULessThan %bool %73 %74
+ OpSelectionMerge %76 None
+ OpBranchConditional %75 %76 %77
+ %77 = OpLabel
+ OpBranch %55
+ %76 = OpLabel
+ %78 = OpLoad %uint %x_54 None
+ %x_62 = OpIAdd %uint %78 %x_52
+ %80 = OpLoad %uint %x_58 None
+ %81 = OpUGreaterThanEqual %bool %x_62 %80
+ OpSelectionMerge %82 None
+ OpBranchConditional %81 %83 %82
+ %83 = OpLabel
+ %84 = OpAccessChain %_ptr_StorageBuffer__runtimearr_v4float %x_9 %uint_0
+ %86 = OpArrayLength %uint %x_9 0
+ %87 = OpISub %uint %86 %uint_1
+ %89 = OpExtInst %uint %90 UMin %x_62 %87
+ %91 = OpAccessChain %_ptr_StorageBuffer_v4float %x_9 %uint_0 %89
+ %x_67 = OpLoad %v4float %91 None
+ %94 = OpExtInst %uint %90 UMin %x_62 %uint_4095
+ %96 = OpAccessChain %_ptr_Workgroup_S %x_28 %94
+ %98 = OpVectorShuffle %v2float %x_67 %x_67 0 1
+ %99 = OpVectorShuffle %v2float %x_67 %x_67 2 3
+ %100 = OpFAdd %v2float %98 %99
+ %101 = OpVectorTimesScalar %v2float %100 %float_0_5
+ %103 = OpCompositeConstruct %S %101 %x_62
+ OpStore %96 %103 None
+ OpBranch %82
+ %82 = OpLabel
OpBranch %53
- %54 = OpLabel
+ %53 = OpLabel
+ %104 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %105 = OpLoad %uint %104 None
+%tint_low_inc = OpIAdd %uint %105 %uint_1
+ %107 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %107 %tint_low_inc None
+ %108 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %108 %uint_1 %uint_0
+ %110 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %111 = OpLoad %uint %110 None
+ %112 = OpIAdd %uint %111 %tint_carry
+ %113 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %113 %112 None
+ %114 = OpLoad %uint %x_54 None
+ %115 = OpIAdd %uint %114 %uint_32
+ OpStore %x_55 %115 None
+ %117 = OpLoad %uint %x_55 None
+ OpStore %x_54 %117 None
+ OpBranch %54
+ %55 = OpLabel
OpControlBarrier %uint_2 %uint_2 %uint_264
- %98 = OpLoad %uint %x_58 None
- %x_74 = OpBitcast %int %98
- %101 = OpAccessChain %_ptr_Workgroup_v2float %x_28 %uint_0 %uint_0
- %x_76 = OpLoad %v2float %101 None
- %104 = OpIEqual %bool %x_52 %uint_0
- OpSelectionMerge %105 None
- OpBranchConditional %104 %106 %105
- %106 = OpLabel
+ %121 = OpLoad %uint %x_58 None
+ %x_74 = OpBitcast %int %121
+ %124 = OpAccessChain %_ptr_Workgroup_v2float %x_28 %uint_0 %uint_0
+ %x_76 = OpLoad %v2float %124 None
+ %127 = OpIEqual %bool %x_52 %uint_0
+ OpSelectionMerge %128 None
+ OpBranchConditional %127 %129 %128
+ %129 = OpLabel
%x_80 = OpBitcast %v2uint %x_76
%x_81 = OpCompositeExtract %uint %x_80 0
OpAtomicStore %x_34 %uint_2 %uint_0 %x_81
@@ -232,156 +267,178 @@
OpAtomicStore %x_35 %uint_2 %uint_0 %x_82
OpAtomicStore %x_36 %uint_2 %uint_0 %x_81
OpAtomicStore %x_37 %uint_2 %uint_0 %x_82
- OpBranch %105
- %105 = OpLabel
- %115 = OpVectorShuffle %v4float %x_76 %x_76 0 1 0 1
- OpStore %x_85 %115 None
+ OpBranch %128
+ %128 = OpLabel
+ %137 = OpVectorShuffle %v4float %x_76 %x_76 0 1 0 1
+ OpStore %x_85 %137 None
OpStore %x_88 %uint_1 None
- OpBranch %118
- %118 = OpLabel
- OpLoopMerge %119 %117 None
- OpBranch %116
- %116 = OpLabel
+ OpBranch %138
+ %138 = OpLabel
+ OpBranch %141
+ %141 = OpLabel
+ OpLoopMerge %142 %140 None
+ OpBranch %139
+ %139 = OpLabel
+ %144 = OpLoad %v2uint %tint_loop_idx_0 None
+ %145 = OpIEqual %v2bool %144 %62
+ %146 = OpAll %bool %145
+ OpSelectionMerge %147 None
+ OpBranchConditional %146 %148 %147
+ %148 = OpLabel
+ OpBranch %142
+ %147 = OpLabel
%x_90 = OpBitcast %uint %x_74
- %124 = OpLoad %uint %x_88 None
- %125 = OpULessThan %bool %124 %x_90
- OpSelectionMerge %126 None
- OpBranchConditional %125 %126 %127
- %127 = OpLabel
- OpBranch %119
- %126 = OpLabel
- %128 = OpLoad %uint %x_88 None
- %x_94 = OpIAdd %uint %128 %x_52
- %130 = OpLoad %v4float %x_85 None
- OpStore %x_86 %130 None
- %131 = OpUGreaterThanEqual %bool %x_94 %x_90
- OpSelectionMerge %132 None
- OpBranchConditional %131 %133 %132
- %133 = OpLabel
- %134 = OpExtInst %uint %77 UMin %x_94 %uint_4095
- %135 = OpAccessChain %_ptr_Workgroup_v2float %x_28 %134 %uint_0
- %x_99 = OpLoad %v2float %135 None
- %137 = OpLoad %v4float %x_85 None
- %138 = OpVectorShuffle %v2float %137 %137 0 1
- %x_101 = OpExtInst %v2float %77 FMin %138 %x_99
- %140 = OpLoad %v4float %x_85 None
- OpStore %x_103_1 %140
- %142 = OpCompositeExtract %float %x_101 0
- %143 = OpAccessChain %_ptr_Function_float %x_103_1 %uint_0
- OpStore %143 %142 None
+ %153 = OpLoad %uint %x_88 None
+ %154 = OpULessThan %bool %153 %x_90
+ OpSelectionMerge %155 None
+ OpBranchConditional %154 %155 %156
+ %156 = OpLabel
+ OpBranch %142
+ %155 = OpLabel
+ %157 = OpLoad %uint %x_88 None
+ %x_94 = OpIAdd %uint %157 %x_52
+ %159 = OpLoad %v4float %x_85 None
+ OpStore %x_86 %159 None
+ %160 = OpUGreaterThanEqual %bool %x_94 %x_90
+ OpSelectionMerge %161 None
+ OpBranchConditional %160 %162 %161
+ %162 = OpLabel
+ %163 = OpExtInst %uint %90 UMin %x_94 %uint_4095
+ %164 = OpAccessChain %_ptr_Workgroup_v2float %x_28 %163 %uint_0
+ %x_99 = OpLoad %v2float %164 None
+ %166 = OpLoad %v4float %x_85 None
+ %167 = OpVectorShuffle %v2float %166 %166 0 1
+ %x_101 = OpExtInst %v2float %90 FMin %167 %x_99
+ %169 = OpLoad %v4float %x_85 None
+ OpStore %x_103_1 %169
+ %171 = OpCompositeExtract %float %x_101 0
+ %172 = OpAccessChain %_ptr_Function_float %x_103_1 %uint_0
+ OpStore %172 %171 None
%x_103 = OpLoad %v4float %x_103_1 None
OpStore %x_105_1 %x_103
- %147 = OpCompositeExtract %float %x_101 1
- %148 = OpAccessChain %_ptr_Function_float %x_105_1 %uint_1
- OpStore %148 %147 None
+ %176 = OpCompositeExtract %float %x_101 1
+ %177 = OpAccessChain %_ptr_Function_float %x_105_1 %uint_1
+ OpStore %177 %176 None
%x_105 = OpLoad %v4float %x_105_1 None
- %150 = OpLoad %v4float %x_105_1 None
- %151 = OpVectorShuffle %v2float %150 %150 2 3
- %x_107 = OpExtInst %v2float %77 FMax %151 %x_99
+ %179 = OpLoad %v4float %x_105_1 None
+ %180 = OpVectorShuffle %v2float %179 %179 2 3
+ %x_107 = OpExtInst %v2float %90 FMax %180 %x_99
OpStore %x_109_1 %x_105
- %154 = OpCompositeExtract %float %x_107 0
- %155 = OpAccessChain %_ptr_Function_float %x_109_1 %uint_2
- OpStore %155 %154 None
- %156 = OpLoad %v4float %x_109_1 None
- OpStore %x_111 %156 None
- %157 = OpCompositeExtract %float %x_107 1
- %158 = OpAccessChain %_ptr_Function_float %x_111 %uint_3
- OpStore %158 %157 None
- %160 = OpLoad %v4float %x_111 None
- OpStore %x_86 %160 None
- OpBranch %132
- %132 = OpLabel
- OpBranch %117
- %117 = OpLabel
- %161 = OpLoad %uint %x_88 None
- %162 = OpIAdd %uint %161 %uint_32
- OpStore %x_89 %162 None
- %163 = OpLoad %v4float %x_86 None
- OpStore %x_85 %163 None
- %164 = OpLoad %uint %x_89 None
- OpStore %x_88 %164 None
- OpBranch %118
- %119 = OpLabel
+ %183 = OpCompositeExtract %float %x_107 0
+ %184 = OpAccessChain %_ptr_Function_float %x_109_1 %uint_2
+ OpStore %184 %183 None
+ %185 = OpLoad %v4float %x_109_1 None
+ OpStore %x_111 %185 None
+ %186 = OpCompositeExtract %float %x_107 1
+ %187 = OpAccessChain %_ptr_Function_float %x_111 %uint_3
+ OpStore %187 %186 None
+ %189 = OpLoad %v4float %x_111 None
+ OpStore %x_86 %189 None
+ OpBranch %161
+ %161 = OpLabel
+ OpBranch %140
+ %140 = OpLabel
+ %190 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ %191 = OpLoad %uint %190 None
+%tint_low_inc_1 = OpIAdd %uint %191 %uint_1
+ %193 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ OpStore %193 %tint_low_inc_1 None
+ %194 = OpIEqual %bool %tint_low_inc_1 %uint_0
+%tint_carry_1 = OpSelect %uint %194 %uint_1 %uint_0
+ %196 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ %197 = OpLoad %uint %196 None
+ %198 = OpIAdd %uint %197 %tint_carry_1
+ %199 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ OpStore %199 %198 None
+ %200 = OpLoad %uint %x_88 None
+ %201 = OpIAdd %uint %200 %uint_32
+ OpStore %x_89 %201 None
+ %202 = OpLoad %v4float %x_86 None
+ OpStore %x_85 %202 None
+ %203 = OpLoad %uint %x_89 None
+ OpStore %x_88 %203 None
+ OpBranch %141
+ %142 = OpLabel
OpControlBarrier %uint_2 %uint_2 %uint_264
- %166 = OpAccessChain %_ptr_Function_float %x_85 %uint_0
- %167 = OpLoad %float %166 None
- %168 = OpBitcast %uint %167
- %x_114 = OpAtomicUMin %uint %x_34 %uint_2 %uint_0 %168
- %170 = OpAccessChain %_ptr_Function_float %x_85 %uint_1
- %171 = OpLoad %float %170 None
- %172 = OpBitcast %uint %171
- %x_117 = OpAtomicUMin %uint %x_35 %uint_2 %uint_0 %172
- %174 = OpAccessChain %_ptr_Function_float %x_85 %uint_2
- %175 = OpLoad %float %174 None
- %176 = OpBitcast %uint %175
- %x_120 = OpAtomicUMax %uint %x_36 %uint_2 %uint_0 %176
- %178 = OpAccessChain %_ptr_Function_float %x_85 %uint_3
- %179 = OpLoad %float %178 None
- %180 = OpBitcast %uint %179
- %x_123 = OpAtomicUMax %uint %x_37 %uint_2 %uint_0 %180
+ %205 = OpAccessChain %_ptr_Function_float %x_85 %uint_0
+ %206 = OpLoad %float %205 None
+ %207 = OpBitcast %uint %206
+ %x_114 = OpAtomicUMin %uint %x_34 %uint_2 %uint_0 %207
+ %209 = OpAccessChain %_ptr_Function_float %x_85 %uint_1
+ %210 = OpLoad %float %209 None
+ %211 = OpBitcast %uint %210
+ %x_117 = OpAtomicUMin %uint %x_35 %uint_2 %uint_0 %211
+ %213 = OpAccessChain %_ptr_Function_float %x_85 %uint_2
+ %214 = OpLoad %float %213 None
+ %215 = OpBitcast %uint %214
+ %x_120 = OpAtomicUMax %uint %x_36 %uint_2 %uint_0 %215
+ %217 = OpAccessChain %_ptr_Function_float %x_85 %uint_3
+ %218 = OpLoad %float %217 None
+ %219 = OpBitcast %uint %218
+ %x_123 = OpAtomicUMax %uint %x_37 %uint_2 %uint_0 %219
OpControlBarrier %uint_2 %uint_2 %uint_264
- %183 = OpAccessChain %_ptr_StorageBuffer__runtimearr_v4float_0 %x_12 %uint_0
- %185 = OpArrayLength %uint %x_12 0
- %186 = OpISub %uint %185 %uint_1
- %187 = OpBitcast %uint %int_0
- %189 = OpExtInst %uint %77 UMin %187 %186
- %190 = OpAccessChain %_ptr_StorageBuffer_v4float_0 %x_12 %uint_0 %189
- %192 = OpAtomicLoad %uint %x_34 %uint_2 %uint_0
- %193 = OpBitcast %float %192
- %194 = OpAtomicLoad %uint %x_35 %uint_2 %uint_0
- %195 = OpBitcast %float %194
- %196 = OpAtomicLoad %uint %x_36 %uint_2 %uint_0
- %197 = OpBitcast %float %196
- %198 = OpAtomicLoad %uint %x_37 %uint_2 %uint_0
- %199 = OpBitcast %float %198
- %200 = OpCompositeConstruct %v4float %193 %195 %197 %199
- OpStore %190 %200 None
+ %222 = OpAccessChain %_ptr_StorageBuffer__runtimearr_v4float_0 %x_12 %uint_0
+ %224 = OpArrayLength %uint %x_12 0
+ %225 = OpISub %uint %224 %uint_1
+ %226 = OpBitcast %uint %int_0
+ %228 = OpExtInst %uint %90 UMin %226 %225
+ %229 = OpAccessChain %_ptr_StorageBuffer_v4float_0 %x_12 %uint_0 %228
+ %231 = OpAtomicLoad %uint %x_34 %uint_2 %uint_0
+ %232 = OpBitcast %float %231
+ %233 = OpAtomicLoad %uint %x_35 %uint_2 %uint_0
+ %234 = OpBitcast %float %233
+ %235 = OpAtomicLoad %uint %x_36 %uint_2 %uint_0
+ %236 = OpBitcast %float %235
+ %237 = OpAtomicLoad %uint %x_37 %uint_2 %uint_0
+ %238 = OpBitcast %float %237
+ %239 = OpCompositeConstruct %v4float %232 %234 %236 %238
+ OpStore %229 %239 None
OpReturn
OpFunctionEnd
- %main_inner = OpFunction %void None %204
+ %main_inner = OpFunction %void None %243
%x_3_param = OpFunctionParameter %v3uint
%tint_local_index = OpFunctionParameter %uint
- %205 = OpLabel
- %206 = OpULessThan %bool %tint_local_index %uint_1
- OpSelectionMerge %207 None
- OpBranchConditional %206 %208 %207
- %208 = OpLabel
+ %244 = OpLabel
+ %245 = OpULessThan %bool %tint_local_index %uint_1
+ OpSelectionMerge %246 None
+ OpBranchConditional %245 %247 %246
+ %247 = OpLabel
OpAtomicStore %x_34 %uint_2 %uint_0 %uint_0
OpAtomicStore %x_35 %uint_2 %uint_0 %uint_0
OpAtomicStore %x_36 %uint_2 %uint_0 %uint_0
OpAtomicStore %x_37 %uint_2 %uint_0 %uint_0
- OpBranch %207
- %207 = OpLabel
- OpBranch %213
- %213 = OpLabel
- OpBranch %216
- %216 = OpLabel
- %218 = OpPhi %uint %tint_local_index %213 %219 %215
- OpLoopMerge %217 %215 None
- OpBranch %214
- %214 = OpLabel
- %220 = OpUGreaterThanEqual %bool %218 %uint_4096
- OpSelectionMerge %221 None
- OpBranchConditional %220 %222 %221
- %222 = OpLabel
- OpBranch %217
- %221 = OpLabel
- %223 = OpAccessChain %_ptr_Workgroup_S %x_28 %218
- OpStore %223 %224 None
- OpBranch %215
- %215 = OpLabel
- %219 = OpIAdd %uint %218 %uint_32
- OpBranch %216
- %217 = OpLabel
+ OpBranch %246
+ %246 = OpLabel
+ OpBranch %252
+ %252 = OpLabel
+ OpBranch %255
+ %255 = OpLabel
+ %257 = OpPhi %uint %tint_local_index %252 %258 %254
+ OpLoopMerge %256 %254 None
+ OpBranch %253
+ %253 = OpLabel
+ %259 = OpUGreaterThanEqual %bool %257 %uint_4096
+ OpSelectionMerge %260 None
+ OpBranchConditional %259 %261 %260
+ %261 = OpLabel
+ OpBranch %256
+ %260 = OpLabel
+ %262 = OpAccessChain %_ptr_Workgroup_S %x_28 %257
+ OpStore %262 %263 None
+ OpBranch %254
+ %254 = OpLabel
+ %258 = OpIAdd %uint %257 %uint_32
+ OpBranch %255
+ %256 = OpLabel
OpControlBarrier %uint_2 %uint_2 %uint_264
OpStore %x_3 %x_3_param None
- %226 = OpFunctionCall %void %main_1
+ %265 = OpFunctionCall %void %main_1
OpReturn
OpFunctionEnd
%main = OpFunction %void None %37
- %228 = OpLabel
- %229 = OpLoad %v3uint %main_local_invocation_id_Input None
- %230 = OpLoad %uint %main_local_invocation_index_Input None
- %231 = OpFunctionCall %void %main_inner %229 %230
+ %267 = OpLabel
+ %268 = OpLoad %v3uint %main_local_invocation_id_Input None
+ %269 = OpLoad %uint %main_local_invocation_index_Input None
+ %270 = OpFunctionCall %void %main_inner %268 %269
OpReturn
OpFunctionEnd
diff --git a/test/tint/bug/tint/2039.wgsl.expected.spvasm b/test/tint/bug/tint/2039.wgsl.expected.spvasm
index 146e0a9..d295010 100644
--- a/test/tint/bug/tint/2039.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/2039.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 23
+; Bound: 46
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -9,38 +9,70 @@
OpExecutionMode %main LocalSize 1 1 1
OpName %main "main"
OpName %out "out"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
%void = OpTypeVoid
%3 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%_ptr_Function_uint = OpTypePointer Function %uint
%uint_0 = OpConstant %uint 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %17 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %20 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%int = OpTypeInt 32 1
%int_2 = OpConstant %int 2
%uint_1 = OpConstant %uint 1
- %bool = OpTypeBool
%true = OpConstantTrue %bool
%main = OpFunction %void None %3
%4 = OpLabel
%out = OpVariable %_ptr_Function_uint Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %17
OpStore %out %uint_0
- OpBranch %11
- %11 = OpLabel
- OpLoopMerge %12 %10 None
OpBranch %9
%9 = OpLabel
- OpSelectionMerge %17 None
- OpSwitch %int_2 %13 1 %16
- %16 = OpLabel
- OpBranch %10
- %13 = OpLabel
- OpBranch %17
- %17 = OpLabel
- %18 = OpLoad %uint %out None
- %19 = OpIAdd %uint %18 %uint_1
- OpStore %out %19 None
+ OpBranch %12
+ %12 = OpLabel
+ OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
- OpBranchConditional %true %12 %11
- %12 = OpLabel
+ %18 = OpLoad %v2uint %tint_loop_idx None
+ %19 = OpIEqual %v2bool %18 %20
+ %24 = OpAll %bool %19
+ OpSelectionMerge %25 None
+ OpBranchConditional %24 %26 %25
+ %26 = OpLabel
+ OpBranch %13
+ %25 = OpLabel
+ OpSelectionMerge %31 None
+ OpSwitch %int_2 %27 1 %30
+ %30 = OpLabel
+ OpBranch %11
+ %27 = OpLabel
+ OpBranch %31
+ %31 = OpLabel
+ %32 = OpLoad %uint %out None
+ %33 = OpIAdd %uint %32 %uint_1
+ OpStore %out %33 None
+ OpBranch %11
+ %11 = OpLabel
+ %35 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %36 = OpLoad %uint %35 None
+%tint_low_inc = OpIAdd %uint %36 %uint_1
+ %38 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %38 %tint_low_inc None
+ %39 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %39 %uint_1 %uint_0
+ %41 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %42 = OpLoad %uint %41 None
+ %43 = OpIAdd %uint %42 %tint_carry
+ %44 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %44 %43 None
+ OpBranchConditional %true %13 %12
+ %13 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/bug/tint/2201.wgsl.expected.spvasm b/test/tint/bug/tint/2201.wgsl.expected.spvasm
index 49413ac..8099e65 100644
--- a/test/tint/bug/tint/2201.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/2201.wgsl.expected.spvasm
@@ -5,34 +5,70 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 14
+; Bound: 41
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main"
OpExecutionMode %main LocalSize 1 1 1
OpName %main "main"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
%void = OpTypeVoid
%3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %14 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %17 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%true = OpConstantTrue %bool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%main = OpFunction %void None %3
%4 = OpLabel
- OpBranch %7
- %7 = OpLabel
- OpLoopMerge %8 %6 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %14
OpBranch %5
%5 = OpLabel
- OpSelectionMerge %9 None
- OpBranchConditional %true %10 %11
- %10 = OpLabel
OpBranch %8
- %11 = OpLabel
+ %8 = OpLabel
+ OpLoopMerge %9 %7 None
+ OpBranch %6
+ %6 = OpLabel
+ %15 = OpLoad %v2uint %tint_loop_idx None
+ %16 = OpIEqual %v2bool %15 %17
+ %21 = OpAll %bool %16
+ OpSelectionMerge %22 None
+ OpBranchConditional %21 %23 %22
+ %23 = OpLabel
+ OpBranch %9
+ %22 = OpLabel
+ OpSelectionMerge %24 None
+ OpBranchConditional %true %25 %26
+ %25 = OpLabel
+ OpBranch %9
+ %26 = OpLabel
+ OpBranch %9
+ %24 = OpLabel
+ OpUnreachable
+ %7 = OpLabel
+ %28 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %31 = OpLoad %uint %28 None
+%tint_low_inc = OpIAdd %uint %31 %uint_1
+ %34 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %34 %tint_low_inc None
+ %35 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %35 %uint_1 %uint_0
+ %37 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %38 = OpLoad %uint %37 None
+ %39 = OpIAdd %uint %38 %tint_carry
+ %40 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %40 %39 None
OpBranch %8
%9 = OpLabel
- OpUnreachable
- %6 = OpLabel
- OpBranch %7
- %8 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/bug/tint/2202.wgsl.expected.spvasm b/test/tint/bug/tint/2202.wgsl.expected.spvasm
index db75378..e4d6b46 100644
--- a/test/tint/bug/tint/2202.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/2202.wgsl.expected.spvasm
@@ -5,34 +5,97 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 13
+; Bound: 58
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main"
OpExecutionMode %main LocalSize 1 1 1
OpName %main "main"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_loop_idx_0 "tint_loop_idx"
+ OpName %tint_low_inc_1 "tint_low_inc_1"
+ OpName %tint_carry_1 "tint_carry_1"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
%void = OpTypeVoid
%3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %14 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %17 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%main = OpFunction %void None %3
%4 = OpLabel
- OpBranch %7
- %7 = OpLabel
- OpLoopMerge %8 %6 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %14
+%tint_loop_idx_0 = OpVariable %_ptr_Function_v2uint Function %14
OpBranch %5
%5 = OpLabel
- OpBranch %11
- %11 = OpLabel
- OpLoopMerge %12 %10 None
- OpBranch %9
- %9 = OpLabel
- OpReturn
- %10 = OpLabel
- OpBranch %11
- %12 = OpLabel
- OpUnreachable
- %6 = OpLabel
- OpBranch %7
+ OpBranch %8
%8 = OpLabel
+ OpLoopMerge %9 %7 None
+ OpBranch %6
+ %6 = OpLabel
+ %15 = OpLoad %v2uint %tint_loop_idx None
+ %16 = OpIEqual %v2bool %15 %17
+ %21 = OpAll %bool %16
+ OpSelectionMerge %22 None
+ OpBranchConditional %21 %23 %22
+ %23 = OpLabel
+ OpBranch %9
+ %22 = OpLabel
+ OpBranch %24
+ %24 = OpLabel
+ OpBranch %27
+ %27 = OpLabel
+ OpLoopMerge %28 %26 None
+ OpBranch %25
+ %25 = OpLabel
+ %30 = OpLoad %v2uint %tint_loop_idx_0 None
+ %31 = OpIEqual %v2bool %30 %17
+ %32 = OpAll %bool %31
+ OpSelectionMerge %33 None
+ OpBranchConditional %32 %34 %33
+ %34 = OpLabel
+ OpBranch %28
+ %33 = OpLabel
+ OpReturn
+ %26 = OpLabel
+ %35 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ %38 = OpLoad %uint %35 None
+%tint_low_inc_1 = OpIAdd %uint %38 %uint_1
+ %41 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ OpStore %41 %tint_low_inc_1 None
+ %42 = OpIEqual %bool %tint_low_inc_1 %uint_0
+%tint_carry_1 = OpSelect %uint %42 %uint_1 %uint_0
+ %44 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ %45 = OpLoad %uint %44 None
+ %46 = OpIAdd %uint %45 %tint_carry_1
+ %47 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ OpStore %47 %46 None
+ OpBranch %27
+ %28 = OpLabel
+ OpUnreachable
+ %7 = OpLabel
+ %48 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %49 = OpLoad %uint %48 None
+%tint_low_inc = OpIAdd %uint %49 %uint_1
+ %51 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %51 %tint_low_inc None
+ %52 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %52 %uint_1 %uint_0
+ %54 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %55 = OpLoad %uint %54 None
+ %56 = OpIAdd %uint %55 %tint_carry
+ %57 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %57 %56 None
+ OpBranch %8
+ %9 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/bug/tint/221.wgsl.expected.spvasm b/test/tint/bug/tint/221.wgsl.expected.spvasm
index dd13dd8..e324f28 100644
--- a/test/tint/bug/tint/221.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/221.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 53
+; Bound: 76
; Schema: 0
OpCapability Shader
- %29 = OpExtInstImport "GLSL.std.450"
+ %42 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main"
OpExecutionMode %main LocalSize 1 1 1
@@ -15,7 +15,10 @@
OpName %b_block "b_block"
OpName %main "main"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %p "p"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %tint_mod_u32 "tint_mod_u32"
OpName %lhs "lhs"
OpName %rhs "rhs"
@@ -38,62 +41,91 @@
%10 = OpTypeFunction %void
%_ptr_Function_uint = OpTypePointer Function %uint
%uint_0 = OpConstant %uint 0
-%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %23 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %26 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
%uint_49 = OpConstant %uint 49
%uint_1 = OpConstant %uint 1
%uint_2 = OpConstant %uint 2
- %46 = OpTypeFunction %uint %uint %uint
+ %69 = OpTypeFunction %uint %uint %uint
%main = OpFunction %void None %10
%11 = OpLabel
%i = OpVariable %_ptr_Function_uint Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %23
OpStore %i %uint_0
- OpBranch %17
- %17 = OpLabel
- OpLoopMerge %18 %16 None
OpBranch %15
%15 = OpLabel
- %19 = OpLoad %uint %i None
- %20 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0 %uint_0
- %22 = OpLoad %uint %20 None
- %23 = OpUGreaterThanEqual %bool %19 %22
- OpSelectionMerge %25 None
- OpBranchConditional %23 %26 %25
- %26 = OpLabel
OpBranch %18
- %25 = OpLabel
- %27 = OpLoad %uint %i None
- %28 = OpExtInst %uint %29 UMin %27 %uint_49
- %p = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0 %uint_1 %28
+ %18 = OpLabel
+ OpLoopMerge %19 %17 None
+ OpBranch %16
+ %16 = OpLabel
+ %24 = OpLoad %v2uint %tint_loop_idx None
+ %25 = OpIEqual %v2bool %24 %26
+ %30 = OpAll %bool %25
+ OpSelectionMerge %31 None
+ OpBranchConditional %30 %32 %31
+ %32 = OpLabel
+ OpBranch %19
+ %31 = OpLabel
%33 = OpLoad %uint %i None
- %34 = OpFunctionCall %uint %tint_mod_u32 %33 %uint_2
- %37 = OpIEqual %bool %34 %uint_0
+ %34 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0 %uint_0
+ %36 = OpLoad %uint %34 None
+ %37 = OpUGreaterThanEqual %bool %33 %36
OpSelectionMerge %38 None
OpBranchConditional %37 %39 %38
%39 = OpLabel
- OpBranch %16
+ OpBranch %19
%38 = OpLabel
- OpStore %p %uint_0 None
- OpBranch %16
- %16 = OpLabel
- %40 = OpLoad %uint %p None
- %41 = OpIMul %uint %40 %uint_2
- OpStore %p %41 None
- %42 = OpLoad %uint %i None
- %43 = OpIAdd %uint %42 %uint_1
- OpStore %i %43 None
+ %40 = OpLoad %uint %i None
+ %41 = OpExtInst %uint %42 UMin %40 %uint_49
+ %p = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0 %uint_1 %41
+ %46 = OpLoad %uint %i None
+ %47 = OpFunctionCall %uint %tint_mod_u32 %46 %uint_2
+ %50 = OpIEqual %bool %47 %uint_0
+ OpSelectionMerge %51 None
+ OpBranchConditional %50 %52 %51
+ %52 = OpLabel
OpBranch %17
- %18 = OpLabel
+ %51 = OpLabel
+ OpStore %p %uint_0 None
+ OpBranch %17
+ %17 = OpLabel
+ %53 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %54 = OpLoad %uint %53 None
+%tint_low_inc = OpIAdd %uint %54 %uint_1
+ %56 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %56 %tint_low_inc None
+ %57 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %57 %uint_1 %uint_0
+ %59 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %60 = OpLoad %uint %59 None
+ %61 = OpIAdd %uint %60 %tint_carry
+ %62 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %62 %61 None
+ %63 = OpLoad %uint %p None
+ %64 = OpIMul %uint %63 %uint_2
+ OpStore %p %64 None
+ %65 = OpLoad %uint %i None
+ %66 = OpIAdd %uint %65 %uint_1
+ OpStore %i %66 None
+ OpBranch %18
+ %19 = OpLabel
OpReturn
OpFunctionEnd
-%tint_mod_u32 = OpFunction %uint None %46
+%tint_mod_u32 = OpFunction %uint None %69
%lhs = OpFunctionParameter %uint
%rhs = OpFunctionParameter %uint
- %47 = OpLabel
- %48 = OpIEqual %bool %rhs %uint_0
- %49 = OpSelect %uint %48 %uint_1 %rhs
- %50 = OpUDiv %uint %lhs %49
- %51 = OpIMul %uint %50 %49
- %52 = OpISub %uint %lhs %51
- OpReturnValue %52
+ %70 = OpLabel
+ %71 = OpIEqual %bool %rhs %uint_0
+ %72 = OpSelect %uint %71 %uint_1 %rhs
+ %73 = OpUDiv %uint %lhs %72
+ %74 = OpIMul %uint %73 %72
+ %75 = OpISub %uint %lhs %74
+ OpReturnValue %75
OpFunctionEnd
diff --git a/test/tint/bug/tint/349291130.wgsl.expected.spvasm b/test/tint/bug/tint/349291130.wgsl.expected.spvasm
index cb6adf4..474f221 100644
--- a/test/tint/bug/tint/349291130.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/349291130.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 25
+; Bound: 48
; Schema: 0
OpCapability Shader
OpCapability ImageQuery
@@ -10,7 +10,10 @@
OpExecutionMode %e LocalSize 6 1 1
OpName %texture "texture"
OpName %e "e"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %level "level"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpDecorate %texture DescriptorSet 0
OpDecorate %texture Binding 0
%float = OpTypeFloat 32
@@ -20,31 +23,59 @@
%void = OpTypeVoid
%7 = OpTypeFunction %void
%uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %18 = OpConstantNull %v2uint
%_ptr_Function_uint = OpTypePointer Function %uint
- %uint_0 = OpConstant %uint 0
+%uint_4294967295 = OpConstant %uint 4294967295
+ %25 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%e = OpFunction %void None %7
%8 = OpLabel
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %18
%level = OpVariable %_ptr_Function_uint Function
OpBranch %9
%9 = OpLabel
- %14 = OpLoad %3 %texture None
- %15 = OpImageQueryLevels %uint %14
- OpStore %level %15
+ %19 = OpLoad %3 %texture None
+ %20 = OpImageQueryLevels %uint %19
+ OpStore %level %20
OpBranch %12
%12 = OpLabel
OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
- %19 = OpLoad %uint %level None
- %20 = OpUGreaterThan %bool %19 %uint_0
- OpSelectionMerge %23 None
- OpBranchConditional %20 %23 %24
- %24 = OpLabel
+ %23 = OpLoad %v2uint %tint_loop_idx None
+ %24 = OpIEqual %v2bool %23 %25
+ %29 = OpAll %bool %24
+ OpSelectionMerge %30 None
+ OpBranchConditional %29 %31 %30
+ %31 = OpLabel
OpBranch %13
- %23 = OpLabel
+ %30 = OpLabel
+ %32 = OpLoad %uint %level None
+ %33 = OpUGreaterThan %bool %32 %uint_0
+ OpSelectionMerge %35 None
+ OpBranchConditional %33 %35 %36
+ %36 = OpLabel
+ OpBranch %13
+ %35 = OpLabel
OpBranch %11
%11 = OpLabel
+ %37 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %38 = OpLoad %uint %37 None
+%tint_low_inc = OpIAdd %uint %38 %uint_1
+ %41 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %41 %tint_low_inc None
+ %42 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %42 %uint_1 %uint_0
+ %44 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %45 = OpLoad %uint %44 None
+ %46 = OpIAdd %uint %45 %tint_carry
+ %47 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %47 %46 None
OpBranch %12
%13 = OpLabel
OpReturn
diff --git a/test/tint/bug/tint/354627692.wgsl.expected.spvasm b/test/tint/bug/tint/354627692.wgsl.expected.spvasm
index 7ea0ec0..4c1f6cc 100644
--- a/test/tint/bug/tint/354627692.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/354627692.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 41
+; Bound: 83
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -11,6 +11,12 @@
OpName %buffer_block "buffer_block"
OpName %main "main"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
+ OpName %tint_loop_idx_0 "tint_loop_idx"
+ OpName %tint_low_inc_1 "tint_low_inc_1"
+ OpName %tint_carry_1 "tint_carry_1"
OpMemberDecorate %buffer_block 0 Offset 0
OpDecorate %buffer_block Block
OpDecorate %1 DescriptorSet 0
@@ -26,53 +32,107 @@
%uint = OpTypeInt 32 0
%uint_0 = OpConstant %uint 0
%_ptr_Function_int = OpTypePointer Function %int
- %int_5 = OpConstant %int 5
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %24 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %27 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_1 = OpConstant %uint 1
+ %int_5 = OpConstant %int 5
%int_2 = OpConstant %int 2
%int_10 = OpConstant %int 10
%main = OpFunction %void None %7
%8 = OpLabel
%i = OpVariable %_ptr_Function_int Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %24
+%tint_loop_idx_0 = OpVariable %_ptr_Function_v2uint Function %24
%9 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
%13 = OpLoad %int %9 None
OpStore %i %13
- OpBranch %18
- %18 = OpLabel
- OpLoopMerge %19 %17 None
OpBranch %16
%16 = OpLabel
+ OpBranch %19
+ %19 = OpLabel
+ OpLoopMerge %20 %18 None
OpBranch %17
%17 = OpLabel
- OpBranch %22
- %22 = OpLabel
- OpLoopMerge %23 %21 None
+ %25 = OpLoad %v2uint %tint_loop_idx None
+ %26 = OpIEqual %v2bool %25 %27
+ %31 = OpAll %bool %26
+ OpSelectionMerge %32 None
+ OpBranchConditional %31 %33 %32
+ %33 = OpLabel
OpBranch %20
+ %32 = OpLabel
+ OpBranch %18
+ %18 = OpLabel
+ %34 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %36 = OpLoad %uint %34 None
+%tint_low_inc = OpIAdd %uint %36 %uint_1
+ %39 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %39 %tint_low_inc None
+ %40 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %40 %uint_1 %uint_0
+ %42 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %43 = OpLoad %uint %42 None
+ %44 = OpIAdd %uint %43 %tint_carry
+ %45 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %45 %44 None
+ OpBranch %46
+ %46 = OpLabel
+ OpBranch %49
+ %49 = OpLabel
+ OpLoopMerge %50 %48 None
+ OpBranch %47
+ %47 = OpLabel
+ %52 = OpLoad %v2uint %tint_loop_idx_0 None
+ %53 = OpIEqual %v2bool %52 %27
+ %54 = OpAll %bool %53
+ OpSelectionMerge %55 None
+ OpBranchConditional %54 %56 %55
+ %56 = OpLabel
+ OpBranch %50
+ %55 = OpLabel
+ %57 = OpLoad %int %i None
+ %58 = OpSGreaterThan %bool %57 %int_5
+ OpSelectionMerge %60 None
+ OpBranchConditional %58 %61 %62
+ %61 = OpLabel
+ %63 = OpLoad %int %i None
+ %64 = OpIMul %int %63 %int_2
+ OpStore %i %64 None
+ OpBranch %50
+ %62 = OpLabel
+ %66 = OpLoad %int %i None
+ %67 = OpIMul %int %66 %int_2
+ OpStore %i %67 None
+ OpBranch %50
+ %60 = OpLabel
+ OpBranch %50
+ %48 = OpLabel
+ %68 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ %69 = OpLoad %uint %68 None
+%tint_low_inc_1 = OpIAdd %uint %69 %uint_1
+ %71 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ OpStore %71 %tint_low_inc_1 None
+ %72 = OpIEqual %bool %tint_low_inc_1 %uint_0
+%tint_carry_1 = OpSelect %uint %72 %uint_1 %uint_0
+ %74 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ %75 = OpLoad %uint %74 None
+ %76 = OpIAdd %uint %75 %tint_carry_1
+ %77 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ OpStore %77 %76 None
+ OpBranch %49
+ %50 = OpLabel
+ %78 = OpLoad %int %i None
+ %79 = OpSGreaterThan %bool %78 %int_10
+ OpBranchConditional %79 %20 %19
%20 = OpLabel
- %24 = OpLoad %int %i None
- %25 = OpSGreaterThan %bool %24 %int_5
- OpSelectionMerge %28 None
- OpBranchConditional %25 %29 %30
- %29 = OpLabel
- %31 = OpLoad %int %i None
- %32 = OpIMul %int %31 %int_2
- OpStore %i %32 None
- OpBranch %23
- %30 = OpLabel
- %34 = OpLoad %int %i None
- %35 = OpIMul %int %34 %int_2
- OpStore %i %35 None
- OpBranch %23
- %28 = OpLabel
- OpBranch %23
- %21 = OpLabel
- OpBranch %22
- %23 = OpLabel
- %36 = OpLoad %int %i None
- %37 = OpSGreaterThan %bool %36 %int_10
- OpBranchConditional %37 %19 %18
- %19 = OpLabel
- %39 = OpLoad %int %i None
- %40 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
- OpStore %40 %39 None
+ %81 = OpLoad %int %i None
+ %82 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+ OpStore %82 %81 None
OpReturn
OpFunctionEnd
diff --git a/test/tint/bug/tint/379127084.wgsl.expected.spvasm b/test/tint/bug/tint/379127084.wgsl.expected.spvasm
index c1ba1c7..e724581 100644
--- a/test/tint/bug/tint/379127084.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/379127084.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 564
+; Bound: 604
; Schema: 0
OpCapability Shader
%52 = OpExtInstImport "GLSL.std.450"
@@ -48,6 +48,7 @@
OpName %_59_m "_59_m"
OpName %_60_n "_60_n"
OpName %_61_o "_61_o"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %_62_f "_62_f"
OpName %_skTemp2 "_skTemp2"
OpName %_skTemp3 "_skTemp3"
@@ -63,6 +64,7 @@
OpName %_skTemp6 "_69_e"
OpName %_71_g "_71_g"
OpName %_72_h "_72_h"
+ OpName %tint_loop_idx_0 "tint_loop_idx"
OpName %_73_i "_73_i"
OpName %_74_j "_74_j"
OpName %_75_k "_75_k"
@@ -208,37 +210,43 @@
%float_1 = OpConstant %float 1
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
- %uint_3 = OpConstant %uint 3
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %96 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %99 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
- %118 = OpConstantComposite %v2float %float_1 %float_1
+ %v2bool = OpTypeVector %bool 2
+ %uint_3 = OpConstant %uint 3
+ %130 = OpConstantComposite %v2float %float_1 %float_1
%uint_4 = OpConstant %uint 4
- %129 = OpConstantNull %int
+ %141 = OpConstantNull %int
%float_0_00390625 = OpConstant %float 0.00390625
%float_n0_474999994 = OpConstant %float -0.474999994
%float_n16 = OpConstant %float -16
%float_15_9899998 = OpConstant %float 15.9899998
- %154 = OpTypeSampledImage %24
+ %166 = OpTypeSampledImage %24
%false = OpConstantFalse %bool
%float_255 = OpConstant %float 255
- %175 = OpConstantComposite %v2float %float_255 %float_255
- %178 = OpConstantComposite %v2float %float_0_5 %float_0_5
+ %187 = OpConstantComposite %v2float %float_255 %float_255
+ %190 = OpConstantComposite %v2float %float_0_5 %float_0_5
%float_0_00392156886 = OpConstant %float 0.00392156886
- %181 = OpConstantComposite %v2float %float_0_00392156886 %float_0_00392156886
+ %193 = OpConstantComposite %v2float %float_0_00392156886 %float_0_00392156886
%float_256 = OpConstant %float 256
- %193 = OpConstantComposite %v4float %float_0_00390625 %float_0_00390625 %float_0_00390625 %float_0_00390625
- %198 = OpConstantNull %v2float
+ %205 = OpConstantComposite %v4float %float_0_00390625 %float_0_00390625 %float_0_00390625 %float_0_00390625
+ %210 = OpConstantNull %v2float
%float_0_25 = OpConstant %float 0.25
%float_2 = OpConstant %float 2
+%_ptr_Function_uint = OpTypePointer Function %uint
%int_1 = OpConstant %int 1
%int_4 = OpConstant %int 4
- %324 = OpConstantComposite %v2float %float_2 %float_2
- %336 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5
- %340 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+ %354 = OpConstantComposite %v2float %float_2 %float_2
+ %376 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5
+ %380 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
%v3float = OpTypeVector %float 3
%float_0_212599993 = OpConstant %float 0.212599993
%float_0_715200007 = OpConstant %float 0.715200007
%float_0_0722000003 = OpConstant %float 0.0722000003
- %352 = OpConstantComposite %v3float %float_0_212599993 %float_0_715200007 %float_0_0722000003
+ %392 = OpConstantComposite %v3float %float_0_212599993 %float_0_715200007 %float_0_0722000003
%float_0 = OpConstant %float 0
%uint_7 = OpConstant %uint 7
%float_n1 = OpConstant %float -1
@@ -251,14 +259,14 @@
%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float
%uint_6 = OpConstant %uint 6
%float_0_333333343 = OpConstant %float 0.333333343
- %493 = OpConstantComposite %v3float %float_0 %float_0_666666687 %float_0_333333343
+ %533 = OpConstantComposite %v3float %float_0 %float_0_666666687 %float_0_333333343
%float_3 = OpConstant %float 3
- %504 = OpConstantNull %v3float
- %505 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+ %544 = OpConstantNull %v3float
+ %545 = OpConstantComposite %v3float %float_1 %float_1 %float_1
%uint_8 = OpConstant %uint 8
- %550 = OpTypeFunction %FSOut %FSIn
- %553 = OpConstantNull %FSOut
- %557 = OpTypeFunction %void
+ %590 = OpTypeFunction %FSOut %FSIn
+ %593 = OpConstantNull %FSOut
+ %597 = OpTypeFunction %void
%_skslMain = OpFunction %void None %41
%_stageIn = OpFunctionParameter %FSIn
%_stageOut_root = OpFunctionParameter %_ptr_Function_FSOut
@@ -268,11 +276,13 @@
%_59_m = OpVariable %_ptr_Function_v2float Function
%_60_n = OpVariable %_ptr_Function_float Function
%_61_o = OpVariable %_ptr_Function_int Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %96
%_62_f = OpVariable %_ptr_Function_v4float Function %74
%_65_i = OpVariable %_ptr_Function_v2float Function
%_66_j = OpVariable %_ptr_Function_v4float Function
%_71_g = OpVariable %_ptr_Function_v4float Function %74
%_72_h = OpVariable %_ptr_Function_int Function
+%tint_loop_idx_0 = OpVariable %_ptr_Function_v2uint Function %96
%_78_n = OpVariable %_ptr_Function_v2float Function
%_79_o = OpVariable %_ptr_Function_float Function
%_80_p = OpVariable %_ptr_Function_float Function
@@ -313,507 +323,551 @@
OpStore %_59_m %81
OpStore %_60_n %float_1
OpStore %_61_o %int_0
- OpBranch %91
- %91 = OpLabel
- OpLoopMerge %92 %90 None
OpBranch %89
%89 = OpLabel
- %93 = OpLoad %int %_61_o None
- %94 = OpLoad %uint %shadingSsboIndex None
- %95 = OpAccessChain %_ptr_StorageBuffer__runtimearr_FSUniformData %_storage1 %uint_0
- %96 = OpArrayLength %uint %_storage1 0
- %97 = OpISub %uint %96 %uint_1
- %98 = OpExtInst %uint %52 UMin %94 %97
- %99 = OpAccessChain %_ptr_StorageBuffer_int %_storage1 %uint_0 %98 %uint_3
- %101 = OpLoad %int %99 None
- %102 = OpSLessThan %bool %93 %101
- OpSelectionMerge %104 None
- OpBranchConditional %102 %105 %106
- %105 = OpLabel
- %108 = OpLoad %v2float %_57_k None
- %_skTemp2 = OpExtInst %v2float %52 Floor %108
- %110 = OpLoad %v4float %_62_f None
- %111 = OpVectorShuffle %v2float %110 %110 2 3
- %112 = OpCompositeConstruct %v4float %_skTemp2 %111
- OpStore %_62_f %112 None
- %113 = OpLoad %v4float %_62_f None
- %114 = OpVectorShuffle %v2float %113 %113 0 1
- %115 = OpLoad %v4float %_62_f None
- %116 = OpVectorShuffle %v2float %115 %115 0 1
- %117 = OpFAdd %v2float %116 %118
- %119 = OpCompositeConstruct %v4float %114 %117
- OpStore %_62_f %119 None
- %120 = OpLoad %uint %shadingSsboIndex None
- %121 = OpAccessChain %_ptr_StorageBuffer__runtimearr_FSUniformData %_storage1 %uint_0
- %122 = OpArrayLength %uint %_storage1 0
- %123 = OpISub %uint %122 %uint_1
- %124 = OpExtInst %uint %52 UMin %120 %123
- %125 = OpAccessChain %_ptr_StorageBuffer_int %_storage1 %uint_0 %124 %uint_4
- %127 = OpLoad %int %125 None
- %128 = OpINotEqual %bool %127 %129
- OpSelectionMerge %130 None
- OpBranchConditional %128 %131 %130
- %131 = OpLabel
- %132 = OpLoad %v2float %_59_m None
- %133 = OpVectorShuffle %v4float %132 %132 0 1 0 1
- %134 = OpLoad %v4float %_62_f None
- %_skTemp3 = OpExtInst %v4float %52 Step %133 %134
- %136 = OpLoad %v4float %_62_f None
- %137 = OpLoad %v2float %_59_m None
- %138 = OpVectorShuffle %v4float %137 %137 0 1 0 1
- %139 = OpFMul %v4float %_skTemp3 %138
- %140 = OpFSub %v4float %136 %139
- OpStore %_62_f %140 None
- OpBranch %130
- %130 = OpLabel
- %141 = OpLoad %24 %permutationsSampler_1_Texture None
- %142 = OpLoad %21 %permutationsSampler_1_Sampler None
- %143 = OpAccessChain %_ptr_Function_float %_62_f %uint_0
- %144 = OpLoad %float %143 None
- %145 = OpFAdd %float %144 %float_0_5
- %146 = OpFMul %float %145 %float_0_00390625
- %148 = OpCompositeConstruct %v2float %146 %float_0_5
- %149 = OpExtInst %float %52 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
- %153 = OpSampledImage %154 %141 %142
- %155 = OpImageSampleImplicitLod %v4float %153 %148 Bias %149
- %_63_g = OpCompositeExtract %float %155 0
- %157 = OpLoad %24 %permutationsSampler_1_Texture None
- %158 = OpLoad %21 %permutationsSampler_1_Sampler None
- %159 = OpAccessChain %_ptr_Function_float %_62_f %uint_2
- %160 = OpLoad %float %159 None
- %161 = OpFAdd %float %160 %float_0_5
- %162 = OpFMul %float %161 %float_0_00390625
- %163 = OpCompositeConstruct %v2float %162 %float_0_5
- %164 = OpExtInst %float %52 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
- %165 = OpSampledImage %154 %157 %158
- %166 = OpImageSampleImplicitLod %v4float %165 %163 Bias %164
- %_64_h = OpCompositeExtract %float %166 0
- %168 = OpCompositeConstruct %v2float %_63_g %_64_h
- OpStore %_65_i %168
- OpSelectionMerge %170 None
- OpBranchConditional %false %171 %170
- %171 = OpLabel
- %173 = OpLoad %v2float %_65_i None
- %174 = OpFMul %v2float %173 %175
- %177 = OpFAdd %v2float %174 %178
- %_skTemp4 = OpExtInst %v2float %52 Floor %177
- %180 = OpFMul %v2float %_skTemp4 %181
- OpStore %_65_i %180 None
- OpBranch %170
- %170 = OpLabel
- %183 = OpLoad %v2float %_65_i None
- %184 = OpVectorShuffle %v4float %183 %183 0 1 0 1
- %185 = OpVectorTimesScalar %v4float %184 %float_256
- %187 = OpLoad %v4float %_62_f None
- %188 = OpVectorShuffle %v4float %187 %187 1 1 3 3
- %189 = OpFAdd %v4float %185 %188
- OpStore %_66_j %189
- %191 = OpLoad %v4float %_66_j None
- %192 = OpFMul %v4float %191 %193
- OpStore %_66_j %192 None
- %_67_p = OpLoad %v4float %_66_j None
- %195 = OpLoad %v2float %_57_k None
- %_skTemp5 = OpExtInst %v2float %52 Fract %195
- %_skTemp6 = OpExtInst %v2float %52 SmoothStep %198 %118 %_skTemp5
- OpStore %_72_h %int_0
- OpBranch %203
- %203 = OpLabel
- OpLoopMerge %204 %202 None
- OpBranch %201
- %201 = OpLabel
- %205 = OpLoad %int %_72_h None
- %206 = OpConvertSToF %float %205
- %207 = OpFAdd %float %206 %float_0_5
- %_73_i = OpFMul %float %207 %float_0_25
- %210 = OpLoad %24 %noiseSampler_1_Texture None
- %211 = OpLoad %21 %noiseSampler_1_Sampler None
- %212 = OpCompositeExtract %float %_67_p 0
- %213 = OpCompositeConstruct %v2float %212 %_73_i
- %214 = OpExtInst %float %52 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
- %215 = OpSampledImage %154 %210 %211
- %_74_j = OpImageSampleImplicitLod %v4float %215 %213 Bias %214
- %217 = OpLoad %24 %noiseSampler_1_Texture None
- %218 = OpLoad %21 %noiseSampler_1_Sampler None
- %219 = OpCompositeExtract %float %_67_p 1
- %220 = OpCompositeConstruct %v2float %219 %_73_i
- %221 = OpExtInst %float %52 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
- %222 = OpSampledImage %154 %217 %218
- %_75_k = OpImageSampleImplicitLod %v4float %222 %220 Bias %221
- %224 = OpLoad %24 %noiseSampler_1_Texture None
- %225 = OpLoad %21 %noiseSampler_1_Sampler None
- %226 = OpCompositeExtract %float %_67_p 3
- %227 = OpCompositeConstruct %v2float %226 %_73_i
- %228 = OpExtInst %float %52 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
- %229 = OpSampledImage %154 %224 %225
- %_76_l = OpImageSampleImplicitLod %v4float %229 %227 Bias %228
- %231 = OpLoad %24 %noiseSampler_1_Texture None
- %232 = OpLoad %21 %noiseSampler_1_Sampler None
- %233 = OpCompositeExtract %float %_67_p 2
- %234 = OpCompositeConstruct %v2float %233 %_73_i
- %235 = OpExtInst %float %52 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
- %236 = OpSampledImage %154 %231 %232
- %_77_m = OpImageSampleImplicitLod %v4float %236 %234 Bias %235
- OpStore %_78_n %_skTemp5
- %239 = OpVectorShuffle %v2float %_74_j %_74_j 1 3
- %240 = OpVectorShuffle %v2float %_74_j %_74_j 0 2
- %241 = OpVectorTimesScalar %v2float %240 %float_0_00390625
- %242 = OpFAdd %v2float %239 %241
- %243 = OpVectorTimesScalar %v2float %242 %float_2
- %245 = OpCompositeConstruct %v2float %float_1 %float_1
- %246 = OpFSub %v2float %243 %245
- %247 = OpLoad %v2float %_78_n None
- %_skTemp7 = OpDot %float %246 %247
- OpStore %_79_o %_skTemp7
- %250 = OpAccessChain %_ptr_Function_float %_78_n %uint_0
- %251 = OpLoad %float %250 None
- %252 = OpFSub %float %251 %float_1
- %253 = OpAccessChain %_ptr_Function_float %_78_n %uint_0
- OpStore %253 %252 None
- %254 = OpVectorShuffle %v2float %_75_k %_75_k 1 3
- %255 = OpVectorShuffle %v2float %_75_k %_75_k 0 2
- %256 = OpVectorTimesScalar %v2float %255 %float_0_00390625
- %257 = OpFAdd %v2float %254 %256
- %258 = OpVectorTimesScalar %v2float %257 %float_2
- %259 = OpCompositeConstruct %v2float %float_1 %float_1
- %260 = OpFSub %v2float %258 %259
- %261 = OpLoad %v2float %_78_n None
- %_skTemp8 = OpDot %float %260 %261
- OpStore %_80_p %_skTemp8
- %264 = OpLoad %float %_79_o None
- %265 = OpLoad %float %_80_p None
- %266 = OpCompositeExtract %float %_skTemp6 0
- %_skTemp9 = OpExtInst %float %52 FMix %264 %265 %266
- %268 = OpAccessChain %_ptr_Function_float %_78_n %uint_1
- %269 = OpLoad %float %268 None
- %270 = OpFSub %float %269 %float_1
- %271 = OpAccessChain %_ptr_Function_float %_78_n %uint_1
- OpStore %271 %270 None
- %272 = OpVectorShuffle %v2float %_76_l %_76_l 1 3
- %273 = OpVectorShuffle %v2float %_76_l %_76_l 0 2
- %274 = OpVectorTimesScalar %v2float %273 %float_0_00390625
- %275 = OpFAdd %v2float %272 %274
- %276 = OpVectorTimesScalar %v2float %275 %float_2
- %277 = OpCompositeConstruct %v2float %float_1 %float_1
- %278 = OpFSub %v2float %276 %277
- %279 = OpLoad %v2float %_78_n None
- %_skTemp10 = OpDot %float %278 %279
- OpStore %_80_p %_skTemp10 None
- %281 = OpAccessChain %_ptr_Function_float %_78_n %uint_0
- %282 = OpLoad %float %281 None
- %283 = OpFAdd %float %282 %float_1
- %284 = OpAccessChain %_ptr_Function_float %_78_n %uint_0
- OpStore %284 %283 None
- %285 = OpVectorShuffle %v2float %_77_m %_77_m 1 3
- %286 = OpVectorShuffle %v2float %_77_m %_77_m 0 2
- %287 = OpVectorTimesScalar %v2float %286 %float_0_00390625
- %288 = OpFAdd %v2float %285 %287
- %289 = OpVectorTimesScalar %v2float %288 %float_2
- %290 = OpCompositeConstruct %v2float %float_1 %float_1
- %291 = OpFSub %v2float %289 %290
- %292 = OpLoad %v2float %_78_n None
- %_skTemp11 = OpDot %float %291 %292
- OpStore %_79_o %_skTemp11 None
- %294 = OpLoad %float %_79_o None
- %295 = OpLoad %float %_80_p None
- %296 = OpCompositeExtract %float %_skTemp6 0
- %_skTemp12 = OpExtInst %float %52 FMix %294 %295 %296
- %298 = OpCompositeExtract %float %_skTemp6 1
- %_skTemp13 = OpExtInst %float %52 FMix %_skTemp9 %_skTemp12 %298
- %300 = OpLoad %int %_72_h None
- %301 = OpBitcast %uint %300
- %302 = OpExtInst %uint %52 UMin %301 %uint_3
- %303 = OpAccessChain %_ptr_Function_float %_71_g %302
- OpStore %303 %_skTemp13 None
- OpBranch %202
- %202 = OpLabel
- %304 = OpLoad %int %_72_h None
- %305 = OpIAdd %int %304 %int_1
- OpStore %_72_h %305 None
- %307 = OpLoad %int %_72_h None
- %308 = OpSGreaterThanEqual %bool %307 %int_4
- OpBranchConditional %308 %204 %203
- %204 = OpLabel
- %310 = OpLoad %v4float %_71_g None
- OpStore %_83_q %310
- %312 = OpINotEqual %bool %_56_d %int_0
- OpSelectionMerge %313 None
- OpBranchConditional %312 %314 %313
- %314 = OpLabel
- %315 = OpLoad %v4float %_83_q None
- %_skTemp14 = OpExtInst %v4float %52 FAbs %315
- OpStore %_83_q %_skTemp14 None
- OpBranch %313
- %313 = OpLabel
- %317 = OpLoad %v4float %_58_l None
- %318 = OpLoad %v4float %_83_q None
- %319 = OpLoad %float %_60_n None
- %320 = OpVectorTimesScalar %v4float %318 %319
- %321 = OpFAdd %v4float %317 %320
- OpStore %_58_l %321 None
- %322 = OpLoad %v2float %_57_k None
- %323 = OpFMul %v2float %322 %324
- OpStore %_57_k %323 None
- %325 = OpLoad %float %_60_n None
- %326 = OpFMul %float %325 %float_0_5
- OpStore %_60_n %326 None
- %327 = OpLoad %v2float %_59_m None
- %328 = OpFMul %v2float %327 %324
- OpStore %_59_m %328 None
- OpBranch %104
- %106 = OpLabel
OpBranch %92
- %104 = OpLabel
+ %92 = OpLabel
+ OpLoopMerge %93 %91 None
OpBranch %90
%90 = OpLabel
- %329 = OpLoad %int %_61_o None
- %330 = OpIAdd %int %329 %int_1
- OpStore %_61_o %330 None
+ %97 = OpLoad %v2uint %tint_loop_idx None
+ %98 = OpIEqual %v2bool %97 %99
+ %103 = OpAll %bool %98
+ OpSelectionMerge %104 None
+ OpBranchConditional %103 %105 %104
+ %105 = OpLabel
+ OpBranch %93
+ %104 = OpLabel
+ %106 = OpLoad %int %_61_o None
+ %107 = OpLoad %uint %shadingSsboIndex None
+ %108 = OpAccessChain %_ptr_StorageBuffer__runtimearr_FSUniformData %_storage1 %uint_0
+ %109 = OpArrayLength %uint %_storage1 0
+ %110 = OpISub %uint %109 %uint_1
+ %111 = OpExtInst %uint %52 UMin %107 %110
+ %112 = OpAccessChain %_ptr_StorageBuffer_int %_storage1 %uint_0 %111 %uint_3
+ %114 = OpLoad %int %112 None
+ %115 = OpSLessThan %bool %106 %114
+ OpSelectionMerge %116 None
+ OpBranchConditional %115 %117 %118
+ %117 = OpLabel
+ %120 = OpLoad %v2float %_57_k None
+ %_skTemp2 = OpExtInst %v2float %52 Floor %120
+ %122 = OpLoad %v4float %_62_f None
+ %123 = OpVectorShuffle %v2float %122 %122 2 3
+ %124 = OpCompositeConstruct %v4float %_skTemp2 %123
+ OpStore %_62_f %124 None
+ %125 = OpLoad %v4float %_62_f None
+ %126 = OpVectorShuffle %v2float %125 %125 0 1
+ %127 = OpLoad %v4float %_62_f None
+ %128 = OpVectorShuffle %v2float %127 %127 0 1
+ %129 = OpFAdd %v2float %128 %130
+ %131 = OpCompositeConstruct %v4float %126 %129
+ OpStore %_62_f %131 None
+ %132 = OpLoad %uint %shadingSsboIndex None
+ %133 = OpAccessChain %_ptr_StorageBuffer__runtimearr_FSUniformData %_storage1 %uint_0
+ %134 = OpArrayLength %uint %_storage1 0
+ %135 = OpISub %uint %134 %uint_1
+ %136 = OpExtInst %uint %52 UMin %132 %135
+ %137 = OpAccessChain %_ptr_StorageBuffer_int %_storage1 %uint_0 %136 %uint_4
+ %139 = OpLoad %int %137 None
+ %140 = OpINotEqual %bool %139 %141
+ OpSelectionMerge %142 None
+ OpBranchConditional %140 %143 %142
+ %143 = OpLabel
+ %144 = OpLoad %v2float %_59_m None
+ %145 = OpVectorShuffle %v4float %144 %144 0 1 0 1
+ %146 = OpLoad %v4float %_62_f None
+ %_skTemp3 = OpExtInst %v4float %52 Step %145 %146
+ %148 = OpLoad %v4float %_62_f None
+ %149 = OpLoad %v2float %_59_m None
+ %150 = OpVectorShuffle %v4float %149 %149 0 1 0 1
+ %151 = OpFMul %v4float %_skTemp3 %150
+ %152 = OpFSub %v4float %148 %151
+ OpStore %_62_f %152 None
+ OpBranch %142
+ %142 = OpLabel
+ %153 = OpLoad %24 %permutationsSampler_1_Texture None
+ %154 = OpLoad %21 %permutationsSampler_1_Sampler None
+ %155 = OpAccessChain %_ptr_Function_float %_62_f %uint_0
+ %156 = OpLoad %float %155 None
+ %157 = OpFAdd %float %156 %float_0_5
+ %158 = OpFMul %float %157 %float_0_00390625
+ %160 = OpCompositeConstruct %v2float %158 %float_0_5
+ %161 = OpExtInst %float %52 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
+ %165 = OpSampledImage %166 %153 %154
+ %167 = OpImageSampleImplicitLod %v4float %165 %160 Bias %161
+ %_63_g = OpCompositeExtract %float %167 0
+ %169 = OpLoad %24 %permutationsSampler_1_Texture None
+ %170 = OpLoad %21 %permutationsSampler_1_Sampler None
+ %171 = OpAccessChain %_ptr_Function_float %_62_f %uint_2
+ %172 = OpLoad %float %171 None
+ %173 = OpFAdd %float %172 %float_0_5
+ %174 = OpFMul %float %173 %float_0_00390625
+ %175 = OpCompositeConstruct %v2float %174 %float_0_5
+ %176 = OpExtInst %float %52 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
+ %177 = OpSampledImage %166 %169 %170
+ %178 = OpImageSampleImplicitLod %v4float %177 %175 Bias %176
+ %_64_h = OpCompositeExtract %float %178 0
+ %180 = OpCompositeConstruct %v2float %_63_g %_64_h
+ OpStore %_65_i %180
+ OpSelectionMerge %182 None
+ OpBranchConditional %false %183 %182
+ %183 = OpLabel
+ %185 = OpLoad %v2float %_65_i None
+ %186 = OpFMul %v2float %185 %187
+ %189 = OpFAdd %v2float %186 %190
+ %_skTemp4 = OpExtInst %v2float %52 Floor %189
+ %192 = OpFMul %v2float %_skTemp4 %193
+ OpStore %_65_i %192 None
+ OpBranch %182
+ %182 = OpLabel
+ %195 = OpLoad %v2float %_65_i None
+ %196 = OpVectorShuffle %v4float %195 %195 0 1 0 1
+ %197 = OpVectorTimesScalar %v4float %196 %float_256
+ %199 = OpLoad %v4float %_62_f None
+ %200 = OpVectorShuffle %v4float %199 %199 1 1 3 3
+ %201 = OpFAdd %v4float %197 %200
+ OpStore %_66_j %201
+ %203 = OpLoad %v4float %_66_j None
+ %204 = OpFMul %v4float %203 %205
+ OpStore %_66_j %204 None
+ %_67_p = OpLoad %v4float %_66_j None
+ %207 = OpLoad %v2float %_57_k None
+ %_skTemp5 = OpExtInst %v2float %52 Fract %207
+ %_skTemp6 = OpExtInst %v2float %52 SmoothStep %210 %130 %_skTemp5
+ OpStore %_72_h %int_0
+ OpBranch %213
+ %213 = OpLabel
+ OpBranch %216
+ %216 = OpLabel
+ OpLoopMerge %217 %215 None
+ OpBranch %214
+ %214 = OpLabel
+ %219 = OpLoad %v2uint %tint_loop_idx_0 None
+ %220 = OpIEqual %v2bool %219 %99
+ %221 = OpAll %bool %220
+ OpSelectionMerge %222 None
+ OpBranchConditional %221 %223 %222
+ %223 = OpLabel
+ OpBranch %217
+ %222 = OpLabel
+ %224 = OpLoad %int %_72_h None
+ %225 = OpConvertSToF %float %224
+ %226 = OpFAdd %float %225 %float_0_5
+ %_73_i = OpFMul %float %226 %float_0_25
+ %229 = OpLoad %24 %noiseSampler_1_Texture None
+ %230 = OpLoad %21 %noiseSampler_1_Sampler None
+ %231 = OpCompositeExtract %float %_67_p 0
+ %232 = OpCompositeConstruct %v2float %231 %_73_i
+ %233 = OpExtInst %float %52 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
+ %234 = OpSampledImage %166 %229 %230
+ %_74_j = OpImageSampleImplicitLod %v4float %234 %232 Bias %233
+ %236 = OpLoad %24 %noiseSampler_1_Texture None
+ %237 = OpLoad %21 %noiseSampler_1_Sampler None
+ %238 = OpCompositeExtract %float %_67_p 1
+ %239 = OpCompositeConstruct %v2float %238 %_73_i
+ %240 = OpExtInst %float %52 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
+ %241 = OpSampledImage %166 %236 %237
+ %_75_k = OpImageSampleImplicitLod %v4float %241 %239 Bias %240
+ %243 = OpLoad %24 %noiseSampler_1_Texture None
+ %244 = OpLoad %21 %noiseSampler_1_Sampler None
+ %245 = OpCompositeExtract %float %_67_p 3
+ %246 = OpCompositeConstruct %v2float %245 %_73_i
+ %247 = OpExtInst %float %52 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
+ %248 = OpSampledImage %166 %243 %244
+ %_76_l = OpImageSampleImplicitLod %v4float %248 %246 Bias %247
+ %250 = OpLoad %24 %noiseSampler_1_Texture None
+ %251 = OpLoad %21 %noiseSampler_1_Sampler None
+ %252 = OpCompositeExtract %float %_67_p 2
+ %253 = OpCompositeConstruct %v2float %252 %_73_i
+ %254 = OpExtInst %float %52 NClamp %float_n0_474999994 %float_n16 %float_15_9899998
+ %255 = OpSampledImage %166 %250 %251
+ %_77_m = OpImageSampleImplicitLod %v4float %255 %253 Bias %254
+ OpStore %_78_n %_skTemp5
+ %258 = OpVectorShuffle %v2float %_74_j %_74_j 1 3
+ %259 = OpVectorShuffle %v2float %_74_j %_74_j 0 2
+ %260 = OpVectorTimesScalar %v2float %259 %float_0_00390625
+ %261 = OpFAdd %v2float %258 %260
+ %262 = OpVectorTimesScalar %v2float %261 %float_2
+ %264 = OpCompositeConstruct %v2float %float_1 %float_1
+ %265 = OpFSub %v2float %262 %264
+ %266 = OpLoad %v2float %_78_n None
+ %_skTemp7 = OpDot %float %265 %266
+ OpStore %_79_o %_skTemp7
+ %269 = OpAccessChain %_ptr_Function_float %_78_n %uint_0
+ %270 = OpLoad %float %269 None
+ %271 = OpFSub %float %270 %float_1
+ %272 = OpAccessChain %_ptr_Function_float %_78_n %uint_0
+ OpStore %272 %271 None
+ %273 = OpVectorShuffle %v2float %_75_k %_75_k 1 3
+ %274 = OpVectorShuffle %v2float %_75_k %_75_k 0 2
+ %275 = OpVectorTimesScalar %v2float %274 %float_0_00390625
+ %276 = OpFAdd %v2float %273 %275
+ %277 = OpVectorTimesScalar %v2float %276 %float_2
+ %278 = OpCompositeConstruct %v2float %float_1 %float_1
+ %279 = OpFSub %v2float %277 %278
+ %280 = OpLoad %v2float %_78_n None
+ %_skTemp8 = OpDot %float %279 %280
+ OpStore %_80_p %_skTemp8
+ %283 = OpLoad %float %_79_o None
+ %284 = OpLoad %float %_80_p None
+ %285 = OpCompositeExtract %float %_skTemp6 0
+ %_skTemp9 = OpExtInst %float %52 FMix %283 %284 %285
+ %287 = OpAccessChain %_ptr_Function_float %_78_n %uint_1
+ %288 = OpLoad %float %287 None
+ %289 = OpFSub %float %288 %float_1
+ %290 = OpAccessChain %_ptr_Function_float %_78_n %uint_1
+ OpStore %290 %289 None
+ %291 = OpVectorShuffle %v2float %_76_l %_76_l 1 3
+ %292 = OpVectorShuffle %v2float %_76_l %_76_l 0 2
+ %293 = OpVectorTimesScalar %v2float %292 %float_0_00390625
+ %294 = OpFAdd %v2float %291 %293
+ %295 = OpVectorTimesScalar %v2float %294 %float_2
+ %296 = OpCompositeConstruct %v2float %float_1 %float_1
+ %297 = OpFSub %v2float %295 %296
+ %298 = OpLoad %v2float %_78_n None
+ %_skTemp10 = OpDot %float %297 %298
+ OpStore %_80_p %_skTemp10 None
+ %300 = OpAccessChain %_ptr_Function_float %_78_n %uint_0
+ %301 = OpLoad %float %300 None
+ %302 = OpFAdd %float %301 %float_1
+ %303 = OpAccessChain %_ptr_Function_float %_78_n %uint_0
+ OpStore %303 %302 None
+ %304 = OpVectorShuffle %v2float %_77_m %_77_m 1 3
+ %305 = OpVectorShuffle %v2float %_77_m %_77_m 0 2
+ %306 = OpVectorTimesScalar %v2float %305 %float_0_00390625
+ %307 = OpFAdd %v2float %304 %306
+ %308 = OpVectorTimesScalar %v2float %307 %float_2
+ %309 = OpCompositeConstruct %v2float %float_1 %float_1
+ %310 = OpFSub %v2float %308 %309
+ %311 = OpLoad %v2float %_78_n None
+ %_skTemp11 = OpDot %float %310 %311
+ OpStore %_79_o %_skTemp11 None
+ %313 = OpLoad %float %_79_o None
+ %314 = OpLoad %float %_80_p None
+ %315 = OpCompositeExtract %float %_skTemp6 0
+ %_skTemp12 = OpExtInst %float %52 FMix %313 %314 %315
+ %317 = OpCompositeExtract %float %_skTemp6 1
+ %_skTemp13 = OpExtInst %float %52 FMix %_skTemp9 %_skTemp12 %317
+ %319 = OpLoad %int %_72_h None
+ %320 = OpBitcast %uint %319
+ %321 = OpExtInst %uint %52 UMin %320 %uint_3
+ %322 = OpAccessChain %_ptr_Function_float %_71_g %321
+ OpStore %322 %_skTemp13 None
+ OpBranch %215
+ %215 = OpLabel
+ %323 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ %325 = OpLoad %uint %323 None
+ %326 = OpIAdd %uint %325 %uint_1
+ %327 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ OpStore %327 %326 None
+ %328 = OpIEqual %bool %326 %uint_0
+ %329 = OpSelect %uint %328 %uint_1 %uint_0
+ %330 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ %331 = OpLoad %uint %330 None
+ %332 = OpIAdd %uint %331 %329
+ %333 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ OpStore %333 %332 None
+ %334 = OpLoad %int %_72_h None
+ %335 = OpIAdd %int %334 %int_1
+ OpStore %_72_h %335 None
+ %337 = OpLoad %int %_72_h None
+ %338 = OpSGreaterThanEqual %bool %337 %int_4
+ OpBranchConditional %338 %217 %216
+ %217 = OpLabel
+ %340 = OpLoad %v4float %_71_g None
+ OpStore %_83_q %340
+ %342 = OpINotEqual %bool %_56_d %int_0
+ OpSelectionMerge %343 None
+ OpBranchConditional %342 %344 %343
+ %344 = OpLabel
+ %345 = OpLoad %v4float %_83_q None
+ %_skTemp14 = OpExtInst %v4float %52 FAbs %345
+ OpStore %_83_q %_skTemp14 None
+ OpBranch %343
+ %343 = OpLabel
+ %347 = OpLoad %v4float %_58_l None
+ %348 = OpLoad %v4float %_83_q None
+ %349 = OpLoad %float %_60_n None
+ %350 = OpVectorTimesScalar %v4float %348 %349
+ %351 = OpFAdd %v4float %347 %350
+ OpStore %_58_l %351 None
+ %352 = OpLoad %v2float %_57_k None
+ %353 = OpFMul %v2float %352 %354
+ OpStore %_57_k %353 None
+ %355 = OpLoad %float %_60_n None
+ %356 = OpFMul %float %355 %float_0_5
+ OpStore %_60_n %356 None
+ %357 = OpLoad %v2float %_59_m None
+ %358 = OpFMul %v2float %357 %354
+ OpStore %_59_m %358 None
+ OpBranch %116
+ %118 = OpLabel
+ OpBranch %93
+ %116 = OpLabel
OpBranch %91
- %92 = OpLabel
- %331 = OpIEqual %bool %_56_d %int_0
- OpSelectionMerge %332 None
- OpBranchConditional %331 %333 %332
- %333 = OpLabel
- %334 = OpLoad %v4float %_58_l None
- %335 = OpFMul %v4float %334 %336
- %337 = OpFAdd %v4float %335 %336
- OpStore %_58_l %337 None
- OpBranch %332
- %332 = OpLabel
- %338 = OpLoad %v4float %_58_l None
- %_skTemp15 = OpExtInst %v4float %52 NClamp %338 %74 %340
+ %91 = OpLabel
+ %359 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %360 = OpLoad %uint %359 None
+ %361 = OpIAdd %uint %360 %uint_1
+ %362 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %362 %361 None
+ %363 = OpIEqual %bool %361 %uint_0
+ %364 = OpSelect %uint %363 %uint_1 %uint_0
+ %365 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %366 = OpLoad %uint %365 None
+ %367 = OpIAdd %uint %366 %364
+ %368 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %368 %367 None
+ %369 = OpLoad %int %_61_o None
+ %370 = OpIAdd %int %369 %int_1
+ OpStore %_61_o %370 None
+ OpBranch %92
+ %93 = OpLabel
+ %371 = OpIEqual %bool %_56_d %int_0
+ OpSelectionMerge %372 None
+ OpBranchConditional %371 %373 %372
+ %373 = OpLabel
+ %374 = OpLoad %v4float %_58_l None
+ %375 = OpFMul %v4float %374 %376
+ %377 = OpFAdd %v4float %375 %376
+ OpStore %_58_l %377 None
+ OpBranch %372
+ %372 = OpLabel
+ %378 = OpLoad %v4float %_58_l None
+ %_skTemp15 = OpExtInst %v4float %52 NClamp %378 %74 %380
OpStore %_58_l %_skTemp15 None
- %341 = OpLoad %v4float %_58_l None
- %342 = OpVectorShuffle %v3float %341 %341 0 1 2
- %344 = OpAccessChain %_ptr_Function_float %_58_l %uint_3
- %345 = OpLoad %float %344 None
- %346 = OpVectorTimesScalar %v3float %342 %345
- %347 = OpAccessChain %_ptr_Function_float %_58_l %uint_3
- %348 = OpLoad %float %347 None
- %349 = OpCompositeConstruct %v4float %346 %348
- %350 = OpVectorShuffle %v3float %349 %349 0 1 2
- %_skTemp16 = OpDot %float %352 %350
+ %381 = OpLoad %v4float %_58_l None
+ %382 = OpVectorShuffle %v3float %381 %381 0 1 2
+ %384 = OpAccessChain %_ptr_Function_float %_58_l %uint_3
+ %385 = OpLoad %float %384 None
+ %386 = OpVectorTimesScalar %v3float %382 %385
+ %387 = OpAccessChain %_ptr_Function_float %_58_l %uint_3
+ %388 = OpLoad %float %387 None
+ %389 = OpCompositeConstruct %v4float %386 %388
+ %390 = OpVectorShuffle %v3float %389 %389 0 1 2
+ %_skTemp16 = OpDot %float %392 %390
%_skTemp17 = OpExtInst %float %52 NClamp %_skTemp16 %float_0 %float_1
- %358 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %_skTemp17
- OpStore %_84_a %358
- %360 = OpLoad %uint %shadingSsboIndex None
- %361 = OpAccessChain %_ptr_StorageBuffer__runtimearr_FSUniformData %_storage1 %uint_0
- %362 = OpArrayLength %uint %_storage1 0
- %363 = OpISub %uint %362 %uint_1
- %364 = OpExtInst %uint %52 UMin %360 %363
- %365 = OpAccessChain %_ptr_StorageBuffer_int %_storage1 %uint_0 %364 %uint_7
- %_85_d = OpLoad %int %365 None
- %368 = OpINotEqual %bool %_85_d %129
- OpSelectionMerge %369 None
- OpBranchConditional %368 %370 %371
- %370 = OpLabel
- %373 = OpAccessChain %_ptr_Function_float %_84_a %uint_1
- %374 = OpLoad %float %373 None
- %375 = OpAccessChain %_ptr_Function_float %_84_a %uint_2
- %376 = OpLoad %float %375 None
- %377 = OpFOrdLessThan %bool %374 %376
- OpSelectionMerge %378 None
- OpBranchConditional %377 %379 %380
- %379 = OpLabel
- %381 = OpLoad %v4float %_84_a None
- %382 = OpVectorShuffle %v2float %381 %381 2 1
- %383 = OpCompositeConstruct %v4float %382 %float_n1 %float_0_666666687
- OpStore %_skTemp18 %383 None
- OpBranch %378
- %380 = OpLabel
- %386 = OpLoad %v4float %_84_a None
- %387 = OpVectorShuffle %v2float %386 %386 1 2
- %388 = OpCompositeConstruct %v4float %387 %float_0 %float_n0_333333343
- OpStore %_skTemp18 %388 None
- OpBranch %378
- %378 = OpLabel
+ %398 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %_skTemp17
+ OpStore %_84_a %398
+ %400 = OpLoad %uint %shadingSsboIndex None
+ %401 = OpAccessChain %_ptr_StorageBuffer__runtimearr_FSUniformData %_storage1 %uint_0
+ %402 = OpArrayLength %uint %_storage1 0
+ %403 = OpISub %uint %402 %uint_1
+ %404 = OpExtInst %uint %52 UMin %400 %403
+ %405 = OpAccessChain %_ptr_StorageBuffer_int %_storage1 %uint_0 %404 %uint_7
+ %_85_d = OpLoad %int %405 None
+ %408 = OpINotEqual %bool %_85_d %141
+ OpSelectionMerge %409 None
+ OpBranchConditional %408 %410 %411
+ %410 = OpLabel
+ %413 = OpAccessChain %_ptr_Function_float %_84_a %uint_1
+ %414 = OpLoad %float %413 None
+ %415 = OpAccessChain %_ptr_Function_float %_84_a %uint_2
+ %416 = OpLoad %float %415 None
+ %417 = OpFOrdLessThan %bool %414 %416
+ OpSelectionMerge %418 None
+ OpBranchConditional %417 %419 %420
+ %419 = OpLabel
+ %421 = OpLoad %v4float %_84_a None
+ %422 = OpVectorShuffle %v2float %421 %421 2 1
+ %423 = OpCompositeConstruct %v4float %422 %float_n1 %float_0_666666687
+ OpStore %_skTemp18 %423 None
+ OpBranch %418
+ %420 = OpLabel
+ %426 = OpLoad %v4float %_84_a None
+ %427 = OpVectorShuffle %v2float %426 %426 1 2
+ %428 = OpCompositeConstruct %v4float %427 %float_0 %float_n0_333333343
+ OpStore %_skTemp18 %428 None
+ OpBranch %418
+ %418 = OpLabel
%_86_e = OpLoad %v4float %_skTemp18 None
- %392 = OpAccessChain %_ptr_Function_float %_84_a %uint_0
- %393 = OpLoad %float %392 None
- %394 = OpCompositeExtract %float %_86_e 0
- %395 = OpFOrdLessThan %bool %393 %394
- OpSelectionMerge %396 None
- OpBranchConditional %395 %397 %398
- %397 = OpLabel
- %399 = OpCompositeExtract %float %_86_e 0
- %400 = OpAccessChain %_ptr_Function_float %_84_a %uint_0
- %401 = OpLoad %float %400 None
- %402 = OpVectorShuffle %v2float %_86_e %_86_e 1 3
- %403 = OpCompositeConstruct %v4float %399 %401 %402
- OpStore %_skTemp19 %403 None
- OpBranch %396
- %398 = OpLabel
- %404 = OpAccessChain %_ptr_Function_float %_84_a %uint_0
- %405 = OpLoad %float %404 None
- %406 = OpCompositeExtract %float %_86_e 0
- %407 = OpVectorShuffle %v2float %_86_e %_86_e 1 2
- %408 = OpCompositeConstruct %v4float %405 %406 %407
- OpStore %_skTemp19 %408 None
- OpBranch %396
- %396 = OpLabel
+ %432 = OpAccessChain %_ptr_Function_float %_84_a %uint_0
+ %433 = OpLoad %float %432 None
+ %434 = OpCompositeExtract %float %_86_e 0
+ %435 = OpFOrdLessThan %bool %433 %434
+ OpSelectionMerge %436 None
+ OpBranchConditional %435 %437 %438
+ %437 = OpLabel
+ %439 = OpCompositeExtract %float %_86_e 0
+ %440 = OpAccessChain %_ptr_Function_float %_84_a %uint_0
+ %441 = OpLoad %float %440 None
+ %442 = OpVectorShuffle %v2float %_86_e %_86_e 1 3
+ %443 = OpCompositeConstruct %v4float %439 %441 %442
+ OpStore %_skTemp19 %443 None
+ OpBranch %436
+ %438 = OpLabel
+ %444 = OpAccessChain %_ptr_Function_float %_84_a %uint_0
+ %445 = OpLoad %float %444 None
+ %446 = OpCompositeExtract %float %_86_e 0
+ %447 = OpVectorShuffle %v2float %_86_e %_86_e 1 2
+ %448 = OpCompositeConstruct %v4float %445 %446 %447
+ OpStore %_skTemp19 %448 None
+ OpBranch %436
+ %436 = OpLabel
%_87_f = OpLoad %v4float %_skTemp19 None
%_88_h = OpCompositeExtract %float %_87_f 0
- %411 = OpCompositeExtract %float %_87_f 1
- %412 = OpCompositeExtract %float %_87_f 2
- %_skTemp20 = OpExtInst %float %52 FMin %411 %412
+ %451 = OpCompositeExtract %float %_87_f 1
+ %452 = OpCompositeExtract %float %_87_f 2
+ %_skTemp20 = OpExtInst %float %52 FMin %451 %452
%_89_i = OpFSub %float %_88_h %_skTemp20
- %415 = OpFMul %float %_89_i %float_0_5
- %_90_j = OpFSub %float %_88_h %415
- %417 = OpCompositeExtract %float %_87_f 3
- %418 = OpCompositeExtract %float %_87_f 1
- %419 = OpCompositeExtract %float %_87_f 2
- %420 = OpFSub %float %418 %419
- %421 = OpFMul %float %_89_i %float_6
- %423 = OpFAdd %float %421 %float_9_99999975en05
- %425 = OpFDiv %float %420 %423
- %426 = OpFAdd %float %417 %425
- %_skTemp21 = OpExtInst %float %52 FAbs %426
- %428 = OpFMul %float %_90_j %float_2
- %429 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
- %430 = OpLoad %float %429 None
- %431 = OpFSub %float %428 %430
- %_skTemp22 = OpExtInst %float %52 FAbs %431
- %433 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
- %434 = OpLoad %float %433 None
- %435 = OpFAdd %float %434 %float_9_99999975en05
- %436 = OpFSub %float %435 %_skTemp22
- %_92_l = OpFDiv %float %_89_i %436
- %438 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
- %439 = OpLoad %float %438 None
- %440 = OpFAdd %float %439 %float_9_99999975en05
- %_93_m = OpFDiv %float %_90_j %440
- %442 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
- %443 = OpLoad %float %442 None
- %444 = OpCompositeConstruct %v4float %_skTemp21 %_92_l %_93_m %443
- OpStore %_84_a %444 None
- OpBranch %369
- %371 = OpLabel
- %445 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
- %446 = OpLoad %float %445 None
- %_skTemp23 = OpExtInst %float %52 FMax %446 %float_9_99999975en05
- %448 = OpLoad %v4float %_84_a None
- %449 = OpVectorShuffle %v3float %448 %448 0 1 2
- %450 = OpCompositeConstruct %v3float %_skTemp23 %_skTemp23 %_skTemp23
- %451 = OpFDiv %v3float %449 %450
- %452 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
- %453 = OpLoad %float %452 None
- %454 = OpCompositeConstruct %v4float %451 %453
- OpStore %_84_a %454 None
- OpBranch %369
- %369 = OpLabel
- %455 = OpLoad %uint %shadingSsboIndex None
- %456 = OpAccessChain %_ptr_StorageBuffer__runtimearr_FSUniformData %_storage1 %uint_0
- %457 = OpArrayLength %uint %_storage1 0
- %458 = OpISub %uint %457 %uint_1
- %459 = OpExtInst %uint %52 UMin %455 %458
- %460 = OpAccessChain %_ptr_StorageBuffer_mat4v4float %_storage1 %uint_0 %459 %uint_5
- %463 = OpLoad %mat4v4float %460 None
- %464 = OpLoad %v4float %_84_a None
- %465 = OpMatrixTimesVector %v4float %463 %464
- %466 = OpLoad %uint %shadingSsboIndex None
- %467 = OpAccessChain %_ptr_StorageBuffer__runtimearr_FSUniformData %_storage1 %uint_0
- %468 = OpArrayLength %uint %_storage1 0
- %469 = OpISub %uint %468 %uint_1
- %470 = OpExtInst %uint %52 UMin %466 %469
- %471 = OpAccessChain %_ptr_StorageBuffer_v4float %_storage1 %uint_0 %470 %uint_6
- %474 = OpLoad %v4float %471 None
- %475 = OpFAdd %v4float %465 %474
- OpStore %_94_f %475
- %477 = OpINotEqual %bool %_85_d %129
- OpSelectionMerge %478 None
- OpBranchConditional %477 %479 %480
- %479 = OpLabel
- %481 = OpAccessChain %_ptr_Function_float %_94_f %uint_2
- %482 = OpLoad %float %481 None
- %483 = OpFMul %float %float_2 %482
- %484 = OpFSub %float %483 %float_1
- %_skTemp24 = OpExtInst %float %52 FAbs %484
- %486 = OpFSub %float %float_1 %_skTemp24
- %487 = OpAccessChain %_ptr_Function_float %_94_f %uint_1
- %488 = OpLoad %float %487 None
- %_95_b = OpFMul %float %486 %488
- %490 = OpLoad %v4float %_94_f None
- %491 = OpVectorShuffle %v3float %490 %490 0 0 0
- %_96_c = OpFAdd %v3float %491 %493
+ %455 = OpFMul %float %_89_i %float_0_5
+ %_90_j = OpFSub %float %_88_h %455
+ %457 = OpCompositeExtract %float %_87_f 3
+ %458 = OpCompositeExtract %float %_87_f 1
+ %459 = OpCompositeExtract %float %_87_f 2
+ %460 = OpFSub %float %458 %459
+ %461 = OpFMul %float %_89_i %float_6
+ %463 = OpFAdd %float %461 %float_9_99999975en05
+ %465 = OpFDiv %float %460 %463
+ %466 = OpFAdd %float %457 %465
+ %_skTemp21 = OpExtInst %float %52 FAbs %466
+ %468 = OpFMul %float %_90_j %float_2
+ %469 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
+ %470 = OpLoad %float %469 None
+ %471 = OpFSub %float %468 %470
+ %_skTemp22 = OpExtInst %float %52 FAbs %471
+ %473 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
+ %474 = OpLoad %float %473 None
+ %475 = OpFAdd %float %474 %float_9_99999975en05
+ %476 = OpFSub %float %475 %_skTemp22
+ %_92_l = OpFDiv %float %_89_i %476
+ %478 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
+ %479 = OpLoad %float %478 None
+ %480 = OpFAdd %float %479 %float_9_99999975en05
+ %_93_m = OpFDiv %float %_90_j %480
+ %482 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
+ %483 = OpLoad %float %482 None
+ %484 = OpCompositeConstruct %v4float %_skTemp21 %_92_l %_93_m %483
+ OpStore %_84_a %484 None
+ OpBranch %409
+ %411 = OpLabel
+ %485 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
+ %486 = OpLoad %float %485 None
+ %_skTemp23 = OpExtInst %float %52 FMax %486 %float_9_99999975en05
+ %488 = OpLoad %v4float %_84_a None
+ %489 = OpVectorShuffle %v3float %488 %488 0 1 2
+ %490 = OpCompositeConstruct %v3float %_skTemp23 %_skTemp23 %_skTemp23
+ %491 = OpFDiv %v3float %489 %490
+ %492 = OpAccessChain %_ptr_Function_float %_84_a %uint_3
+ %493 = OpLoad %float %492 None
+ %494 = OpCompositeConstruct %v4float %491 %493
+ OpStore %_84_a %494 None
+ OpBranch %409
+ %409 = OpLabel
+ %495 = OpLoad %uint %shadingSsboIndex None
+ %496 = OpAccessChain %_ptr_StorageBuffer__runtimearr_FSUniformData %_storage1 %uint_0
+ %497 = OpArrayLength %uint %_storage1 0
+ %498 = OpISub %uint %497 %uint_1
+ %499 = OpExtInst %uint %52 UMin %495 %498
+ %500 = OpAccessChain %_ptr_StorageBuffer_mat4v4float %_storage1 %uint_0 %499 %uint_5
+ %503 = OpLoad %mat4v4float %500 None
+ %504 = OpLoad %v4float %_84_a None
+ %505 = OpMatrixTimesVector %v4float %503 %504
+ %506 = OpLoad %uint %shadingSsboIndex None
+ %507 = OpAccessChain %_ptr_StorageBuffer__runtimearr_FSUniformData %_storage1 %uint_0
+ %508 = OpArrayLength %uint %_storage1 0
+ %509 = OpISub %uint %508 %uint_1
+ %510 = OpExtInst %uint %52 UMin %506 %509
+ %511 = OpAccessChain %_ptr_StorageBuffer_v4float %_storage1 %uint_0 %510 %uint_6
+ %514 = OpLoad %v4float %511 None
+ %515 = OpFAdd %v4float %505 %514
+ OpStore %_94_f %515
+ %517 = OpINotEqual %bool %_85_d %141
+ OpSelectionMerge %518 None
+ OpBranchConditional %517 %519 %520
+ %519 = OpLabel
+ %521 = OpAccessChain %_ptr_Function_float %_94_f %uint_2
+ %522 = OpLoad %float %521 None
+ %523 = OpFMul %float %float_2 %522
+ %524 = OpFSub %float %523 %float_1
+ %_skTemp24 = OpExtInst %float %52 FAbs %524
+ %526 = OpFSub %float %float_1 %_skTemp24
+ %527 = OpAccessChain %_ptr_Function_float %_94_f %uint_1
+ %528 = OpLoad %float %527 None
+ %_95_b = OpFMul %float %526 %528
+ %530 = OpLoad %v4float %_94_f None
+ %531 = OpVectorShuffle %v3float %530 %530 0 0 0
+ %_96_c = OpFAdd %v3float %531 %533
%_skTemp25 = OpExtInst %v3float %52 Fract %_96_c
- %496 = OpVectorTimesScalar %v3float %_skTemp25 %float_6
- %497 = OpCompositeConstruct %v3float %float_3 %float_3 %float_3
- %499 = OpFSub %v3float %496 %497
- %_skTemp26 = OpExtInst %v3float %52 FAbs %499
- %501 = OpCompositeConstruct %v3float %float_1 %float_1 %float_1
- %502 = OpFSub %v3float %_skTemp26 %501
- %_skTemp27 = OpExtInst %v3float %52 NClamp %502 %504 %505
- %506 = OpCompositeConstruct %v3float %float_0_5 %float_0_5 %float_0_5
- %507 = OpFSub %v3float %_skTemp27 %506
- %508 = OpVectorTimesScalar %v3float %507 %_95_b
- %509 = OpAccessChain %_ptr_Function_float %_94_f %uint_2
- %510 = OpLoad %float %509 None
- %511 = OpCompositeConstruct %v3float %510 %510 %510
- %512 = OpFAdd %v3float %508 %511
- %513 = OpAccessChain %_ptr_Function_float %_94_f %uint_3
- %514 = OpLoad %float %513 None
- %515 = OpVectorTimesScalar %v3float %512 %514
- %516 = OpAccessChain %_ptr_Function_float %_94_f %uint_3
- %517 = OpLoad %float %516 None
- %518 = OpCompositeConstruct %v4float %515 %517
- %_skTemp28 = OpExtInst %v4float %52 NClamp %518 %74 %340
+ %536 = OpVectorTimesScalar %v3float %_skTemp25 %float_6
+ %537 = OpCompositeConstruct %v3float %float_3 %float_3 %float_3
+ %539 = OpFSub %v3float %536 %537
+ %_skTemp26 = OpExtInst %v3float %52 FAbs %539
+ %541 = OpCompositeConstruct %v3float %float_1 %float_1 %float_1
+ %542 = OpFSub %v3float %_skTemp26 %541
+ %_skTemp27 = OpExtInst %v3float %52 NClamp %542 %544 %545
+ %546 = OpCompositeConstruct %v3float %float_0_5 %float_0_5 %float_0_5
+ %547 = OpFSub %v3float %_skTemp27 %546
+ %548 = OpVectorTimesScalar %v3float %547 %_95_b
+ %549 = OpAccessChain %_ptr_Function_float %_94_f %uint_2
+ %550 = OpLoad %float %549 None
+ %551 = OpCompositeConstruct %v3float %550 %550 %550
+ %552 = OpFAdd %v3float %548 %551
+ %553 = OpAccessChain %_ptr_Function_float %_94_f %uint_3
+ %554 = OpLoad %float %553 None
+ %555 = OpVectorTimesScalar %v3float %552 %554
+ %556 = OpAccessChain %_ptr_Function_float %_94_f %uint_3
+ %557 = OpLoad %float %556 None
+ %558 = OpCompositeConstruct %v4float %555 %557
+ %_skTemp28 = OpExtInst %v4float %52 NClamp %558 %74 %380
OpStore %_94_f %_skTemp28 None
- OpBranch %478
- %480 = OpLabel
- %520 = OpLoad %uint %shadingSsboIndex None
- %521 = OpAccessChain %_ptr_StorageBuffer__runtimearr_FSUniformData %_storage1 %uint_0
- %522 = OpArrayLength %uint %_storage1 0
- %523 = OpISub %uint %522 %uint_1
- %524 = OpExtInst %uint %52 UMin %520 %523
- %525 = OpAccessChain %_ptr_StorageBuffer_int %_storage1 %uint_0 %524 %uint_8
- %527 = OpLoad %int %525 None
- %528 = OpINotEqual %bool %527 %129
- OpSelectionMerge %529 None
- OpBranchConditional %528 %530 %531
- %530 = OpLabel
- %532 = OpLoad %v4float %_94_f None
- %_skTemp29 = OpExtInst %v4float %52 NClamp %532 %74 %340
+ OpBranch %518
+ %520 = OpLabel
+ %560 = OpLoad %uint %shadingSsboIndex None
+ %561 = OpAccessChain %_ptr_StorageBuffer__runtimearr_FSUniformData %_storage1 %uint_0
+ %562 = OpArrayLength %uint %_storage1 0
+ %563 = OpISub %uint %562 %uint_1
+ %564 = OpExtInst %uint %52 UMin %560 %563
+ %565 = OpAccessChain %_ptr_StorageBuffer_int %_storage1 %uint_0 %564 %uint_8
+ %567 = OpLoad %int %565 None
+ %568 = OpINotEqual %bool %567 %141
+ OpSelectionMerge %569 None
+ OpBranchConditional %568 %570 %571
+ %570 = OpLabel
+ %572 = OpLoad %v4float %_94_f None
+ %_skTemp29 = OpExtInst %v4float %52 NClamp %572 %74 %380
OpStore %_94_f %_skTemp29 None
- OpBranch %529
- %531 = OpLabel
- %534 = OpAccessChain %_ptr_Function_float %_94_f %uint_3
- %535 = OpLoad %float %534 None
- %_skTemp30 = OpExtInst %float %52 NClamp %535 %float_0 %float_1
- %537 = OpAccessChain %_ptr_Function_float %_94_f %uint_3
- OpStore %537 %_skTemp30 None
- OpBranch %529
- %529 = OpLabel
- %538 = OpLoad %v4float %_94_f None
- %539 = OpVectorShuffle %v3float %538 %538 0 1 2
- %540 = OpAccessChain %_ptr_Function_float %_94_f %uint_3
- %541 = OpLoad %float %540 None
- %542 = OpVectorTimesScalar %v3float %539 %541
- %543 = OpAccessChain %_ptr_Function_float %_94_f %uint_3
- %544 = OpLoad %float %543 None
- %545 = OpCompositeConstruct %v4float %542 %544
- OpStore %_94_f %545 None
- OpBranch %478
- %478 = OpLabel
+ OpBranch %569
+ %571 = OpLabel
+ %574 = OpAccessChain %_ptr_Function_float %_94_f %uint_3
+ %575 = OpLoad %float %574 None
+ %_skTemp30 = OpExtInst %float %52 NClamp %575 %float_0 %float_1
+ %577 = OpAccessChain %_ptr_Function_float %_94_f %uint_3
+ OpStore %577 %_skTemp30 None
+ OpBranch %569
+ %569 = OpLabel
+ %578 = OpLoad %v4float %_94_f None
+ %579 = OpVectorShuffle %v3float %578 %578 0 1 2
+ %580 = OpAccessChain %_ptr_Function_float %_94_f %uint_3
+ %581 = OpLoad %float %580 None
+ %582 = OpVectorTimesScalar %v3float %579 %581
+ %583 = OpAccessChain %_ptr_Function_float %_94_f %uint_3
+ %584 = OpLoad %float %583 None
+ %585 = OpCompositeConstruct %v4float %582 %584
+ OpStore %_94_f %585 None
+ OpBranch %518
+ %518 = OpLabel
%outColor_0 = OpLoad %v4float %_94_f None
- %547 = OpAccessChain %_ptr_Function_v4float %_stageOut_root %uint_0
- OpStore %547 %outColor_0 None
+ %587 = OpAccessChain %_ptr_Function_v4float %_stageOut_root %uint_0
+ OpStore %587 %outColor_0 None
OpReturn
OpFunctionEnd
- %main_inner = OpFunction %FSOut None %550
+ %main_inner = OpFunction %FSOut None %590
%_stageIn_0 = OpFunctionParameter %FSIn
- %551 = OpLabel
- %_stageOut = OpVariable %_ptr_Function_FSOut Function %553
- %554 = OpFunctionCall %void %_skslMain %_stageIn_0 %_stageOut
- %555 = OpLoad %FSOut %_stageOut None
- OpReturnValue %555
+ %591 = OpLabel
+ %_stageOut = OpVariable %_ptr_Function_FSOut Function %593
+ %594 = OpFunctionCall %void %_skslMain %_stageIn_0 %_stageOut
+ %595 = OpLoad %FSOut %_stageOut None
+ OpReturnValue %595
OpFunctionEnd
- %main = OpFunction %void None %557
- %558 = OpLabel
- %559 = OpLoad %v2uint %main_loc0_Input None
- %560 = OpLoad %v2float %main_loc1_Input None
- %561 = OpCompositeConstruct %FSIn %559 %560
- %562 = OpFunctionCall %FSOut %main_inner %561
- %563 = OpCompositeExtract %v4float %562 0
- OpStore %main_loc0_Output %563 None
+ %main = OpFunction %void None %597
+ %598 = OpLabel
+ %599 = OpLoad %v2uint %main_loc0_Input None
+ %600 = OpLoad %v2float %main_loc1_Input None
+ %601 = OpCompositeConstruct %FSIn %599 %600
+ %602 = OpFunctionCall %FSOut %main_inner %601
+ %603 = OpCompositeExtract %v4float %602 0
+ OpStore %main_loc0_Output %603 None
OpReturn
OpFunctionEnd
diff --git a/test/tint/bug/tint/379684039-2.wgsl.expected.spvasm b/test/tint/bug/tint/379684039-2.wgsl.expected.spvasm
index 0dc33e8..324f5c1 100644
--- a/test/tint/bug/tint/379684039-2.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/379684039-2.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 50
+; Bound: 74
; Schema: 0
OpCapability Shader
- %38 = OpExtInstImport "GLSL.std.450"
+ %52 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
OpExecutionMode %unused_entry_point LocalSize 1 1 1
@@ -17,6 +17,9 @@
OpName %_storage "_storage"
OpName %main "main"
OpName %vec "vec"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
OpDecorate %_arr_v4float_uint_7 ArrayStride 16
OpMemberDecorate %FSUniformData 0 Offset 0
@@ -46,45 +49,75 @@
%18 = OpTypeFunction %void
%_ptr_Function_v2int = OpTypePointer Function %v2int
%22 = OpConstantNull %v2int
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %31 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %34 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%_ptr_Function_int = OpTypePointer Function %int
%uint_1 = OpConstant %uint 1
%_ptr_StorageBuffer__runtimearr_FSUniformData = OpTypePointer StorageBuffer %_runtimearr_FSUniformData
%uint_0 = OpConstant %uint 0
%_ptr_StorageBuffer_v2int = OpTypePointer StorageBuffer %v2int
%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
- %bool = OpTypeBool
+%_ptr_Function_uint = OpTypePointer Function %uint
%main = OpFunction %void None %18
%19 = OpLabel
%vec = OpVariable %_ptr_Function_v2int Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %31
OpStore %vec %22
- OpBranch %25
- %25 = OpLabel
- OpLoopMerge %26 %24 None
OpBranch %23
%23 = OpLabel
- %27 = OpAccessChain %_ptr_Function_int %vec %uint_1
- %30 = OpLoad %int %27 None
- %31 = OpLoad %uint %idx None
- %32 = OpAccessChain %_ptr_StorageBuffer__runtimearr_FSUniformData %_storage %uint_0
- %35 = OpArrayLength %uint %_storage 0
- %36 = OpISub %uint %35 %uint_1
- %37 = OpExtInst %uint %38 UMin %31 %36
- %39 = OpAccessChain %_ptr_StorageBuffer_v2int %_storage %uint_0 %37 %uint_1
- %41 = OpAccessChain %_ptr_StorageBuffer_int %39 %uint_1
- %43 = OpLoad %int %41 None
- %44 = OpSGreaterThanEqual %bool %30 %43
- OpSelectionMerge %46 None
- OpBranchConditional %44 %47 %46
- %47 = OpLabel
OpBranch %26
- %46 = OpLabel
+ %26 = OpLabel
+ OpLoopMerge %27 %25 None
OpBranch %24
%24 = OpLabel
+ %32 = OpLoad %v2uint %tint_loop_idx None
+ %33 = OpIEqual %v2bool %32 %34
+ %38 = OpAll %bool %33
+ OpSelectionMerge %39 None
+ OpBranchConditional %38 %40 %39
+ %40 = OpLabel
+ OpBranch %27
+ %39 = OpLabel
+ %41 = OpAccessChain %_ptr_Function_int %vec %uint_1
+ %44 = OpLoad %int %41 None
+ %45 = OpLoad %uint %idx None
+ %46 = OpAccessChain %_ptr_StorageBuffer__runtimearr_FSUniformData %_storage %uint_0
+ %49 = OpArrayLength %uint %_storage 0
+ %50 = OpISub %uint %49 %uint_1
+ %51 = OpExtInst %uint %52 UMin %45 %50
+ %53 = OpAccessChain %_ptr_StorageBuffer_v2int %_storage %uint_0 %51 %uint_1
+ %55 = OpAccessChain %_ptr_StorageBuffer_int %53 %uint_1
+ %57 = OpLoad %int %55 None
+ %58 = OpSGreaterThanEqual %bool %44 %57
+ OpSelectionMerge %59 None
+ OpBranchConditional %58 %60 %59
+ %60 = OpLabel
+ OpBranch %27
+ %59 = OpLabel
OpBranch %25
- %26 = OpLabel
+ %25 = OpLabel
+ %61 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %63 = OpLoad %uint %61 None
+%tint_low_inc = OpIAdd %uint %63 %uint_1
+ %65 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %65 %tint_low_inc None
+ %66 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %66 %uint_1 %uint_0
+ %68 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %69 = OpLoad %uint %68 None
+ %70 = OpIAdd %uint %69 %tint_carry
+ %71 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %71 %70 None
+ OpBranch %26
+ %27 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %18
- %49 = OpLabel
+ %73 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/bug/tint/379684039.wgsl.expected.spvasm b/test/tint/bug/tint/379684039.wgsl.expected.spvasm
index c18946b..489c677 100644
--- a/test/tint/bug/tint/379684039.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/379684039.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 40
+; Bound: 64
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -11,6 +11,9 @@
OpName %_storage_block "_storage_block"
OpName %main "main"
OpName %vec "vec"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
OpMemberDecorate %_storage_block 0 Offset 0
OpDecorate %_storage_block Block
@@ -26,49 +29,79 @@
%8 = OpTypeFunction %void
%_ptr_Function_v2int = OpTypePointer Function %v2int
%12 = OpConstantNull %v2int
-%_ptr_Function_int = OpTypePointer Function %int
%uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %22 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %25 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+%_ptr_Function_int = OpTypePointer Function %int
%uint_1 = OpConstant %uint 1
%_ptr_StorageBuffer_v2int = OpTypePointer StorageBuffer %v2int
%uint_0 = OpConstant %uint 0
%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
- %bool = OpTypeBool
%int_0 = OpConstant %int 0
+%_ptr_Function_uint = OpTypePointer Function %uint
%main = OpFunction %void None %8
%9 = OpLabel
%vec = OpVariable %_ptr_Function_v2int Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %22
OpStore %vec %12
- OpBranch %15
- %15 = OpLabel
- OpLoopMerge %16 %14 None
OpBranch %13
%13 = OpLabel
- %17 = OpAccessChain %_ptr_Function_int %vec %uint_1
- %21 = OpLoad %int %17 None
- %22 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
- %25 = OpAccessChain %_ptr_StorageBuffer_int %22 %uint_1
- %27 = OpLoad %int %25 None
- %28 = OpSGreaterThanEqual %bool %21 %27
- OpSelectionMerge %30 None
- OpBranchConditional %28 %31 %30
- %31 = OpLabel
OpBranch %16
- %30 = OpLabel
- %32 = OpAccessChain %_ptr_Function_int %vec %uint_1
- %33 = OpLoad %int %32 None
- %34 = OpSGreaterThanEqual %bool %33 %int_0
- OpSelectionMerge %36 None
- OpBranchConditional %34 %37 %36
- %37 = OpLabel
- OpBranch %16
- %36 = OpLabel
+ %16 = OpLabel
+ OpLoopMerge %17 %15 None
OpBranch %14
%14 = OpLabel
+ %23 = OpLoad %v2uint %tint_loop_idx None
+ %24 = OpIEqual %v2bool %23 %25
+ %29 = OpAll %bool %24
+ OpSelectionMerge %30 None
+ OpBranchConditional %29 %31 %30
+ %31 = OpLabel
+ OpBranch %17
+ %30 = OpLabel
+ %32 = OpAccessChain %_ptr_Function_int %vec %uint_1
+ %35 = OpLoad %int %32 None
+ %36 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+ %39 = OpAccessChain %_ptr_StorageBuffer_int %36 %uint_1
+ %41 = OpLoad %int %39 None
+ %42 = OpSGreaterThanEqual %bool %35 %41
+ OpSelectionMerge %43 None
+ OpBranchConditional %42 %44 %43
+ %44 = OpLabel
+ OpBranch %17
+ %43 = OpLabel
+ %45 = OpAccessChain %_ptr_Function_int %vec %uint_1
+ %46 = OpLoad %int %45 None
+ %47 = OpSGreaterThanEqual %bool %46 %int_0
+ OpSelectionMerge %49 None
+ OpBranchConditional %47 %50 %49
+ %50 = OpLabel
+ OpBranch %17
+ %49 = OpLabel
OpBranch %15
- %16 = OpLabel
+ %15 = OpLabel
+ %51 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %53 = OpLoad %uint %51 None
+%tint_low_inc = OpIAdd %uint %53 %uint_1
+ %55 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %55 %tint_low_inc None
+ %56 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %56 %uint_1 %uint_0
+ %58 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %59 = OpLoad %uint %58 None
+ %60 = OpIAdd %uint %59 %tint_carry
+ %61 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %61 %60 None
+ OpBranch %16
+ %17 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %8
- %39 = OpLabel
+ %63 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/bug/tint/534.wgsl.expected.spvasm b/test/tint/bug/tint/534.wgsl.expected.spvasm
index 7b27ee6..898bb63 100644
--- a/test/tint/bug/tint/534.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/534.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 175
+; Bound: 194
; Schema: 0
OpCapability Shader
OpCapability ImageQuery
@@ -34,7 +34,10 @@
OpName %success "success"
OpName %srcColorBits "srcColorBits"
OpName %dstColorBits "dstColorBits"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %i "i"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %outputIndex "outputIndex"
OpName %tint_v4f32_to_v4u32 "tint_v4f32_to_v4u32"
OpName %value "value"
@@ -96,19 +99,22 @@
%v4uint = OpTypeVector %uint 4
%_ptr_Function_v4uint = OpTypePointer Function %v4uint
%87 = OpConstantNull %v4uint
+ %98 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %102 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %v2bool = OpTypeVector %bool 2
%uint_3 = OpConstant %uint 3
%_ptr_Function_float = OpTypePointer Function %float
%false = OpConstantFalse %bool
%_ptr_StorageBuffer__runtimearr_uint = OpTypePointer StorageBuffer %_runtimearr_uint
%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
- %157 = OpTypeFunction %v4uint %v4float
- %161 = OpConstantNull %v4float
+ %177 = OpTypeFunction %v4uint %v4float
+ %181 = OpConstantNull %v4float
%v4bool = OpTypeVector %bool 4
%float_4_29496704e_09 = OpConstant %float 4.29496704e+09
- %165 = OpConstantComposite %v4float %float_4_29496704e_09 %float_4_29496704e_09 %float_4_29496704e_09 %float_4_29496704e_09
-%uint_4294967295 = OpConstant %uint 4294967295
- %168 = OpConstantComposite %v4uint %uint_4294967295 %uint_4294967295 %uint_4294967295 %uint_4294967295
- %171 = OpTypeFunction %void
+ %185 = OpConstantComposite %v4float %float_4_29496704e_09 %float_4_29496704e_09 %float_4_29496704e_09 %float_4_29496704e_09
+ %188 = OpConstantComposite %v4uint %uint_4294967295 %uint_4294967295 %uint_4294967295 %uint_4294967295
+ %190 = OpTypeFunction %void
%ConvertToFp16FloatValue = OpFunction %uint None %20
%fp32 = OpFunctionParameter %float
%21 = OpLabel
@@ -125,6 +131,7 @@
%success = OpVariable %_ptr_Function_bool Function
%srcColorBits = OpVariable %_ptr_Function_v4uint Function %87
%dstColorBits = OpVariable %_ptr_Function_v4uint Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %98
%i = OpVariable %_ptr_Function_uint Function
%outputIndex = OpVariable %_ptr_Function_uint Function
%28 = OpLoad %3 %src None
@@ -184,94 +191,114 @@
OpLoopMerge %96 %94 None
OpBranch %93
%93 = OpLabel
- %98 = OpLoad %uint %i None
- %99 = OpAccessChain %_ptr_Uniform_uint %11 %uint_0 %uint_3
- %101 = OpLoad %uint %99 None
- %102 = OpULessThan %bool %98 %101
- OpSelectionMerge %103 None
- OpBranchConditional %102 %103 %104
- %104 = OpLabel
+ %100 = OpLoad %v2uint %tint_loop_idx None
+ %101 = OpIEqual %v2bool %100 %102
+ %105 = OpAll %bool %101
+ OpSelectionMerge %106 None
+ OpBranchConditional %105 %107 %106
+ %107 = OpLabel
OpBranch %96
- %103 = OpLabel
- %105 = OpLoad %uint %i None
- %106 = OpLoad %uint %i None
- %107 = OpExtInst %uint %61 UMin %106 %uint_3
- %108 = OpAccessChain %_ptr_Function_float %srcColor %107
- %110 = OpLoad %float %108 None
- %111 = OpFunctionCall %uint %ConvertToFp16FloatValue %110
- %112 = OpExtInst %uint %61 UMin %105 %uint_3
- %113 = OpAccessChain %_ptr_Function_uint %srcColorBits %112
- OpStore %113 %111 None
- %114 = OpLoad %bool %success None
- OpSelectionMerge %115 None
- OpBranchConditional %114 %116 %117
- %116 = OpLabel
- %118 = OpLoad %uint %i None
- %119 = OpExtInst %uint %61 UMin %118 %uint_3
- %120 = OpAccessChain %_ptr_Function_uint %srcColorBits %119
- %121 = OpLoad %uint %120 None
- %122 = OpLoad %uint %i None
- %123 = OpExtInst %uint %61 UMin %122 %uint_3
- %124 = OpAccessChain %_ptr_Function_uint %dstColorBits %123
- %125 = OpLoad %uint %124 None
- %126 = OpIEqual %bool %121 %125
- OpBranch %115
- %117 = OpLabel
- OpBranch %115
- %115 = OpLabel
- %127 = OpPhi %bool %126 %116 %false %117
- OpStore %success %127 None
+ %106 = OpLabel
+ %108 = OpLoad %uint %i None
+ %109 = OpAccessChain %_ptr_Uniform_uint %11 %uint_0 %uint_3
+ %111 = OpLoad %uint %109 None
+ %112 = OpULessThan %bool %108 %111
+ OpSelectionMerge %113 None
+ OpBranchConditional %112 %113 %114
+ %114 = OpLabel
+ OpBranch %96
+ %113 = OpLabel
+ %115 = OpLoad %uint %i None
+ %116 = OpLoad %uint %i None
+ %117 = OpExtInst %uint %61 UMin %116 %uint_3
+ %118 = OpAccessChain %_ptr_Function_float %srcColor %117
+ %120 = OpLoad %float %118 None
+ %121 = OpFunctionCall %uint %ConvertToFp16FloatValue %120
+ %122 = OpExtInst %uint %61 UMin %115 %uint_3
+ %123 = OpAccessChain %_ptr_Function_uint %srcColorBits %122
+ OpStore %123 %121 None
+ %124 = OpLoad %bool %success None
+ OpSelectionMerge %125 None
+ OpBranchConditional %124 %126 %127
+ %126 = OpLabel
+ %128 = OpLoad %uint %i None
+ %129 = OpExtInst %uint %61 UMin %128 %uint_3
+ %130 = OpAccessChain %_ptr_Function_uint %srcColorBits %129
+ %131 = OpLoad %uint %130 None
+ %132 = OpLoad %uint %i None
+ %133 = OpExtInst %uint %61 UMin %132 %uint_3
+ %134 = OpAccessChain %_ptr_Function_uint %dstColorBits %133
+ %135 = OpLoad %uint %134 None
+ %136 = OpIEqual %bool %131 %135
+ OpBranch %125
+ %127 = OpLabel
+ OpBranch %125
+ %125 = OpLabel
+ %137 = OpPhi %bool %136 %126 %false %127
+ OpStore %success %137 None
OpBranch %94
%94 = OpLabel
- %129 = OpLoad %uint %i None
- %130 = OpIAdd %uint %129 %uint_1
- OpStore %i %130 None
+ %139 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %140 = OpLoad %uint %139 None
+%tint_low_inc = OpIAdd %uint %140 %uint_1
+ %142 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %142 %tint_low_inc None
+ %143 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %143 %uint_1 %uint_0
+ %145 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %146 = OpLoad %uint %145 None
+ %147 = OpIAdd %uint %146 %tint_carry
+ %148 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %148 %147 None
+ %149 = OpLoad %uint %i None
+ %150 = OpIAdd %uint %149 %uint_1
+ OpStore %i %150 None
OpBranch %95
%96 = OpLabel
- %131 = OpCompositeExtract %uint %GlobalInvocationID 1
- %132 = OpAccessChain %_ptr_Function_uint %size %uint_0
- %133 = OpLoad %uint %132 None
- %134 = OpIMul %uint %131 %133
- %135 = OpCompositeExtract %uint %GlobalInvocationID 0
- %136 = OpIAdd %uint %134 %135
- OpStore %outputIndex %136
- %138 = OpLoad %bool %success None
- OpSelectionMerge %139 None
- OpBranchConditional %138 %140 %141
- %140 = OpLabel
- %142 = OpLoad %uint %outputIndex None
- %143 = OpAccessChain %_ptr_StorageBuffer__runtimearr_uint %output %uint_0
- %145 = OpArrayLength %uint %output 0
- %146 = OpISub %uint %145 %uint_1
- %147 = OpExtInst %uint %61 UMin %142 %146
- %148 = OpAccessChain %_ptr_StorageBuffer_uint %output %uint_0 %147
- OpStore %148 %uint_1 None
- OpBranch %139
- %141 = OpLabel
- %150 = OpLoad %uint %outputIndex None
- %151 = OpAccessChain %_ptr_StorageBuffer__runtimearr_uint %output %uint_0
- %152 = OpArrayLength %uint %output 0
- %153 = OpISub %uint %152 %uint_1
- %154 = OpExtInst %uint %61 UMin %150 %153
- %155 = OpAccessChain %_ptr_StorageBuffer_uint %output %uint_0 %154
- OpStore %155 %uint_0 None
- OpBranch %139
- %139 = OpLabel
+ %151 = OpCompositeExtract %uint %GlobalInvocationID 1
+ %152 = OpAccessChain %_ptr_Function_uint %size %uint_0
+ %153 = OpLoad %uint %152 None
+ %154 = OpIMul %uint %151 %153
+ %155 = OpCompositeExtract %uint %GlobalInvocationID 0
+ %156 = OpIAdd %uint %154 %155
+ OpStore %outputIndex %156
+ %158 = OpLoad %bool %success None
+ OpSelectionMerge %159 None
+ OpBranchConditional %158 %160 %161
+ %160 = OpLabel
+ %162 = OpLoad %uint %outputIndex None
+ %163 = OpAccessChain %_ptr_StorageBuffer__runtimearr_uint %output %uint_0
+ %165 = OpArrayLength %uint %output 0
+ %166 = OpISub %uint %165 %uint_1
+ %167 = OpExtInst %uint %61 UMin %162 %166
+ %168 = OpAccessChain %_ptr_StorageBuffer_uint %output %uint_0 %167
+ OpStore %168 %uint_1 None
+ OpBranch %159
+ %161 = OpLabel
+ %170 = OpLoad %uint %outputIndex None
+ %171 = OpAccessChain %_ptr_StorageBuffer__runtimearr_uint %output %uint_0
+ %172 = OpArrayLength %uint %output 0
+ %173 = OpISub %uint %172 %uint_1
+ %174 = OpExtInst %uint %61 UMin %170 %173
+ %175 = OpAccessChain %_ptr_StorageBuffer_uint %output %uint_0 %174
+ OpStore %175 %uint_0 None
+ OpBranch %159
+ %159 = OpLabel
OpReturn
OpFunctionEnd
-%tint_v4f32_to_v4u32 = OpFunction %v4uint None %157
+%tint_v4f32_to_v4u32 = OpFunction %v4uint None %177
%value = OpFunctionParameter %v4float
- %158 = OpLabel
- %159 = OpConvertFToU %v4uint %value
- %160 = OpFOrdGreaterThanEqual %v4bool %value %161
- %163 = OpSelect %v4uint %160 %159 %87
- %164 = OpFOrdLessThanEqual %v4bool %value %165
- %167 = OpSelect %v4uint %164 %163 %168
- OpReturnValue %167
+ %178 = OpLabel
+ %179 = OpConvertFToU %v4uint %value
+ %180 = OpFOrdGreaterThanEqual %v4bool %value %181
+ %183 = OpSelect %v4uint %180 %179 %87
+ %184 = OpFOrdLessThanEqual %v4bool %value %185
+ %187 = OpSelect %v4uint %184 %183 %188
+ OpReturnValue %187
OpFunctionEnd
- %main = OpFunction %void None %171
- %172 = OpLabel
- %173 = OpLoad %v3uint %main_global_invocation_id_Input None
- %174 = OpFunctionCall %void %main_inner %173
+ %main = OpFunction %void None %190
+ %191 = OpLabel
+ %192 = OpLoad %v3uint %main_global_invocation_id_Input None
+ %193 = OpFunctionCall %void %main_inner %192
OpReturn
OpFunctionEnd
diff --git a/test/tint/bug/tint/942.wgsl.expected.spvasm b/test/tint/bug/tint/942.wgsl.expected.spvasm
index 2d006e2..0858ef7 100644
--- a/test/tint/bug/tint/942.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/942.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 266
+; Bound: 285
; Schema: 0
OpCapability Shader
OpCapability ImageQuery
@@ -40,8 +40,11 @@
OpName %writeIndex "writeIndex"
OpName %center "center"
OpName %acc "acc"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %f "f"
OpName %i "i"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %tint_div_u32 "tint_div_u32"
OpName %lhs "lhs"
OpName %rhs "rhs"
@@ -132,9 +135,12 @@
%false = OpConstantFalse %bool
%v2bool = OpTypeVector %bool 2
%_ptr_Function_v3float = OpTypePointer Function %v3float
+ %217 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %221 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%float_1 = OpConstant %float 1
- %254 = OpTypeFunction %uint %uint %uint
- %260 = OpTypeFunction %void
+ %273 = OpTypeFunction %uint %uint %uint
+ %279 = OpTypeFunction %void
%main_inner = OpFunction %void None %38
%WorkGroupID = OpFunctionParameter %v3uint
%LocalInvocationID = OpFunctionParameter %v3uint
@@ -147,6 +153,7 @@
%c_0 = OpVariable %_ptr_Function_uint Function
%writeIndex = OpVariable %_ptr_Function_v2uint Function
%acc = OpVariable %_ptr_Function_v3float Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %217
%f = OpVariable %_ptr_Function_uint Function
%i = OpVariable %_ptr_Function_uint Function
OpBranch %40
@@ -357,77 +364,97 @@
OpLoopMerge %215 %213 None
OpBranch %212
%212 = OpLabel
- %217 = OpLoad %uint %f None
- %218 = OpAccessChain %_ptr_Uniform_uint %4 %uint_0 %uint_0
- %219 = OpLoad %uint %218 None
- %220 = OpULessThan %bool %217 %219
- OpSelectionMerge %221 None
- OpBranchConditional %220 %221 %222
- %222 = OpLabel
+ %219 = OpLoad %v2uint %tint_loop_idx None
+ %220 = OpIEqual %v2bool %219 %221
+ %223 = OpAll %bool %220
+ OpSelectionMerge %224 None
+ OpBranchConditional %223 %225 %224
+ %225 = OpLabel
OpBranch %215
- %221 = OpLabel
- %223 = OpLoad %uint %f None
- %224 = OpIAdd %uint %center %223
- %225 = OpISub %uint %224 %filterOffset
- OpStore %i %225
- %227 = OpLoad %v3float %acc None
- %228 = OpAccessChain %_ptr_Uniform_uint %4 %uint_0 %uint_0
- %229 = OpLoad %uint %228 None
- %230 = OpConvertUToF %float %229
- %231 = OpFDiv %float %float_1 %230
- %233 = OpLoad %uint %r_0 None
- %234 = OpLoad %uint %i None
- %235 = OpExtInst %uint %76 UMin %233 %uint_3
- %236 = OpExtInst %uint %76 UMin %234 %uint_255
- %237 = OpAccessChain %_ptr_Workgroup_v3float %tile %235 %236
- %238 = OpLoad %v3float %237 None
- %239 = OpVectorTimesScalar %v3float %238 %231
- %240 = OpFAdd %v3float %227 %239
- OpStore %acc %240 None
+ %224 = OpLabel
+ %226 = OpLoad %uint %f None
+ %227 = OpAccessChain %_ptr_Uniform_uint %4 %uint_0 %uint_0
+ %228 = OpLoad %uint %227 None
+ %229 = OpULessThan %bool %226 %228
+ OpSelectionMerge %230 None
+ OpBranchConditional %229 %230 %231
+ %231 = OpLabel
+ OpBranch %215
+ %230 = OpLabel
+ %232 = OpLoad %uint %f None
+ %233 = OpIAdd %uint %center %232
+ %234 = OpISub %uint %233 %filterOffset
+ OpStore %i %234
+ %236 = OpLoad %v3float %acc None
+ %237 = OpAccessChain %_ptr_Uniform_uint %4 %uint_0 %uint_0
+ %238 = OpLoad %uint %237 None
+ %239 = OpConvertUToF %float %238
+ %240 = OpFDiv %float %float_1 %239
+ %242 = OpLoad %uint %r_0 None
+ %243 = OpLoad %uint %i None
+ %244 = OpExtInst %uint %76 UMin %242 %uint_3
+ %245 = OpExtInst %uint %76 UMin %243 %uint_255
+ %246 = OpAccessChain %_ptr_Workgroup_v3float %tile %244 %245
+ %247 = OpLoad %v3float %246 None
+ %248 = OpVectorTimesScalar %v3float %247 %240
+ %249 = OpFAdd %v3float %236 %248
+ OpStore %acc %249 None
OpBranch %213
%213 = OpLabel
- %241 = OpLoad %uint %f None
- %242 = OpIAdd %uint %241 %uint_1
- OpStore %f %242 None
+ %250 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %251 = OpLoad %uint %250 None
+%tint_low_inc = OpIAdd %uint %251 %uint_1
+ %253 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %253 %tint_low_inc None
+ %254 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %254 %uint_1 %uint_0
+ %256 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %257 = OpLoad %uint %256 None
+ %258 = OpIAdd %uint %257 %tint_carry
+ %259 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %259 %258 None
+ %260 = OpLoad %uint %f None
+ %261 = OpIAdd %uint %260 %uint_1
+ OpStore %f %261 None
OpBranch %214
%215 = OpLabel
- %243 = OpLoad %15 %outputTex None
- %244 = OpLoad %v2uint %writeIndex None
- %245 = OpLoad %v3float %acc None
- %246 = OpCompositeConstruct %v4float %245 %float_1
- OpImageWrite %243 %244 %246 None
+ %262 = OpLoad %15 %outputTex None
+ %263 = OpLoad %v2uint %writeIndex None
+ %264 = OpLoad %v3float %acc None
+ %265 = OpCompositeConstruct %v4float %264 %float_1
+ OpImageWrite %262 %263 %265 None
OpBranch %207
%207 = OpLabel
OpBranch %167
%167 = OpLabel
- %248 = OpLoad %uint %c_0 None
- %249 = OpIAdd %uint %248 %uint_1
- OpStore %c_0 %249 None
+ %267 = OpLoad %uint %c_0 None
+ %268 = OpIAdd %uint %267 %uint_1
+ OpStore %c_0 %268 None
OpBranch %168
%169 = OpLabel
OpBranch %157
%157 = OpLabel
- %250 = OpLoad %uint %r_0 None
- %251 = OpIAdd %uint %250 %uint_1
- OpStore %r_0 %251 None
+ %269 = OpLoad %uint %r_0 None
+ %270 = OpIAdd %uint %269 %uint_1
+ OpStore %r_0 %270 None
OpBranch %158
%159 = OpLabel
OpReturn
OpFunctionEnd
-%tint_div_u32 = OpFunction %uint None %254
+%tint_div_u32 = OpFunction %uint None %273
%lhs = OpFunctionParameter %uint
%rhs = OpFunctionParameter %uint
- %255 = OpLabel
- %256 = OpIEqual %bool %rhs %uint_0
- %257 = OpSelect %uint %256 %uint_1 %rhs
- %258 = OpUDiv %uint %lhs %257
- OpReturnValue %258
+ %274 = OpLabel
+ %275 = OpIEqual %bool %rhs %uint_0
+ %276 = OpSelect %uint %275 %uint_1 %rhs
+ %277 = OpUDiv %uint %lhs %276
+ OpReturnValue %277
OpFunctionEnd
- %main = OpFunction %void None %260
- %261 = OpLabel
- %262 = OpLoad %v3uint %main_workgroup_id_Input None
- %263 = OpLoad %v3uint %main_local_invocation_id_Input None
- %264 = OpLoad %uint %main_local_invocation_index_Input None
- %265 = OpFunctionCall %void %main_inner %262 %263 %264
+ %main = OpFunction %void None %279
+ %280 = OpLabel
+ %281 = OpLoad %v3uint %main_workgroup_id_Input None
+ %282 = OpLoad %v3uint %main_local_invocation_id_Input None
+ %283 = OpLoad %uint %main_local_invocation_index_Input None
+ %284 = OpFunctionCall %void %main_inner %281 %282 %283
OpReturn
OpFunctionEnd
diff --git a/test/tint/bug/tint/948.wgsl.expected.spvasm b/test/tint/bug/tint/948.wgsl.expected.spvasm
index 790ea15..bb3308c 100644
--- a/test/tint/bug/tint/948.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/948.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 377
+; Bound: 418
; Schema: 0
OpCapability Shader
%69 = OpExtInstImport "GLSL.std.450"
@@ -80,6 +80,7 @@
OpName %x_101 "x_101"
OpName %x_106 "x_106"
OpName %x_111 "x_111"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %x_122 "x_122"
OpName %x_126 "x_126"
OpName %x_150 "x_150"
@@ -94,6 +95,7 @@
OpName %x_174 "x_174"
OpName %x_181 "x_181"
OpName %x_184 "x_184"
+ OpName %tint_loop_idx_0 "tint_loop_idx"
OpName %x_193 "x_193"
OpName %x_197 "x_197"
OpName %x_198 "x_198"
@@ -102,6 +104,8 @@
OpName %x_211 "x_211"
OpName %x_214 "x_214"
OpName %x_217 "x_217"
+ OpName %tint_low_inc_1 "tint_low_inc_1"
+ OpName %tint_carry_1 "tint_carry_1"
OpName %x_218 "x_218"
OpName %x_222 "x_222"
OpName %x_225 "x_225"
@@ -129,6 +133,8 @@
OpName %x_295 "x_295"
OpName %x_298 "x_298"
OpName %x_299 "x_299"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %x_304 "x_304"
OpName %x_310 "x_310"
OpName %x_311 "x_311"
@@ -264,17 +270,24 @@
%152 = OpConstantComposite %v2float %float_1 %float_1
%uint_4 = OpConstant %uint 4
%int_0 = OpConstant %int 0
- %int_2 = OpConstant %int 2
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %169 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %172 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
- %182 = OpConstantComposite %v2float %float_0_5 %float_0_5
+ %v2bool = OpTypeVector %bool 2
+ %int_2 = OpConstant %int 2
+ %195 = OpConstantComposite %v2float %float_0_5 %float_0_5
%uint_2 = OpConstant %uint 2
%float_8 = OpConstant %float 8
+%_ptr_Function_uint = OpTypePointer Function %uint
%uint_3 = OpConstant %uint 3
%int_1 = OpConstant %int 1
%_ptr_Uniform_v3float = OpTypePointer Uniform %v3float
%uint_8 = OpConstant %uint 8
%main_out = OpTypeStruct %v4float
- %362 = OpTypeFunction %main_out %v2float %v2float %v2float %v2float %v3float %v2float
+ %403 = OpTypeFunction %main_out %v2float %v2float %v2float %v2float %v3float %v2float
%getFrameData_f1_ = OpFunction %mat4v4float None %53
%frameID_root = OpFunctionParameter %_ptr_Function_float
%54 = OpLabel
@@ -343,6 +356,8 @@
%nc = OpVariable %_ptr_Function_v4float Function %x_217
%alpha = OpVariable %_ptr_Function_float Function %27
%mixed = OpVariable %_ptr_Function_v3float Function %38
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %169
+%tint_loop_idx_0 = OpVariable %_ptr_Function_v2uint Function %169
OpStore %color %x_217 None
%x_86 = OpLoad %v2float %tUV None
%138 = OpExtInst %v2float %69 Fract %x_86
@@ -368,277 +383,321 @@
%159 = OpFDiv %v2float %152 %x_111
OpStore %stageUnits %159 None
OpStore %i %int_0 None
- OpBranch %163
- %163 = OpLabel
- OpLoopMerge %164 %162 None
OpBranch %161
%161 = OpLabel
- %x_122 = OpLoad %int %i None
- %166 = OpSLessThan %bool %x_122 %int_2
- OpSelectionMerge %169 None
- OpBranchConditional %166 %169 %170
- %170 = OpLabel
OpBranch %164
- %169 = OpLabel
+ %164 = OpLabel
+ OpLoopMerge %165 %163 None
+ OpBranch %162
+ %162 = OpLabel
+ %170 = OpLoad %v2uint %tint_loop_idx None
+ %171 = OpIEqual %v2bool %170 %172
+ %176 = OpAll %bool %171
+ OpSelectionMerge %177 None
+ OpBranchConditional %176 %178 %177
+ %178 = OpLabel
+ OpBranch %165
+ %177 = OpLabel
+ %x_122 = OpLoad %int %i None
+ %180 = OpSLessThan %bool %x_122 %int_2
+ OpSelectionMerge %182 None
+ OpBranchConditional %180 %182 %183
+ %183 = OpLabel
+ OpBranch %165
+ %182 = OpLabel
%x_126 = OpLoad %int %i None
- OpSelectionMerge %175 None
- OpSwitch %x_126 %172 1 %173 0 %174
- %173 = OpLabel
+ OpSelectionMerge %188 None
+ OpSwitch %x_126 %185 1 %186 0 %187
+ %186 = OpLabel
%x_150 = OpLoad %v2float %tileID None
- %177 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_0 %uint_4
- %x_154 = OpLoad %v2float %177 None
- %179 = OpLoad %13 %tileMapsTexture1 None
- %180 = OpLoad %16 %tileMapsSampler None
- %181 = OpFAdd %v2float %x_150 %182
- %183 = OpFDiv %v2float %181 %x_154
- %184 = OpExtInst %float %69 NClamp %float_0 %float_n16 %float_15_9899998
- %185 = OpSampledImage %73 %179 %180
- %x_156 = OpImageSampleImplicitLod %v4float %185 %183 Bias %184
- %187 = OpCompositeExtract %float %x_156 0
- OpStore %frameID_1 %187 None
- OpBranch %175
- %174 = OpLabel
+ %190 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_0 %uint_4
+ %x_154 = OpLoad %v2float %190 None
+ %192 = OpLoad %13 %tileMapsTexture1 None
+ %193 = OpLoad %16 %tileMapsSampler None
+ %194 = OpFAdd %v2float %x_150 %195
+ %196 = OpFDiv %v2float %194 %x_154
+ %197 = OpExtInst %float %69 NClamp %float_0 %float_n16 %float_15_9899998
+ %198 = OpSampledImage %73 %192 %193
+ %x_156 = OpImageSampleImplicitLod %v4float %198 %196 Bias %197
+ %200 = OpCompositeExtract %float %x_156 0
+ OpStore %frameID_1 %200 None
+ OpBranch %188
+ %187 = OpLabel
%x_136 = OpLoad %v2float %tileID None
- %189 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_0 %uint_4
- %x_140 = OpLoad %v2float %189 None
- %191 = OpLoad %13 %tileMapsTexture0 None
- %192 = OpLoad %16 %tileMapsSampler None
- %193 = OpFAdd %v2float %x_136 %182
- %194 = OpFDiv %v2float %193 %x_140
- %195 = OpExtInst %float %69 NClamp %float_0 %float_n16 %float_15_9899998
- %196 = OpSampledImage %73 %191 %192
- %x_142 = OpImageSampleImplicitLod %v4float %196 %194 Bias %195
- %198 = OpCompositeExtract %float %x_142 0
- OpStore %frameID_1 %198 None
- OpBranch %175
- %172 = OpLabel
- OpBranch %175
- %175 = OpLabel
+ %202 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_0 %uint_4
+ %x_140 = OpLoad %v2float %202 None
+ %204 = OpLoad %13 %tileMapsTexture0 None
+ %205 = OpLoad %16 %tileMapsSampler None
+ %206 = OpFAdd %v2float %x_136 %195
+ %207 = OpFDiv %v2float %206 %x_140
+ %208 = OpExtInst %float %69 NClamp %float_0 %float_n16 %float_15_9899998
+ %209 = OpSampledImage %73 %204 %205
+ %x_142 = OpImageSampleImplicitLod %v4float %209 %207 Bias %208
+ %211 = OpCompositeExtract %float %x_142 0
+ OpStore %frameID_1 %211 None
+ OpBranch %188
+ %185 = OpLabel
+ OpBranch %188
+ %188 = OpLabel
%x_166 = OpLoad %float %frameID_1 None
- %200 = OpAccessChain %_ptr_Uniform_float %1 %uint_0 %uint_7
- %x_169 = OpLoad %float %200 None
- %202 = OpLoad %13 %animationMapTexture None
- %203 = OpLoad %16 %animationMapSampler None
- %204 = OpFAdd %float %x_166 %float_0_5
- %205 = OpFDiv %float %204 %x_169
- %206 = OpCompositeConstruct %v2float %205 %float_0
- %207 = OpExtInst %float %69 NClamp %float_0 %float_n16 %float_15_9899998
- %208 = OpSampledImage %73 %202 %203
- %x_172 = OpImageSampleImplicitLod %v4float %208 %206 Bias %207
+ %213 = OpAccessChain %_ptr_Uniform_float %1 %uint_0 %uint_7
+ %x_169 = OpLoad %float %213 None
+ %215 = OpLoad %13 %animationMapTexture None
+ %216 = OpLoad %16 %animationMapSampler None
+ %217 = OpFAdd %float %x_166 %float_0_5
+ %218 = OpFDiv %float %217 %x_169
+ %219 = OpCompositeConstruct %v2float %218 %float_0
+ %220 = OpExtInst %float %69 NClamp %float_0 %float_n16 %float_15_9899998
+ %221 = OpSampledImage %73 %215 %216
+ %x_172 = OpImageSampleImplicitLod %v4float %221 %219 Bias %220
OpStore %animationData %x_172 None
- %210 = OpAccessChain %_ptr_Function_float %animationData %uint_1
- %x_174 = OpLoad %float %210 None
- %212 = OpFOrdGreaterThan %bool %x_174 %float_0
- OpSelectionMerge %213 None
- OpBranchConditional %212 %214 %213
- %214 = OpLabel
- %215 = OpAccessChain %_ptr_Uniform_float %1 %uint_0 %uint_0
- %x_181 = OpLoad %float %215 None
- %217 = OpAccessChain %_ptr_Function_float %animationData %uint_2
- %x_184 = OpLoad %float %217 None
- %220 = OpFMul %float %x_181 %x_184
- %221 = OpFRem %float %220 %float_1
- OpStore %mt %221 None
+ %223 = OpAccessChain %_ptr_Function_float %animationData %uint_1
+ %x_174 = OpLoad %float %223 None
+ %225 = OpFOrdGreaterThan %bool %x_174 %float_0
+ OpSelectionMerge %226 None
+ OpBranchConditional %225 %227 %226
+ %227 = OpLabel
+ %228 = OpAccessChain %_ptr_Uniform_float %1 %uint_0 %uint_0
+ %x_181 = OpLoad %float %228 None
+ %230 = OpAccessChain %_ptr_Function_float %animationData %uint_2
+ %x_184 = OpLoad %float %230 None
+ %233 = OpFMul %float %x_181 %x_184
+ %234 = OpFRem %float %233 %float_1
+ OpStore %mt %234 None
OpStore %f %float_0 None
- OpBranch %224
- %224 = OpLabel
- OpLoopMerge %225 %223 None
- OpBranch %222
- %222 = OpLabel
- %x_193 = OpLoad %float %f None
- %227 = OpFOrdLessThan %bool %x_193 %float_8
- OpSelectionMerge %229 None
- OpBranchConditional %227 %229 %230
- %230 = OpLabel
- OpBranch %225
- %229 = OpLabel
- %231 = OpAccessChain %_ptr_Function_float %animationData %uint_1
- %x_197 = OpLoad %float %231 None
- %x_198 = OpLoad %float %mt None
- %234 = OpFOrdGreaterThan %bool %x_197 %x_198
- OpSelectionMerge %235 None
- OpBranchConditional %234 %236 %235
- %236 = OpLabel
- %237 = OpAccessChain %_ptr_Function_float %animationData %uint_0
- %x_203 = OpLoad %float %237 None
- OpStore %frameID_1 %x_203 None
- OpBranch %225
+ OpBranch %235
%235 = OpLabel
+ OpBranch %238
+ %238 = OpLabel
+ OpLoopMerge %239 %237 None
+ OpBranch %236
+ %236 = OpLabel
+ %241 = OpLoad %v2uint %tint_loop_idx_0 None
+ %242 = OpIEqual %v2bool %241 %172
+ %243 = OpAll %bool %242
+ OpSelectionMerge %244 None
+ OpBranchConditional %243 %245 %244
+ %245 = OpLabel
+ OpBranch %239
+ %244 = OpLabel
+ %x_193 = OpLoad %float %f None
+ %247 = OpFOrdLessThan %bool %x_193 %float_8
+ OpSelectionMerge %249 None
+ OpBranchConditional %247 %249 %250
+ %250 = OpLabel
+ OpBranch %239
+ %249 = OpLabel
+ %251 = OpAccessChain %_ptr_Function_float %animationData %uint_1
+ %x_197 = OpLoad %float %251 None
+ %x_198 = OpLoad %float %mt None
+ %254 = OpFOrdGreaterThan %bool %x_197 %x_198
+ OpSelectionMerge %255 None
+ OpBranchConditional %254 %256 %255
+ %256 = OpLabel
+ %257 = OpAccessChain %_ptr_Function_float %animationData %uint_0
+ %x_203 = OpLoad %float %257 None
+ OpStore %frameID_1 %x_203 None
+ OpBranch %239
+ %255 = OpLabel
%x_208 = OpLoad %float %frameID_1 None
- %240 = OpAccessChain %_ptr_Uniform_float %1 %uint_0 %uint_7
- %x_211 = OpLoad %float %240 None
+ %260 = OpAccessChain %_ptr_Uniform_float %1 %uint_0 %uint_7
+ %x_211 = OpLoad %float %260 None
%x_214 = OpLoad %float %f None
OpStore %animationData %x_217 None
- OpBranch %223
- %223 = OpLabel
+ OpBranch %237
+ %237 = OpLabel
+ %263 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ %265 = OpLoad %uint %263 None
+%tint_low_inc_1 = OpIAdd %uint %265 %uint_1
+ %267 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ OpStore %267 %tint_low_inc_1 None
+ %268 = OpIEqual %bool %tint_low_inc_1 %uint_0
+%tint_carry_1 = OpSelect %uint %268 %uint_1 %uint_0
+ %270 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ %271 = OpLoad %uint %270 None
+ %272 = OpIAdd %uint %271 %tint_carry_1
+ %273 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ OpStore %273 %272 None
%x_218 = OpLoad %float %f None
- %244 = OpFAdd %float %x_218 %float_1
- OpStore %f %244 None
- OpBranch %224
- %225 = OpLabel
- OpBranch %213
- %213 = OpLabel
+ %275 = OpFAdd %float %x_218 %float_1
+ OpStore %f %275 None
+ OpBranch %238
+ %239 = OpLabel
+ OpBranch %226
+ %226 = OpLabel
%x_222 = OpLoad %float %frameID_1 None
- %246 = OpFAdd %float %x_222 %float_0_5
- OpStore %param %246 None
+ %277 = OpFAdd %float %x_222 %float_0_5
+ OpStore %param %277 None
%x_225 = OpFunctionCall %mat4v4float %getFrameData_f1_ %param
OpStore %frameData %x_225 None
- %248 = OpAccessChain %_ptr_Function_v4float %frameData %uint_0
- %x_228 = OpLoad %v4float %248 None
- %250 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_0 %uint_5
- %x_231 = OpLoad %v2float %250 None
- %252 = OpCompositeExtract %float %x_228 3
- %253 = OpCompositeExtract %float %x_228 2
- %254 = OpCompositeConstruct %v2float %252 %253
- %255 = OpFDiv %v2float %254 %x_231
- OpStore %frameSize %255 None
- %256 = OpAccessChain %_ptr_Function_v4float %frameData %uint_0
- %x_235 = OpLoad %v4float %256 None
+ %279 = OpAccessChain %_ptr_Function_v4float %frameData %uint_0
+ %x_228 = OpLoad %v4float %279 None
+ %281 = OpAccessChain %_ptr_Uniform_v2float %1 %uint_0 %uint_5
+ %x_231 = OpLoad %v2float %281 None
+ %283 = OpCompositeExtract %float %x_228 3
+ %284 = OpCompositeExtract %float %x_228 2
+ %285 = OpCompositeConstruct %v2float %283 %284
+ %286 = OpFDiv %v2float %285 %x_231
+ OpStore %frameSize %286 None
+ %287 = OpAccessChain %_ptr_Function_v4float %frameData %uint_0
+ %x_235 = OpLoad %v4float %287 None
%x_237 = OpLoad %v2float %sheetUnits None
- %259 = OpCompositeExtract %float %x_235 0
- %260 = OpCompositeExtract %float %x_235 1
- %261 = OpCompositeConstruct %v2float %259 %260
- %262 = OpFMul %v2float %261 %x_237
- OpStore %offset_1 %262 None
- %263 = OpAccessChain %_ptr_Function_v4float %frameData %uint_2
- %x_241 = OpLoad %v4float %263 None
- %265 = OpAccessChain %_ptr_Function_v4float %frameData %uint_0
- %x_244 = OpLoad %v4float %265 None
- %267 = OpCompositeExtract %float %x_241 0
- %268 = OpCompositeExtract %float %x_241 1
- %269 = OpCompositeConstruct %v2float %267 %268
- %270 = OpCompositeExtract %float %x_244 3
- %271 = OpCompositeExtract %float %x_244 2
- %272 = OpCompositeConstruct %v2float %270 %271
- %273 = OpFDiv %v2float %269 %272
- OpStore %ratio %273 None
- %274 = OpAccessChain %_ptr_Function_v4float %frameData %uint_2
- %275 = OpAccessChain %_ptr_Function_float %274 %uint_2
- %x_248 = OpLoad %float %275 None
- %277 = OpFOrdEqual %bool %x_248 %float_1
- OpSelectionMerge %278 None
- OpBranchConditional %277 %279 %278
- %279 = OpLabel
+ %290 = OpCompositeExtract %float %x_235 0
+ %291 = OpCompositeExtract %float %x_235 1
+ %292 = OpCompositeConstruct %v2float %290 %291
+ %293 = OpFMul %v2float %292 %x_237
+ OpStore %offset_1 %293 None
+ %294 = OpAccessChain %_ptr_Function_v4float %frameData %uint_2
+ %x_241 = OpLoad %v4float %294 None
+ %296 = OpAccessChain %_ptr_Function_v4float %frameData %uint_0
+ %x_244 = OpLoad %v4float %296 None
+ %298 = OpCompositeExtract %float %x_241 0
+ %299 = OpCompositeExtract %float %x_241 1
+ %300 = OpCompositeConstruct %v2float %298 %299
+ %301 = OpCompositeExtract %float %x_244 3
+ %302 = OpCompositeExtract %float %x_244 2
+ %303 = OpCompositeConstruct %v2float %301 %302
+ %304 = OpFDiv %v2float %300 %303
+ OpStore %ratio %304 None
+ %305 = OpAccessChain %_ptr_Function_v4float %frameData %uint_2
+ %306 = OpAccessChain %_ptr_Function_float %305 %uint_2
+ %x_248 = OpLoad %float %306 None
+ %308 = OpFOrdEqual %bool %x_248 %float_1
+ OpSelectionMerge %309 None
+ OpBranchConditional %308 %310 %309
+ %310 = OpLabel
%x_252 = OpLoad %v2float %tileUV None
- %281 = OpCompositeExtract %float %x_252 1
- %282 = OpCompositeExtract %float %x_252 0
- %283 = OpCompositeConstruct %v2float %281 %282
- OpStore %tileUV %283 None
- OpBranch %278
- %278 = OpLabel
+ %312 = OpCompositeExtract %float %x_252 1
+ %313 = OpCompositeExtract %float %x_252 0
+ %314 = OpCompositeConstruct %v2float %312 %313
+ OpStore %tileUV %314 None
+ OpBranch %309
+ %309 = OpLabel
%x_254 = OpLoad %int %i None
- %285 = OpIEqual %bool %x_254 %int_0
- OpSelectionMerge %286 None
- OpBranchConditional %285 %287 %288
- %287 = OpLabel
+ %316 = OpIEqual %bool %x_254 %int_0
+ OpSelectionMerge %317 None
+ OpBranchConditional %316 %318 %319
+ %318 = OpLabel
%x_263 = OpLoad %v2float %tileUV None
%x_264 = OpLoad %v2float %frameSize None
%x_266 = OpLoad %v2float %offset_1 None
- %292 = OpLoad %13 %spriteSheetTexture None
- %293 = OpLoad %16 %spriteSheetSampler None
- %294 = OpFMul %v2float %x_263 %x_264
- %295 = OpFAdd %v2float %294 %x_266
- %296 = OpSampledImage %73 %292 %293
- %x_268 = OpImageSampleImplicitLod %v4float %296 %295 None
+ %323 = OpLoad %13 %spriteSheetTexture None
+ %324 = OpLoad %16 %spriteSheetSampler None
+ %325 = OpFMul %v2float %x_263 %x_264
+ %326 = OpFAdd %v2float %325 %x_266
+ %327 = OpSampledImage %73 %323 %324
+ %x_268 = OpImageSampleImplicitLod %v4float %327 %326 None
OpStore %color %x_268 None
- OpBranch %286
- %288 = OpLabel
+ OpBranch %317
+ %319 = OpLabel
%x_274 = OpLoad %v2float %tileUV None
%x_275 = OpLoad %v2float %frameSize None
%x_277 = OpLoad %v2float %offset_1 None
- %301 = OpLoad %13 %spriteSheetTexture None
- %302 = OpLoad %16 %spriteSheetSampler None
- %303 = OpFMul %v2float %x_274 %x_275
- %304 = OpFAdd %v2float %303 %x_277
- %305 = OpSampledImage %73 %301 %302
- %x_279 = OpImageSampleImplicitLod %v4float %305 %304 None
+ %332 = OpLoad %13 %spriteSheetTexture None
+ %333 = OpLoad %16 %spriteSheetSampler None
+ %334 = OpFMul %v2float %x_274 %x_275
+ %335 = OpFAdd %v2float %334 %x_277
+ %336 = OpSampledImage %73 %332 %333
+ %x_279 = OpImageSampleImplicitLod %v4float %336 %335 None
OpStore %nc %x_279 None
- %307 = OpAccessChain %_ptr_Function_float %color %uint_3
- %x_283 = OpLoad %float %307 None
- %310 = OpAccessChain %_ptr_Function_float %nc %uint_3
- %x_285 = OpLoad %float %310 None
- %312 = OpFAdd %float %x_283 %x_285
- %313 = OpExtInst %float %69 FMin %312 %float_1
- OpStore %alpha %313 None
+ %338 = OpAccessChain %_ptr_Function_float %color %uint_3
+ %x_283 = OpLoad %float %338 None
+ %341 = OpAccessChain %_ptr_Function_float %nc %uint_3
+ %x_285 = OpLoad %float %341 None
+ %343 = OpFAdd %float %x_283 %x_285
+ %344 = OpExtInst %float %69 FMin %343 %float_1
+ OpStore %alpha %344 None
%x_290 = OpLoad %v4float %color None
%x_292 = OpLoad %v4float %nc None
- %316 = OpAccessChain %_ptr_Function_float %nc %uint_3
- %x_295 = OpLoad %float %316 None
- %318 = OpCompositeExtract %float %x_290 0
- %319 = OpCompositeExtract %float %x_290 1
- %320 = OpCompositeExtract %float %x_290 2
- %321 = OpCompositeConstruct %v3float %318 %319 %320
- %322 = OpCompositeExtract %float %x_292 0
- %323 = OpCompositeExtract %float %x_292 1
- %324 = OpCompositeExtract %float %x_292 2
- %325 = OpCompositeConstruct %v3float %322 %323 %324
- %326 = OpCompositeConstruct %v3float %x_295 %x_295 %x_295
- %327 = OpExtInst %v3float %69 FMix %321 %325 %326
- OpStore %mixed %327 None
+ %347 = OpAccessChain %_ptr_Function_float %nc %uint_3
+ %x_295 = OpLoad %float %347 None
+ %349 = OpCompositeExtract %float %x_290 0
+ %350 = OpCompositeExtract %float %x_290 1
+ %351 = OpCompositeExtract %float %x_290 2
+ %352 = OpCompositeConstruct %v3float %349 %350 %351
+ %353 = OpCompositeExtract %float %x_292 0
+ %354 = OpCompositeExtract %float %x_292 1
+ %355 = OpCompositeExtract %float %x_292 2
+ %356 = OpCompositeConstruct %v3float %353 %354 %355
+ %357 = OpCompositeConstruct %v3float %x_295 %x_295 %x_295
+ %358 = OpExtInst %v3float %69 FMix %352 %356 %357
+ OpStore %mixed %358 None
%x_298 = OpLoad %v3float %mixed None
%x_299 = OpLoad %float %alpha None
- %330 = OpCompositeExtract %float %x_298 0
- %331 = OpCompositeExtract %float %x_298 1
- %332 = OpCompositeExtract %float %x_298 2
- %333 = OpCompositeConstruct %v4float %330 %331 %332 %x_299
- OpStore %color %333 None
- OpBranch %286
- %286 = OpLabel
- OpBranch %162
- %162 = OpLabel
- %x_304 = OpLoad %int %i None
- %335 = OpIAdd %int %x_304 %int_1
- OpStore %i %335 None
+ %361 = OpCompositeExtract %float %x_298 0
+ %362 = OpCompositeExtract %float %x_298 1
+ %363 = OpCompositeExtract %float %x_298 2
+ %364 = OpCompositeConstruct %v4float %361 %362 %363 %x_299
+ OpStore %color %364 None
+ OpBranch %317
+ %317 = OpLabel
OpBranch %163
- %164 = OpLabel
- %337 = OpAccessChain %_ptr_Uniform_v3float %1 %uint_0 %uint_8
- %x_310 = OpLoad %v3float %337 None
+ %163 = OpLabel
+ %365 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %366 = OpLoad %uint %365 None
+%tint_low_inc = OpIAdd %uint %366 %uint_1
+ %368 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %368 %tint_low_inc None
+ %369 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %369 %uint_1 %uint_0
+ %371 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %372 = OpLoad %uint %371 None
+ %373 = OpIAdd %uint %372 %tint_carry
+ %374 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %374 %373 None
+ %x_304 = OpLoad %int %i None
+ %376 = OpIAdd %int %x_304 %int_1
+ OpStore %i %376 None
+ OpBranch %164
+ %165 = OpLabel
+ %378 = OpAccessChain %_ptr_Uniform_v3float %1 %uint_0 %uint_8
+ %x_310 = OpLoad %v3float %378 None
%x_311 = OpLoad %v4float %color None
- %342 = OpCompositeExtract %float %x_311 0
- %343 = OpCompositeExtract %float %x_311 1
- %344 = OpCompositeExtract %float %x_311 2
- %345 = OpCompositeConstruct %v3float %342 %343 %344
- %x_313 = OpFMul %v3float %345 %x_310
+ %383 = OpCompositeExtract %float %x_311 0
+ %384 = OpCompositeExtract %float %x_311 1
+ %385 = OpCompositeExtract %float %x_311 2
+ %386 = OpCompositeConstruct %v3float %383 %384 %385
+ %x_313 = OpFMul %v3float %386 %x_310
%x_314 = OpLoad %v4float %color None
- %348 = OpCompositeExtract %float %x_313 0
- %349 = OpCompositeExtract %float %x_313 1
- %350 = OpCompositeExtract %float %x_313 2
- %351 = OpCompositeExtract %float %x_314 3
- %352 = OpCompositeConstruct %v4float %348 %349 %350 %351
- OpStore %color %352 None
+ %389 = OpCompositeExtract %float %x_313 0
+ %390 = OpCompositeExtract %float %x_313 1
+ %391 = OpCompositeExtract %float %x_313 2
+ %392 = OpCompositeExtract %float %x_314 3
+ %393 = OpCompositeConstruct %v4float %389 %390 %391 %392
+ OpStore %color %393 None
%x_318 = OpLoad %v4float %color None
OpStore %glFragColor %x_318 None
OpReturn
OpFunctionEnd
- %main_inner = OpFunction %main_out None %362
+ %main_inner = OpFunction %main_out None %403
%tUV_param = OpFunctionParameter %v2float
%tileID_1_param = OpFunctionParameter %v2float
%levelUnits_param = OpFunctionParameter %v2float
%stageUnits_1_param = OpFunctionParameter %v2float
%vPosition_param = OpFunctionParameter %v3float
%vUV_param = OpFunctionParameter %v2float
- %363 = OpLabel
+ %404 = OpLabel
OpStore %tUV %tUV_param None
OpStore %tileID_1 %tileID_1_param None
OpStore %levelUnits %levelUnits_param None
OpStore %stageUnits_1 %stageUnits_1_param None
OpStore %vPosition %vPosition_param None
OpStore %vUV %vUV_param None
- %364 = OpFunctionCall %void %main_1
- %365 = OpLoad %v4float %glFragColor None
- %366 = OpCompositeConstruct %main_out %365
- OpReturnValue %366
+ %405 = OpFunctionCall %void %main_1
+ %406 = OpLoad %v4float %glFragColor None
+ %407 = OpCompositeConstruct %main_out %406
+ OpReturnValue %407
OpFunctionEnd
%main = OpFunction %void None %109
- %368 = OpLabel
- %369 = OpLoad %v2float %main_loc2_Input None
- %370 = OpLoad %v2float %main_loc5_Input None
- %371 = OpLoad %v2float %main_loc4_Input None
- %372 = OpLoad %v2float %main_loc3_Input None
- %373 = OpLoad %v3float %main_loc0_Input None
- %374 = OpLoad %v2float %main_loc1_Input None
- %375 = OpFunctionCall %main_out %main_inner %369 %370 %371 %372 %373 %374
- %376 = OpCompositeExtract %v4float %375 0
- OpStore %main_loc0_Output %376 None
+ %409 = OpLabel
+ %410 = OpLoad %v2float %main_loc2_Input None
+ %411 = OpLoad %v2float %main_loc5_Input None
+ %412 = OpLoad %v2float %main_loc4_Input None
+ %413 = OpLoad %v2float %main_loc3_Input None
+ %414 = OpLoad %v3float %main_loc0_Input None
+ %415 = OpLoad %v2float %main_loc1_Input None
+ %416 = OpFunctionCall %main_out %main_inner %410 %411 %412 %413 %414 %415
+ %417 = OpCompositeExtract %v4float %416 0
+ OpStore %main_loc0_Output %417 None
OpReturn
OpFunctionEnd
diff --git a/test/tint/bug/tint/949.wgsl.expected.spvasm b/test/tint/bug/tint/949.wgsl.expected.spvasm
index d837ce4..53bf367 100644
--- a/test/tint/bug/tint/949.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/949.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 623
+; Bound: 647
; Schema: 0
OpCapability Shader
%85 = OpExtInstImport "GLSL.std.450"
@@ -253,6 +253,7 @@
OpName %x_365 "x_365"
OpName %x_366 "x_366"
OpName %x_374 "x_374"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %x_388 "x_388"
OpName %x_394 "x_394"
OpName %x_395 "x_395"
@@ -278,6 +279,8 @@
OpName %x_436 "x_436"
OpName %x_438 "x_438"
OpName %x_440 "x_440"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %x_441 "x_441"
OpName %x_444 "x_444"
OpName %x_445 "x_445"
@@ -471,12 +474,19 @@
%float_n11 = OpConstant %float -11
%float_15 = OpConstant %float 15
%int_0 = OpConstant %int 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %457 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %460 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %v2bool = OpTypeVector %bool 2
%int_15 = OpConstant %int 15
+%_ptr_Function_uint = OpTypePointer Function %uint
%int_1 = OpConstant %int 1
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%uint_3 = OpConstant %uint 3
%main_out = OpTypeStruct %v4float
- %609 = OpTypeFunction %main_out %v2float %v4float %bool %v2float %v4float
+ %633 = OpTypeFunction %main_out %v2float %v4float %bool %v2float %v4float
%cotangent_frame_vf3_vf3_vf2_vf2_ = OpFunction %mat3v3float None %62
%normal_1_root = OpFunctionParameter %_ptr_Function_v3float
%p_root = OpFunctionParameter %_ptr_Function_v3float
@@ -769,6 +779,7 @@
%diffuseOutput = OpVariable %_ptr_Function_v3float Function %8
%specularOutput = OpVariable %_ptr_Function_v3float Function %8
%output3 = OpVariable %_ptr_Function_v3float Function %8
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %457
OpStore %u_Float %float_100 None
OpStore %u_Color %341 None
%x_261 = OpLoad %v2float %vMainuv None
@@ -899,235 +910,257 @@
OpStore %lastSampledHeight %float_1 None
OpStore %currSampledHeight %float_1 None
OpStore %i %int_0 None
- OpBranch %451
- %451 = OpLabel
- OpLoopMerge %452 %450 None
OpBranch %449
%449 = OpLabel
- %x_388 = OpLoad %int %i None
- %454 = OpSLessThan %bool %x_388 %int_15
- OpSelectionMerge %456 None
- OpBranchConditional %454 %456 %457
- %457 = OpLabel
OpBranch %452
- %456 = OpLabel
+ %452 = OpLabel
+ OpLoopMerge %453 %451 None
+ OpBranch %450
+ %450 = OpLabel
+ %458 = OpLoad %v2uint %tint_loop_idx None
+ %459 = OpIEqual %v2bool %458 %460
+ %463 = OpAll %bool %459
+ OpSelectionMerge %464 None
+ OpBranchConditional %463 %465 %464
+ %465 = OpLabel
+ OpBranch %453
+ %464 = OpLabel
+ %x_388 = OpLoad %int %i None
+ %467 = OpSLessThan %bool %x_388 %int_15
+ OpSelectionMerge %469 None
+ OpBranchConditional %467 %469 %470
+ %470 = OpLabel
+ OpBranch %453
+ %469 = OpLabel
%x_394 = OpLoad %v2float %v_uv None
%x_395 = OpLoad %v2float %vCurrOffset None
- %460 = OpCompositeExtract %float %x_397 3
- OpStore %currSampledHeight %460 None
+ %473 = OpCompositeExtract %float %x_397 3
+ OpStore %currSampledHeight %473 None
%x_400 = OpLoad %float %currSampledHeight None
%x_401 = OpLoad %float %currRayHeight None
- %463 = OpFOrdGreaterThan %bool %x_400 %x_401
- OpSelectionMerge %464 None
- OpBranchConditional %463 %465 %466
- %465 = OpLabel
+ %476 = OpFOrdGreaterThan %bool %x_400 %x_401
+ OpSelectionMerge %477 None
+ OpBranchConditional %476 %478 %479
+ %478 = OpLabel
%x_406 = OpLoad %float %currSampledHeight None
%x_407 = OpLoad %float %currRayHeight None
- %469 = OpFSub %float %x_406 %x_407
- OpStore %delta1 %469 None
+ %482 = OpFSub %float %x_406 %x_407
+ OpStore %delta1 %482 None
%x_410 = OpLoad %float %currRayHeight None
%x_411 = OpLoad %float %stepSize None
%x_413 = OpLoad %float %lastSampledHeight None
- %473 = OpFAdd %float %x_410 %x_411
- %474 = OpFSub %float %473 %x_413
- OpStore %delta2 %474 None
+ %486 = OpFAdd %float %x_410 %x_411
+ %487 = OpFSub %float %486 %x_413
+ OpStore %delta2 %487 None
%x_416 = OpLoad %float %delta1 None
%x_417 = OpLoad %float %delta1 None
%x_418 = OpLoad %float %delta2 None
- %478 = OpFAdd %float %x_417 %x_418
- %479 = OpFDiv %float %x_416 %478
- OpStore %ratio %479 None
+ %491 = OpFAdd %float %x_417 %x_418
+ %492 = OpFDiv %float %x_416 %491
+ OpStore %ratio %492 None
%x_421 = OpLoad %float %ratio None
%x_422 = OpLoad %v2float %vLastOffset None
%x_424 = OpLoad %float %ratio None
%x_426 = OpLoad %v2float %vCurrOffset None
- %484 = OpVectorTimesScalar %v2float %x_422 %x_421
- %485 = OpFSub %float %float_1 %x_424
- %486 = OpVectorTimesScalar %v2float %x_426 %485
- %487 = OpFAdd %v2float %484 %486
- OpStore %vCurrOffset %487 None
- OpBranch %452
- %466 = OpLabel
+ %497 = OpVectorTimesScalar %v2float %x_422 %x_421
+ %498 = OpFSub %float %float_1 %x_424
+ %499 = OpVectorTimesScalar %v2float %x_426 %498
+ %500 = OpFAdd %v2float %497 %499
+ OpStore %vCurrOffset %500 None
+ OpBranch %453
+ %479 = OpLabel
%x_431 = OpLoad %float %stepSize None
%x_432 = OpLoad %float %currRayHeight None
- %490 = OpFSub %float %x_432 %x_431
- OpStore %currRayHeight %490 None
+ %503 = OpFSub %float %x_432 %x_431
+ OpStore %currRayHeight %503 None
%x_434 = OpLoad %v2float %vCurrOffset None
OpStore %vLastOffset %x_434 None
%x_435 = OpLoad %float %stepSize None
%x_436 = OpLoad %v2float %vMaxOffset None
%x_438 = OpLoad %v2float %vCurrOffset None
- %495 = OpVectorTimesScalar %v2float %x_436 %x_435
- %496 = OpFAdd %v2float %x_438 %495
- OpStore %vCurrOffset %496 None
+ %508 = OpVectorTimesScalar %v2float %x_436 %x_435
+ %509 = OpFAdd %v2float %x_438 %508
+ OpStore %vCurrOffset %509 None
%x_440 = OpLoad %float %currSampledHeight None
OpStore %lastSampledHeight %x_440 None
- OpBranch %464
- %464 = OpLabel
- OpBranch %450
- %450 = OpLabel
- %x_441 = OpLoad %int %i None
- %499 = OpIAdd %int %x_441 %int_1
- OpStore %i %499 None
+ OpBranch %477
+ %477 = OpLabel
OpBranch %451
- %452 = OpLabel
+ %451 = OpLabel
+ %511 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %513 = OpLoad %uint %511 None
+%tint_low_inc = OpIAdd %uint %513 %uint_1
+ %515 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %515 %tint_low_inc None
+ %516 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %516 %uint_1 %uint_0
+ %518 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %519 = OpLoad %uint %518 None
+ %520 = OpIAdd %uint %519 %tint_carry
+ %521 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %521 %520 None
+ %x_441 = OpLoad %int %i None
+ %523 = OpIAdd %int %x_441 %int_1
+ OpStore %i %523 None
+ OpBranch %452
+ %453 = OpLabel
%x_444 = OpLoad %v2float %vCurrOffset None
OpStore %parallaxOcclusion_0 %x_444 None
%x_445 = OpLoad %v2float %parallaxOcclusion_0 None
OpStore %uvOffset %x_445 None
%x_449 = OpLoad %v2float %v_uv None
%x_450 = OpLoad %v2float %uvOffset None
- %505 = OpLoad %11 %TextureSamplerTexture None
- %506 = OpLoad %14 %TextureSamplerSampler None
- %507 = OpFAdd %v2float %x_449 %x_450
- %508 = OpSampledImage %346 %505 %506
- %x_452 = OpImageSampleImplicitLod %v4float %508 %507 None
- %510 = OpAccessChain %_ptr_Uniform_float %19 %uint_0 %uint_2
- %x_454 = OpLoad %float %510 None
+ %529 = OpLoad %11 %TextureSamplerTexture None
+ %530 = OpLoad %14 %TextureSamplerSampler None
+ %531 = OpFAdd %v2float %x_449 %x_450
+ %532 = OpSampledImage %346 %529 %530
+ %x_452 = OpImageSampleImplicitLod %v4float %532 %531 None
+ %534 = OpAccessChain %_ptr_Uniform_float %19 %uint_0 %uint_2
+ %x_454 = OpLoad %float %534 None
%x_457 = OpLoad %mat3v3float %TBN None
OpStore %param_8 %x_457 None
- %513 = OpCompositeExtract %float %x_452 0
- %514 = OpCompositeExtract %float %x_452 1
- %515 = OpCompositeExtract %float %x_452 2
- %516 = OpCompositeConstruct %v3float %513 %514 %515
- OpStore %param_9 %516 None
- %517 = OpFDiv %float %float_1 %x_454
- OpStore %param_10 %517 None
+ %537 = OpCompositeExtract %float %x_452 0
+ %538 = OpCompositeExtract %float %x_452 1
+ %539 = OpCompositeExtract %float %x_452 2
+ %540 = OpCompositeConstruct %v3float %537 %538 %539
+ OpStore %param_9 %540 None
+ %541 = OpFDiv %float %float_1 %x_454
+ OpStore %param_10 %541 None
%x_461 = OpFunctionCall %v3float %perturbNormal_mf33_vf3_f1_ %param_8 %param_9 %param_10
%x_462 = OpLoad %v4float %output4 None
- %520 = OpCompositeExtract %float %x_461 0
- %521 = OpCompositeExtract %float %x_461 1
- %522 = OpCompositeExtract %float %x_461 2
- %523 = OpCompositeExtract %float %x_462 3
- %524 = OpCompositeConstruct %v4float %520 %521 %522 %523
- OpStore %output4 %524 None
+ %544 = OpCompositeExtract %float %x_461 0
+ %545 = OpCompositeExtract %float %x_461 1
+ %546 = OpCompositeExtract %float %x_461 2
+ %547 = OpCompositeExtract %float %x_462 3
+ %548 = OpCompositeConstruct %v4float %544 %545 %546 %547
+ OpStore %output4 %548 None
%x_465 = OpLoad %v2float %v_uv None
%x_466 = OpLoad %v2float %uvOffset None
- %527 = OpFAdd %v2float %x_465 %x_466
- OpStore %output6 %527 None
+ %551 = OpFAdd %v2float %x_465 %x_466
+ OpStore %output6 %551 None
%x_474 = OpLoad %v2float %output6 None
- %529 = OpLoad %11 %TextureSampler1Texture None
- %530 = OpLoad %14 %TextureSampler1Sampler None
- %531 = OpSampledImage %346 %529 %530
- %x_475 = OpImageSampleImplicitLod %v4float %531 %x_474 None
+ %553 = OpLoad %11 %TextureSampler1Texture None
+ %554 = OpLoad %14 %TextureSampler1Sampler None
+ %555 = OpSampledImage %346 %553 %554
+ %x_475 = OpImageSampleImplicitLod %v4float %555 %x_474 None
OpStore %tempTextureRead1 %x_475 None
%x_477 = OpLoad %v4float %tempTextureRead1 None
- %534 = OpCompositeExtract %float %x_477 0
- %535 = OpCompositeExtract %float %x_477 1
- %536 = OpCompositeExtract %float %x_477 2
- %537 = OpCompositeConstruct %v3float %534 %535 %536
- OpStore %rgb1 %537 None
- %538 = OpAccessChain %_ptr_Uniform_v3float %19 %uint_0 %uint_4
- %x_481 = OpLoad %v3float %538 None
+ %558 = OpCompositeExtract %float %x_477 0
+ %559 = OpCompositeExtract %float %x_477 1
+ %560 = OpCompositeExtract %float %x_477 2
+ %561 = OpCompositeConstruct %v3float %558 %559 %560
+ OpStore %rgb1 %561 None
+ %562 = OpAccessChain %_ptr_Uniform_v3float %19 %uint_0 %uint_4
+ %x_481 = OpLoad %v3float %562 None
%x_482 = OpLoad %v4float %v_output1 None
- %541 = OpCompositeExtract %float %x_482 0
- %542 = OpCompositeExtract %float %x_482 1
- %543 = OpCompositeExtract %float %x_482 2
- %544 = OpCompositeConstruct %v3float %541 %542 %543
- %545 = OpFSub %v3float %x_481 %544
- %546 = OpExtInst %v3float %85 Normalize %545
- OpStore %viewDirectionW_1 %546 None
+ %565 = OpCompositeExtract %float %x_482 0
+ %566 = OpCompositeExtract %float %x_482 1
+ %567 = OpCompositeExtract %float %x_482 2
+ %568 = OpCompositeConstruct %v3float %565 %566 %567
+ %569 = OpFSub %v3float %x_481 %568
+ %570 = OpExtInst %v3float %85 Normalize %569
+ OpStore %viewDirectionW_1 %570 None
OpStore %shadow %float_1 None
%x_488 = OpLoad %float %u_Float None
- %548 = OpFMul %float %float_1 %x_488
- OpStore %glossiness_1 %548 None
+ %572 = OpFMul %float %float_1 %x_488
+ OpStore %glossiness_1 %572 None
OpStore %diffuseBase %8 None
OpStore %specularBase %8 None
%x_494 = OpLoad %v4float %output4 None
- %550 = OpCompositeExtract %float %x_494 0
- %551 = OpCompositeExtract %float %x_494 1
- %552 = OpCompositeExtract %float %x_494 2
- %553 = OpCompositeConstruct %v3float %550 %551 %552
- OpStore %normalW %553 None
+ %574 = OpCompositeExtract %float %x_494 0
+ %575 = OpCompositeExtract %float %x_494 1
+ %576 = OpCompositeExtract %float %x_494 2
+ %577 = OpCompositeConstruct %v3float %574 %575 %576
+ OpStore %normalW %577 None
%x_501 = OpLoad %v3float %viewDirectionW_1 None
OpStore %param_11 %x_501 None
%x_503 = OpLoad %v3float %normalW None
OpStore %param_12 %x_503 None
- %556 = OpAccessChain %_ptr_Uniform_v4float %37 %uint_0 %uint_0
- %x_507 = OpLoad %v4float %556 None
+ %580 = OpAccessChain %_ptr_Uniform_v4float %37 %uint_0 %uint_0
+ %x_507 = OpLoad %v4float %580 None
OpStore %param_13 %x_507 None
- %559 = OpAccessChain %_ptr_Uniform_v4float %37 %uint_0 %uint_1
- %x_510 = OpLoad %v4float %559 None
- %561 = OpCompositeExtract %float %x_510 0
- %562 = OpCompositeExtract %float %x_510 1
- %563 = OpCompositeExtract %float %x_510 2
- %564 = OpCompositeConstruct %v3float %561 %562 %563
- OpStore %param_14 %564 None
- %565 = OpAccessChain %_ptr_Uniform_v4float %37 %uint_0 %uint_2
- %x_514 = OpLoad %v4float %565 None
- %567 = OpCompositeExtract %float %x_514 0
- %568 = OpCompositeExtract %float %x_514 1
- %569 = OpCompositeExtract %float %x_514 2
- %570 = OpCompositeConstruct %v3float %567 %568 %569
- OpStore %param_15 %570 None
- %571 = OpAccessChain %_ptr_Uniform_v3float %37 %uint_0 %uint_3
- %x_518 = OpLoad %v3float %571 None
+ %583 = OpAccessChain %_ptr_Uniform_v4float %37 %uint_0 %uint_1
+ %x_510 = OpLoad %v4float %583 None
+ %585 = OpCompositeExtract %float %x_510 0
+ %586 = OpCompositeExtract %float %x_510 1
+ %587 = OpCompositeExtract %float %x_510 2
+ %588 = OpCompositeConstruct %v3float %585 %586 %587
+ OpStore %param_14 %588 None
+ %589 = OpAccessChain %_ptr_Uniform_v4float %37 %uint_0 %uint_2
+ %x_514 = OpLoad %v4float %589 None
+ %591 = OpCompositeExtract %float %x_514 0
+ %592 = OpCompositeExtract %float %x_514 1
+ %593 = OpCompositeExtract %float %x_514 2
+ %594 = OpCompositeConstruct %v3float %591 %592 %593
+ OpStore %param_15 %594 None
+ %595 = OpAccessChain %_ptr_Uniform_v3float %37 %uint_0 %uint_3
+ %x_518 = OpLoad %v3float %595 None
OpStore %param_16 %x_518 None
%x_520 = OpLoad %float %glossiness_1 None
OpStore %param_17 %x_520 None
%x_521 = OpFunctionCall %lightingInfo %computeHemisphericLighting_vf3_vf3_vf4_vf3_vf3_vf3_f1_ %param_11 %param_12 %param_13 %param_14 %param_15 %param_16 %param_17
OpStore %info %x_521 None
OpStore %shadow %float_1 None
- %576 = OpAccessChain %_ptr_Function_v3float %info %uint_0
- %x_523 = OpLoad %v3float %576 None
+ %600 = OpAccessChain %_ptr_Function_v3float %info %uint_0
+ %x_523 = OpLoad %v3float %600 None
%x_524 = OpLoad %float %shadow None
%x_526 = OpLoad %v3float %diffuseBase None
- %580 = OpVectorTimesScalar %v3float %x_523 %x_524
- %581 = OpFAdd %v3float %x_526 %580
- OpStore %diffuseBase %581 None
- %582 = OpAccessChain %_ptr_Function_v3float %info %uint_1
- %x_529 = OpLoad %v3float %582 None
+ %604 = OpVectorTimesScalar %v3float %x_523 %x_524
+ %605 = OpFAdd %v3float %x_526 %604
+ OpStore %diffuseBase %605 None
+ %606 = OpAccessChain %_ptr_Function_v3float %info %uint_1
+ %x_529 = OpLoad %v3float %606 None
%x_530 = OpLoad %float %shadow None
%x_532 = OpLoad %v3float %specularBase None
- %586 = OpVectorTimesScalar %v3float %x_529 %x_530
- %587 = OpFAdd %v3float %x_532 %586
- OpStore %specularBase %587 None
+ %610 = OpVectorTimesScalar %v3float %x_529 %x_530
+ %611 = OpFAdd %v3float %x_532 %610
+ OpStore %specularBase %611 None
%x_535 = OpLoad %v3float %diffuseBase None
%x_536 = OpLoad %v3float %rgb1 None
- %590 = OpFMul %v3float %x_535 %x_536
- OpStore %diffuseOutput %590 None
+ %614 = OpFMul %v3float %x_535 %x_536
+ OpStore %diffuseOutput %614 None
%x_539 = OpLoad %v3float %specularBase None
%x_540 = OpLoad %v3float %u_Color None
- %593 = OpFMul %v3float %x_539 %x_540
- OpStore %specularOutput %593 None
+ %617 = OpFMul %v3float %x_539 %x_540
+ OpStore %specularOutput %617 None
%x_543 = OpLoad %v3float %diffuseOutput None
%x_544 = OpLoad %v3float %specularOutput None
- %596 = OpFAdd %v3float %x_543 %x_544
- OpStore %output3 %596 None
+ %620 = OpFAdd %v3float %x_543 %x_544
+ OpStore %output3 %620 None
%x_548 = OpLoad %v3float %output3 None
- %598 = OpCompositeExtract %float %x_548 0
- %599 = OpCompositeExtract %float %x_548 1
- %600 = OpCompositeExtract %float %x_548 2
- %601 = OpCompositeConstruct %v4float %598 %599 %600 %float_1
- OpStore %glFragColor %601 None
+ %622 = OpCompositeExtract %float %x_548 0
+ %623 = OpCompositeExtract %float %x_548 1
+ %624 = OpCompositeExtract %float %x_548 2
+ %625 = OpCompositeConstruct %v4float %622 %623 %624 %float_1
+ OpStore %glFragColor %625 None
OpReturn
OpFunctionEnd
- %main_inner = OpFunction %main_out None %609
+ %main_inner = OpFunction %main_out None %633
%vMainuv_param = OpFunctionParameter %v2float
%v_output1_param = OpFunctionParameter %v4float
%gl_FrontFacing_param = OpFunctionParameter %bool
%v_uv_param = OpFunctionParameter %v2float
%v_output2_param = OpFunctionParameter %v4float
- %610 = OpLabel
+ %634 = OpLabel
OpStore %vMainuv %vMainuv_param None
OpStore %v_output1 %v_output1_param None
OpStore %gl_FrontFacing %gl_FrontFacing_param None
OpStore %v_uv %v_uv_param None
OpStore %v_output2 %v_output2_param None
- %611 = OpFunctionCall %void %main_1
- %612 = OpLoad %v4float %glFragColor None
- %613 = OpCompositeConstruct %main_out %612
- OpReturnValue %613
+ %635 = OpFunctionCall %void %main_1
+ %636 = OpLoad %v4float %glFragColor None
+ %637 = OpCompositeConstruct %main_out %636
+ OpReturnValue %637
OpFunctionEnd
%main = OpFunction %void None %282
- %615 = OpLabel
- %616 = OpLoad %v2float %main_loc1_Input None
- %617 = OpLoad %v4float %main_loc0_Input None
- %618 = OpLoad %bool %main_front_facing_Input None
- %619 = OpLoad %v2float %main_loc3_Input None
- %620 = OpLoad %v4float %main_loc2_Input None
- %621 = OpFunctionCall %main_out %main_inner %616 %617 %618 %619 %620
- %622 = OpCompositeExtract %v4float %621 0
- OpStore %main_loc0_Output %622 None
+ %639 = OpLabel
+ %640 = OpLoad %v2float %main_loc1_Input None
+ %641 = OpLoad %v4float %main_loc0_Input None
+ %642 = OpLoad %bool %main_front_facing_Input None
+ %643 = OpLoad %v2float %main_loc3_Input None
+ %644 = OpLoad %v4float %main_loc2_Input None
+ %645 = OpFunctionCall %main_out %main_inner %640 %641 %642 %643 %644
+ %646 = OpCompositeExtract %v4float %645 0
+ OpStore %main_loc0_Output %646 None
OpReturn
OpFunctionEnd
diff --git a/test/tint/bug/tint/990.wgsl.expected.spvasm b/test/tint/bug/tint/990.wgsl.expected.spvasm
index 9e14d19..b814cf9 100644
--- a/test/tint/bug/tint/990.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/990.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 20
+; Bound: 46
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -9,18 +9,32 @@
OpExecutionMode %unused_entry_point LocalSize 1 1 1
OpName %f "f"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %i "p"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%void = OpTypeVoid
%3 = OpTypeFunction %void
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%8 = OpConstantNull %int
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %18 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%false = OpConstantFalse %bool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%f = OpFunction %void None %3
%4 = OpLabel
%i = OpVariable %_ptr_Function_int Function %8
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %18
OpBranch %9
%9 = OpLabel
OpBranch %12
@@ -28,18 +42,38 @@
OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
- OpSelectionMerge %14 None
- OpBranchConditional %false %14 %15
- %15 = OpLabel
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
+ %27 = OpLabel
OpBranch %13
- %14 = OpLabel
+ %26 = OpLabel
+ OpSelectionMerge %28 None
+ OpBranchConditional %false %28 %29
+ %29 = OpLabel
+ OpBranch %13
+ %28 = OpLabel
OpBranch %11
%11 = OpLabel
+ %31 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %34 = OpLoad %uint %31 None
+%tint_low_inc = OpIAdd %uint %34 %uint_1
+ %37 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %37 %tint_low_inc None
+ %38 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %38 %uint_1 %uint_0
+ %40 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %41 = OpLoad %uint %40 None
+ %42 = OpIAdd %uint %41 %tint_carry
+ %43 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %43 %42 None
OpBranch %12
%13 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %3
- %19 = OpLabel
+ %45 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.spvasm b/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.spvasm
index c2a94e8..4b3f7d7 100644
--- a/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.spvasm
+++ b/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.spvasm
@@ -1,10 +1,10 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 98
+; Bound: 121
; Schema: 0
OpCapability Shader
- %43 = OpExtInstImport "GLSL.std.450"
+ %56 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %compute_main "compute_main" %compute_main_local_invocation_index_Input
OpExecutionMode %compute_main LocalSize 1 1 1
@@ -14,9 +14,12 @@
OpName %compute_main_inner "compute_main_inner"
OpName %local_invocation_index_2 "local_invocation_index_2"
OpName %idx "idx"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %x_31 "x_31"
OpName %x_33 "x_33"
OpName %x_35 "x_35"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %compute_main_1 "compute_main_1"
OpName %x_57 "x_57"
OpName %compute_main_inner_0 "compute_main_inner"
@@ -50,114 +53,143 @@
%18 = OpTypeFunction %void %uint
%_ptr_Function_uint = OpTypePointer Function %uint
%uint_0 = OpConstant %uint 0
- %uint_6 = OpConstant %uint 6
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %31 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %34 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %uint_6 = OpConstant %uint 6
%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint
%uint_264 = OpConstant %uint 264
- %56 = OpTypeFunction %void
- %81 = OpTypeFunction %uint %uint %uint
+ %79 = OpTypeFunction %void
+ %104 = OpTypeFunction %uint %uint %uint
%compute_main_inner = OpFunction %void None %18
%local_invocation_index_2 = OpFunctionParameter %uint
%19 = OpLabel
%idx = OpVariable %_ptr_Function_uint Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %31
OpStore %idx %uint_0
OpStore %idx %local_invocation_index_2 None
- OpBranch %25
- %25 = OpLabel
- OpLoopMerge %26 %24 None
OpBranch %23
%23 = OpLabel
- %27 = OpLoad %uint %idx None
- %28 = OpULessThan %bool %27 %uint_6
- %31 = OpLogicalNot %bool %28
- OpSelectionMerge %32 None
- OpBranchConditional %31 %33 %32
- %33 = OpLabel
OpBranch %26
- %32 = OpLabel
+ %26 = OpLabel
+ OpLoopMerge %27 %25 None
+ OpBranch %24
+ %24 = OpLabel
+ %32 = OpLoad %v2uint %tint_loop_idx None
+ %33 = OpIEqual %v2bool %32 %34
+ %38 = OpAll %bool %33
+ OpSelectionMerge %39 None
+ OpBranchConditional %38 %40 %39
+ %40 = OpLabel
+ OpBranch %27
+ %39 = OpLabel
+ %41 = OpLoad %uint %idx None
+ %42 = OpULessThan %bool %41 %uint_6
+ %44 = OpLogicalNot %bool %42
+ OpSelectionMerge %45 None
+ OpBranchConditional %44 %46 %45
+ %46 = OpLabel
+ OpBranch %27
+ %45 = OpLabel
%x_31 = OpLoad %uint %idx None
%x_33 = OpLoad %uint %idx None
%x_35 = OpLoad %uint %idx None
- %37 = OpFunctionCall %uint %tint_div_u32 %x_31 %uint_2
- %39 = OpFunctionCall %uint %tint_mod_u32 %x_33 %uint_2
- %41 = OpFunctionCall %uint %tint_mod_u32 %x_35 %uint_1
- %42 = OpExtInst %uint %43 UMin %37 %uint_2
- %44 = OpExtInst %uint %43 UMin %39 %uint_1
- %45 = OpExtInst %uint %43 UMin %41 %uint_0
- %46 = OpAccessChain %_ptr_Workgroup_uint %wg %42 %44 %45
- OpAtomicStore %46 %uint_2 %uint_0 %uint_0
- OpBranch %24
- %24 = OpLabel
- %49 = OpLoad %uint %idx None
- %50 = OpIAdd %uint %49 %uint_1
- OpStore %idx %50 None
+ %50 = OpFunctionCall %uint %tint_div_u32 %x_31 %uint_2
+ %52 = OpFunctionCall %uint %tint_mod_u32 %x_33 %uint_2
+ %54 = OpFunctionCall %uint %tint_mod_u32 %x_35 %uint_1
+ %55 = OpExtInst %uint %56 UMin %50 %uint_2
+ %57 = OpExtInst %uint %56 UMin %52 %uint_1
+ %58 = OpExtInst %uint %56 UMin %54 %uint_0
+ %59 = OpAccessChain %_ptr_Workgroup_uint %wg %55 %57 %58
+ OpAtomicStore %59 %uint_2 %uint_0 %uint_0
OpBranch %25
- %26 = OpLabel
+ %25 = OpLabel
+ %62 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %63 = OpLoad %uint %62 None
+%tint_low_inc = OpIAdd %uint %63 %uint_1
+ %65 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %65 %tint_low_inc None
+ %66 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %66 %uint_1 %uint_0
+ %68 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %69 = OpLoad %uint %68 None
+ %70 = OpIAdd %uint %69 %tint_carry
+ %71 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %71 %70 None
+ %72 = OpLoad %uint %idx None
+ %73 = OpIAdd %uint %72 %uint_1
+ OpStore %idx %73 None
+ OpBranch %26
+ %27 = OpLabel
OpControlBarrier %uint_2 %uint_2 %uint_264
- %53 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_2 %uint_1 %uint_0
- OpAtomicStore %53 %uint_2 %uint_0 %uint_1
+ %76 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_2 %uint_1 %uint_0
+ OpAtomicStore %76 %uint_2 %uint_0 %uint_1
OpReturn
OpFunctionEnd
-%compute_main_1 = OpFunction %void None %56
- %57 = OpLabel
+%compute_main_1 = OpFunction %void None %79
+ %80 = OpLabel
%x_57 = OpLoad %uint %local_invocation_index_1 None
- %59 = OpFunctionCall %void %compute_main_inner %x_57
+ %82 = OpFunctionCall %void %compute_main_inner %x_57
OpReturn
OpFunctionEnd
%compute_main_inner_0 = OpFunction %void None %18
%local_invocation_index_1_param = OpFunctionParameter %uint
- %62 = OpLabel
- OpBranch %63
- %63 = OpLabel
- OpBranch %66
- %66 = OpLabel
- %68 = OpPhi %uint %local_invocation_index_1_param %63 %69 %65
- OpLoopMerge %67 %65 None
- OpBranch %64
- %64 = OpLabel
- %70 = OpUGreaterThanEqual %bool %68 %uint_6
- OpSelectionMerge %71 None
- OpBranchConditional %70 %72 %71
- %72 = OpLabel
- OpBranch %67
- %71 = OpLabel
- %73 = OpUMod %uint %68 %uint_2
- %74 = OpUDiv %uint %68 %uint_2
- %75 = OpAccessChain %_ptr_Workgroup_uint %wg %74 %73 %uint_0
- OpAtomicStore %75 %uint_2 %uint_0 %uint_0
- OpBranch %65
- %65 = OpLabel
- %69 = OpIAdd %uint %68 %uint_1
- OpBranch %66
- %67 = OpLabel
+ %85 = OpLabel
+ OpBranch %86
+ %86 = OpLabel
+ OpBranch %89
+ %89 = OpLabel
+ %91 = OpPhi %uint %local_invocation_index_1_param %86 %92 %88
+ OpLoopMerge %90 %88 None
+ OpBranch %87
+ %87 = OpLabel
+ %93 = OpUGreaterThanEqual %bool %91 %uint_6
+ OpSelectionMerge %94 None
+ OpBranchConditional %93 %95 %94
+ %95 = OpLabel
+ OpBranch %90
+ %94 = OpLabel
+ %96 = OpUMod %uint %91 %uint_2
+ %97 = OpUDiv %uint %91 %uint_2
+ %98 = OpAccessChain %_ptr_Workgroup_uint %wg %97 %96 %uint_0
+ OpAtomicStore %98 %uint_2 %uint_0 %uint_0
+ OpBranch %88
+ %88 = OpLabel
+ %92 = OpIAdd %uint %91 %uint_1
+ OpBranch %89
+ %90 = OpLabel
OpControlBarrier %uint_2 %uint_2 %uint_264
OpStore %local_invocation_index_1 %local_invocation_index_1_param None
- %78 = OpFunctionCall %void %compute_main_1
+ %101 = OpFunctionCall %void %compute_main_1
OpReturn
OpFunctionEnd
-%tint_div_u32 = OpFunction %uint None %81
+%tint_div_u32 = OpFunction %uint None %104
%lhs = OpFunctionParameter %uint
%rhs = OpFunctionParameter %uint
- %82 = OpLabel
- %83 = OpIEqual %bool %rhs %uint_0
- %84 = OpSelect %uint %83 %uint_1 %rhs
- %85 = OpUDiv %uint %lhs %84
- OpReturnValue %85
+ %105 = OpLabel
+ %106 = OpIEqual %bool %rhs %uint_0
+ %107 = OpSelect %uint %106 %uint_1 %rhs
+ %108 = OpUDiv %uint %lhs %107
+ OpReturnValue %108
OpFunctionEnd
-%tint_mod_u32 = OpFunction %uint None %81
+%tint_mod_u32 = OpFunction %uint None %104
%lhs_0 = OpFunctionParameter %uint
%rhs_0 = OpFunctionParameter %uint
- %88 = OpLabel
- %89 = OpIEqual %bool %rhs_0 %uint_0
- %90 = OpSelect %uint %89 %uint_1 %rhs_0
- %91 = OpUDiv %uint %lhs_0 %90
- %92 = OpIMul %uint %91 %90
- %93 = OpISub %uint %lhs_0 %92
- OpReturnValue %93
+ %111 = OpLabel
+ %112 = OpIEqual %bool %rhs_0 %uint_0
+ %113 = OpSelect %uint %112 %uint_1 %rhs_0
+ %114 = OpUDiv %uint %lhs_0 %113
+ %115 = OpIMul %uint %114 %113
+ %116 = OpISub %uint %lhs_0 %115
+ OpReturnValue %116
OpFunctionEnd
-%compute_main = OpFunction %void None %56
- %95 = OpLabel
- %96 = OpLoad %uint %compute_main_local_invocation_index_Input None
- %97 = OpFunctionCall %void %compute_main_inner_0 %96
+%compute_main = OpFunction %void None %79
+ %118 = OpLabel
+ %119 = OpLoad %uint %compute_main_local_invocation_index_Input None
+ %120 = OpFunctionCall %void %compute_main_inner_0 %119
OpReturn
OpFunctionEnd
diff --git a/test/tint/builtins/atomicStore/array/array.spvasm.expected.spvasm b/test/tint/builtins/atomicStore/array/array.spvasm.expected.spvasm
index ec2dc67..4511944 100644
--- a/test/tint/builtins/atomicStore/array/array.spvasm.expected.spvasm
+++ b/test/tint/builtins/atomicStore/array/array.spvasm.expected.spvasm
@@ -1,10 +1,10 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 70
+; Bound: 93
; Schema: 0
OpCapability Shader
- %31 = OpExtInstImport "GLSL.std.450"
+ %44 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %compute_main "compute_main" %compute_main_local_invocation_index_Input
OpExecutionMode %compute_main LocalSize 1 1 1
@@ -14,7 +14,10 @@
OpName %compute_main_inner "compute_main_inner"
OpName %local_invocation_index_2 "local_invocation_index_2"
OpName %idx "idx"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %x_26 "x_26"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %compute_main_1 "compute_main_1"
OpName %x_47 "x_47"
OpName %compute_main_inner_0 "compute_main_inner"
@@ -36,86 +39,115 @@
%14 = OpTypeFunction %void %uint
%_ptr_Function_uint = OpTypePointer Function %uint
%uint_0 = OpConstant %uint 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %27 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %30 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%uint_3 = OpConstant %uint 3
%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint
%uint_2 = OpConstant %uint 2
%uint_1 = OpConstant %uint 1
%uint_264 = OpConstant %uint 264
- %45 = OpTypeFunction %void
+ %68 = OpTypeFunction %void
%compute_main_inner = OpFunction %void None %14
%local_invocation_index_2 = OpFunctionParameter %uint
%15 = OpLabel
%idx = OpVariable %_ptr_Function_uint Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %27
OpStore %idx %uint_0
OpStore %idx %local_invocation_index_2 None
- OpBranch %21
- %21 = OpLabel
- OpLoopMerge %22 %20 None
OpBranch %19
%19 = OpLabel
- %23 = OpLoad %uint %idx None
- %24 = OpULessThan %bool %23 %uint_4
- %26 = OpLogicalNot %bool %24
- OpSelectionMerge %27 None
- OpBranchConditional %26 %28 %27
- %28 = OpLabel
OpBranch %22
- %27 = OpLabel
- %x_26 = OpLoad %uint %idx None
- %30 = OpExtInst %uint %31 UMin %x_26 %uint_3
- %33 = OpAccessChain %_ptr_Workgroup_uint %wg %30
- OpAtomicStore %33 %uint_2 %uint_0 %uint_0
+ %22 = OpLabel
+ OpLoopMerge %23 %21 None
OpBranch %20
%20 = OpLabel
+ %28 = OpLoad %v2uint %tint_loop_idx None
+ %29 = OpIEqual %v2bool %28 %30
+ %34 = OpAll %bool %29
+ OpSelectionMerge %35 None
+ OpBranchConditional %34 %36 %35
+ %36 = OpLabel
+ OpBranch %23
+ %35 = OpLabel
%37 = OpLoad %uint %idx None
- %38 = OpIAdd %uint %37 %uint_1
- OpStore %idx %38 None
+ %38 = OpULessThan %bool %37 %uint_4
+ %39 = OpLogicalNot %bool %38
+ OpSelectionMerge %40 None
+ OpBranchConditional %39 %41 %40
+ %41 = OpLabel
+ OpBranch %23
+ %40 = OpLabel
+ %x_26 = OpLoad %uint %idx None
+ %43 = OpExtInst %uint %44 UMin %x_26 %uint_3
+ %46 = OpAccessChain %_ptr_Workgroup_uint %wg %43
+ OpAtomicStore %46 %uint_2 %uint_0 %uint_0
OpBranch %21
- %22 = OpLabel
+ %21 = OpLabel
+ %50 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %51 = OpLoad %uint %50 None
+%tint_low_inc = OpIAdd %uint %51 %uint_1
+ %54 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %54 %tint_low_inc None
+ %55 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %55 %uint_1 %uint_0
+ %57 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %58 = OpLoad %uint %57 None
+ %59 = OpIAdd %uint %58 %tint_carry
+ %60 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %60 %59 None
+ %61 = OpLoad %uint %idx None
+ %62 = OpIAdd %uint %61 %uint_1
+ OpStore %idx %62 None
+ OpBranch %22
+ %23 = OpLabel
OpControlBarrier %uint_2 %uint_2 %uint_264
- %42 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_1
- OpAtomicStore %42 %uint_2 %uint_0 %uint_1
+ %65 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_1
+ OpAtomicStore %65 %uint_2 %uint_0 %uint_1
OpReturn
OpFunctionEnd
-%compute_main_1 = OpFunction %void None %45
- %46 = OpLabel
+%compute_main_1 = OpFunction %void None %68
+ %69 = OpLabel
%x_47 = OpLoad %uint %local_invocation_index_1 None
- %48 = OpFunctionCall %void %compute_main_inner %x_47
+ %71 = OpFunctionCall %void %compute_main_inner %x_47
OpReturn
OpFunctionEnd
%compute_main_inner_0 = OpFunction %void None %14
%local_invocation_index_1_param = OpFunctionParameter %uint
- %51 = OpLabel
- OpBranch %52
- %52 = OpLabel
- OpBranch %55
- %55 = OpLabel
- %57 = OpPhi %uint %local_invocation_index_1_param %52 %58 %54
- OpLoopMerge %56 %54 None
- OpBranch %53
- %53 = OpLabel
- %59 = OpUGreaterThanEqual %bool %57 %uint_4
- OpSelectionMerge %60 None
- OpBranchConditional %59 %61 %60
- %61 = OpLabel
- OpBranch %56
- %60 = OpLabel
- %62 = OpAccessChain %_ptr_Workgroup_uint %wg %57
- OpAtomicStore %62 %uint_2 %uint_0 %uint_0
- OpBranch %54
- %54 = OpLabel
- %58 = OpIAdd %uint %57 %uint_1
- OpBranch %55
- %56 = OpLabel
+ %74 = OpLabel
+ OpBranch %75
+ %75 = OpLabel
+ OpBranch %78
+ %78 = OpLabel
+ %80 = OpPhi %uint %local_invocation_index_1_param %75 %81 %77
+ OpLoopMerge %79 %77 None
+ OpBranch %76
+ %76 = OpLabel
+ %82 = OpUGreaterThanEqual %bool %80 %uint_4
+ OpSelectionMerge %83 None
+ OpBranchConditional %82 %84 %83
+ %84 = OpLabel
+ OpBranch %79
+ %83 = OpLabel
+ %85 = OpAccessChain %_ptr_Workgroup_uint %wg %80
+ OpAtomicStore %85 %uint_2 %uint_0 %uint_0
+ OpBranch %77
+ %77 = OpLabel
+ %81 = OpIAdd %uint %80 %uint_1
+ OpBranch %78
+ %79 = OpLabel
OpControlBarrier %uint_2 %uint_2 %uint_264
OpStore %local_invocation_index_1 %local_invocation_index_1_param None
- %65 = OpFunctionCall %void %compute_main_1
+ %88 = OpFunctionCall %void %compute_main_1
OpReturn
OpFunctionEnd
-%compute_main = OpFunction %void None %45
- %67 = OpLabel
- %68 = OpLoad %uint %compute_main_local_invocation_index_Input None
- %69 = OpFunctionCall %void %compute_main_inner_0 %68
+%compute_main = OpFunction %void None %68
+ %90 = OpLabel
+ %91 = OpLoad %uint %compute_main_local_invocation_index_Input None
+ %92 = OpFunctionCall %void %compute_main_inner_0 %91
OpReturn
OpFunctionEnd
diff --git a/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.spvasm b/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.spvasm
index c2a94e8..4b3f7d7 100644
--- a/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.spvasm
+++ b/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.spvasm
@@ -1,10 +1,10 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 98
+; Bound: 121
; Schema: 0
OpCapability Shader
- %43 = OpExtInstImport "GLSL.std.450"
+ %56 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %compute_main "compute_main" %compute_main_local_invocation_index_Input
OpExecutionMode %compute_main LocalSize 1 1 1
@@ -14,9 +14,12 @@
OpName %compute_main_inner "compute_main_inner"
OpName %local_invocation_index_2 "local_invocation_index_2"
OpName %idx "idx"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %x_31 "x_31"
OpName %x_33 "x_33"
OpName %x_35 "x_35"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %compute_main_1 "compute_main_1"
OpName %x_57 "x_57"
OpName %compute_main_inner_0 "compute_main_inner"
@@ -50,114 +53,143 @@
%18 = OpTypeFunction %void %uint
%_ptr_Function_uint = OpTypePointer Function %uint
%uint_0 = OpConstant %uint 0
- %uint_6 = OpConstant %uint 6
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %31 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %34 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %uint_6 = OpConstant %uint 6
%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint
%uint_264 = OpConstant %uint 264
- %56 = OpTypeFunction %void
- %81 = OpTypeFunction %uint %uint %uint
+ %79 = OpTypeFunction %void
+ %104 = OpTypeFunction %uint %uint %uint
%compute_main_inner = OpFunction %void None %18
%local_invocation_index_2 = OpFunctionParameter %uint
%19 = OpLabel
%idx = OpVariable %_ptr_Function_uint Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %31
OpStore %idx %uint_0
OpStore %idx %local_invocation_index_2 None
- OpBranch %25
- %25 = OpLabel
- OpLoopMerge %26 %24 None
OpBranch %23
%23 = OpLabel
- %27 = OpLoad %uint %idx None
- %28 = OpULessThan %bool %27 %uint_6
- %31 = OpLogicalNot %bool %28
- OpSelectionMerge %32 None
- OpBranchConditional %31 %33 %32
- %33 = OpLabel
OpBranch %26
- %32 = OpLabel
+ %26 = OpLabel
+ OpLoopMerge %27 %25 None
+ OpBranch %24
+ %24 = OpLabel
+ %32 = OpLoad %v2uint %tint_loop_idx None
+ %33 = OpIEqual %v2bool %32 %34
+ %38 = OpAll %bool %33
+ OpSelectionMerge %39 None
+ OpBranchConditional %38 %40 %39
+ %40 = OpLabel
+ OpBranch %27
+ %39 = OpLabel
+ %41 = OpLoad %uint %idx None
+ %42 = OpULessThan %bool %41 %uint_6
+ %44 = OpLogicalNot %bool %42
+ OpSelectionMerge %45 None
+ OpBranchConditional %44 %46 %45
+ %46 = OpLabel
+ OpBranch %27
+ %45 = OpLabel
%x_31 = OpLoad %uint %idx None
%x_33 = OpLoad %uint %idx None
%x_35 = OpLoad %uint %idx None
- %37 = OpFunctionCall %uint %tint_div_u32 %x_31 %uint_2
- %39 = OpFunctionCall %uint %tint_mod_u32 %x_33 %uint_2
- %41 = OpFunctionCall %uint %tint_mod_u32 %x_35 %uint_1
- %42 = OpExtInst %uint %43 UMin %37 %uint_2
- %44 = OpExtInst %uint %43 UMin %39 %uint_1
- %45 = OpExtInst %uint %43 UMin %41 %uint_0
- %46 = OpAccessChain %_ptr_Workgroup_uint %wg %42 %44 %45
- OpAtomicStore %46 %uint_2 %uint_0 %uint_0
- OpBranch %24
- %24 = OpLabel
- %49 = OpLoad %uint %idx None
- %50 = OpIAdd %uint %49 %uint_1
- OpStore %idx %50 None
+ %50 = OpFunctionCall %uint %tint_div_u32 %x_31 %uint_2
+ %52 = OpFunctionCall %uint %tint_mod_u32 %x_33 %uint_2
+ %54 = OpFunctionCall %uint %tint_mod_u32 %x_35 %uint_1
+ %55 = OpExtInst %uint %56 UMin %50 %uint_2
+ %57 = OpExtInst %uint %56 UMin %52 %uint_1
+ %58 = OpExtInst %uint %56 UMin %54 %uint_0
+ %59 = OpAccessChain %_ptr_Workgroup_uint %wg %55 %57 %58
+ OpAtomicStore %59 %uint_2 %uint_0 %uint_0
OpBranch %25
- %26 = OpLabel
+ %25 = OpLabel
+ %62 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %63 = OpLoad %uint %62 None
+%tint_low_inc = OpIAdd %uint %63 %uint_1
+ %65 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %65 %tint_low_inc None
+ %66 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %66 %uint_1 %uint_0
+ %68 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %69 = OpLoad %uint %68 None
+ %70 = OpIAdd %uint %69 %tint_carry
+ %71 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %71 %70 None
+ %72 = OpLoad %uint %idx None
+ %73 = OpIAdd %uint %72 %uint_1
+ OpStore %idx %73 None
+ OpBranch %26
+ %27 = OpLabel
OpControlBarrier %uint_2 %uint_2 %uint_264
- %53 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_2 %uint_1 %uint_0
- OpAtomicStore %53 %uint_2 %uint_0 %uint_1
+ %76 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_2 %uint_1 %uint_0
+ OpAtomicStore %76 %uint_2 %uint_0 %uint_1
OpReturn
OpFunctionEnd
-%compute_main_1 = OpFunction %void None %56
- %57 = OpLabel
+%compute_main_1 = OpFunction %void None %79
+ %80 = OpLabel
%x_57 = OpLoad %uint %local_invocation_index_1 None
- %59 = OpFunctionCall %void %compute_main_inner %x_57
+ %82 = OpFunctionCall %void %compute_main_inner %x_57
OpReturn
OpFunctionEnd
%compute_main_inner_0 = OpFunction %void None %18
%local_invocation_index_1_param = OpFunctionParameter %uint
- %62 = OpLabel
- OpBranch %63
- %63 = OpLabel
- OpBranch %66
- %66 = OpLabel
- %68 = OpPhi %uint %local_invocation_index_1_param %63 %69 %65
- OpLoopMerge %67 %65 None
- OpBranch %64
- %64 = OpLabel
- %70 = OpUGreaterThanEqual %bool %68 %uint_6
- OpSelectionMerge %71 None
- OpBranchConditional %70 %72 %71
- %72 = OpLabel
- OpBranch %67
- %71 = OpLabel
- %73 = OpUMod %uint %68 %uint_2
- %74 = OpUDiv %uint %68 %uint_2
- %75 = OpAccessChain %_ptr_Workgroup_uint %wg %74 %73 %uint_0
- OpAtomicStore %75 %uint_2 %uint_0 %uint_0
- OpBranch %65
- %65 = OpLabel
- %69 = OpIAdd %uint %68 %uint_1
- OpBranch %66
- %67 = OpLabel
+ %85 = OpLabel
+ OpBranch %86
+ %86 = OpLabel
+ OpBranch %89
+ %89 = OpLabel
+ %91 = OpPhi %uint %local_invocation_index_1_param %86 %92 %88
+ OpLoopMerge %90 %88 None
+ OpBranch %87
+ %87 = OpLabel
+ %93 = OpUGreaterThanEqual %bool %91 %uint_6
+ OpSelectionMerge %94 None
+ OpBranchConditional %93 %95 %94
+ %95 = OpLabel
+ OpBranch %90
+ %94 = OpLabel
+ %96 = OpUMod %uint %91 %uint_2
+ %97 = OpUDiv %uint %91 %uint_2
+ %98 = OpAccessChain %_ptr_Workgroup_uint %wg %97 %96 %uint_0
+ OpAtomicStore %98 %uint_2 %uint_0 %uint_0
+ OpBranch %88
+ %88 = OpLabel
+ %92 = OpIAdd %uint %91 %uint_1
+ OpBranch %89
+ %90 = OpLabel
OpControlBarrier %uint_2 %uint_2 %uint_264
OpStore %local_invocation_index_1 %local_invocation_index_1_param None
- %78 = OpFunctionCall %void %compute_main_1
+ %101 = OpFunctionCall %void %compute_main_1
OpReturn
OpFunctionEnd
-%tint_div_u32 = OpFunction %uint None %81
+%tint_div_u32 = OpFunction %uint None %104
%lhs = OpFunctionParameter %uint
%rhs = OpFunctionParameter %uint
- %82 = OpLabel
- %83 = OpIEqual %bool %rhs %uint_0
- %84 = OpSelect %uint %83 %uint_1 %rhs
- %85 = OpUDiv %uint %lhs %84
- OpReturnValue %85
+ %105 = OpLabel
+ %106 = OpIEqual %bool %rhs %uint_0
+ %107 = OpSelect %uint %106 %uint_1 %rhs
+ %108 = OpUDiv %uint %lhs %107
+ OpReturnValue %108
OpFunctionEnd
-%tint_mod_u32 = OpFunction %uint None %81
+%tint_mod_u32 = OpFunction %uint None %104
%lhs_0 = OpFunctionParameter %uint
%rhs_0 = OpFunctionParameter %uint
- %88 = OpLabel
- %89 = OpIEqual %bool %rhs_0 %uint_0
- %90 = OpSelect %uint %89 %uint_1 %rhs_0
- %91 = OpUDiv %uint %lhs_0 %90
- %92 = OpIMul %uint %91 %90
- %93 = OpISub %uint %lhs_0 %92
- OpReturnValue %93
+ %111 = OpLabel
+ %112 = OpIEqual %bool %rhs_0 %uint_0
+ %113 = OpSelect %uint %112 %uint_1 %rhs_0
+ %114 = OpUDiv %uint %lhs_0 %113
+ %115 = OpIMul %uint %114 %113
+ %116 = OpISub %uint %lhs_0 %115
+ OpReturnValue %116
OpFunctionEnd
-%compute_main = OpFunction %void None %56
- %95 = OpLabel
- %96 = OpLoad %uint %compute_main_local_invocation_index_Input None
- %97 = OpFunctionCall %void %compute_main_inner_0 %96
+%compute_main = OpFunction %void None %79
+ %118 = OpLabel
+ %119 = OpLoad %uint %compute_main_local_invocation_index_Input None
+ %120 = OpFunctionCall %void %compute_main_inner_0 %119
OpReturn
OpFunctionEnd
diff --git a/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.spvasm b/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.spvasm
index e2b1db1..7e46daf 100644
--- a/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.spvasm
+++ b/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.spvasm
@@ -1,10 +1,10 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 82
+; Bound: 105
; Schema: 0
OpCapability Shader
- %33 = OpExtInstImport "GLSL.std.450"
+ %46 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %compute_main "compute_main" %compute_main_local_invocation_index_Input
OpExecutionMode %compute_main LocalSize 1 1 1
@@ -18,7 +18,10 @@
OpName %compute_main_inner "compute_main_inner"
OpName %local_invocation_index_2 "local_invocation_index_2"
OpName %idx "idx"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %x_28 "x_28"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %compute_main_1 "compute_main_1"
OpName %x_53 "x_53"
OpName %compute_main_inner_0 "compute_main_inner"
@@ -45,7 +48,13 @@
%16 = OpTypeFunction %void %uint
%_ptr_Function_uint = OpTypePointer Function %uint
%uint_0 = OpConstant %uint 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %29 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %32 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%uint_9 = OpConstant %uint 9
%_ptr_Workgroup_int = OpTypePointer Workgroup %int
%int_0 = OpConstant %int 0
@@ -55,90 +64,113 @@
%_ptr_Workgroup_uint_0 = OpTypePointer Workgroup %uint
%uint_264 = OpConstant %uint 264
%uint_4 = OpConstant %uint 4
- %55 = OpTypeFunction %void
+ %78 = OpTypeFunction %void
%compute_main_inner = OpFunction %void None %16
%local_invocation_index_2 = OpFunctionParameter %uint
%17 = OpLabel
%idx = OpVariable %_ptr_Function_uint Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %29
OpStore %idx %uint_0
OpStore %idx %local_invocation_index_2 None
- OpBranch %23
- %23 = OpLabel
- OpLoopMerge %24 %22 None
OpBranch %21
%21 = OpLabel
- %25 = OpLoad %uint %idx None
- %26 = OpULessThan %bool %25 %uint_10
- %28 = OpLogicalNot %bool %26
- OpSelectionMerge %29 None
- OpBranchConditional %28 %30 %29
- %30 = OpLabel
OpBranch %24
- %29 = OpLabel
- %x_28 = OpLoad %uint %idx None
- %32 = OpExtInst %uint %33 UMin %x_28 %uint_9
- %35 = OpAccessChain %_ptr_Workgroup_int %wg %32 %uint_0
- OpStore %35 %int_0 None
- %38 = OpExtInst %uint %33 UMin %x_28 %uint_9
- %39 = OpAccessChain %_ptr_Workgroup_uint %wg %38 %uint_1
- OpAtomicStore %39 %uint_2 %uint_0 %uint_0
- %44 = OpExtInst %uint %33 UMin %x_28 %uint_9
- %45 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %44 %uint_2
- OpStore %45 %uint_0 None
+ %24 = OpLabel
+ OpLoopMerge %25 %23 None
OpBranch %22
%22 = OpLabel
- %47 = OpLoad %uint %idx None
- %48 = OpIAdd %uint %47 %uint_1
- OpStore %idx %48 None
+ %30 = OpLoad %v2uint %tint_loop_idx None
+ %31 = OpIEqual %v2bool %30 %32
+ %36 = OpAll %bool %31
+ OpSelectionMerge %37 None
+ OpBranchConditional %36 %38 %37
+ %38 = OpLabel
+ OpBranch %25
+ %37 = OpLabel
+ %39 = OpLoad %uint %idx None
+ %40 = OpULessThan %bool %39 %uint_10
+ %41 = OpLogicalNot %bool %40
+ OpSelectionMerge %42 None
+ OpBranchConditional %41 %43 %42
+ %43 = OpLabel
+ OpBranch %25
+ %42 = OpLabel
+ %x_28 = OpLoad %uint %idx None
+ %45 = OpExtInst %uint %46 UMin %x_28 %uint_9
+ %48 = OpAccessChain %_ptr_Workgroup_int %wg %45 %uint_0
+ OpStore %48 %int_0 None
+ %51 = OpExtInst %uint %46 UMin %x_28 %uint_9
+ %52 = OpAccessChain %_ptr_Workgroup_uint %wg %51 %uint_1
+ OpAtomicStore %52 %uint_2 %uint_0 %uint_0
+ %57 = OpExtInst %uint %46 UMin %x_28 %uint_9
+ %58 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %57 %uint_2
+ OpStore %58 %uint_0 None
OpBranch %23
- %24 = OpLabel
+ %23 = OpLabel
+ %60 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %61 = OpLoad %uint %60 None
+%tint_low_inc = OpIAdd %uint %61 %uint_1
+ %63 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %63 %tint_low_inc None
+ %64 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %64 %uint_1 %uint_0
+ %66 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %67 = OpLoad %uint %66 None
+ %68 = OpIAdd %uint %67 %tint_carry
+ %69 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %69 %68 None
+ %70 = OpLoad %uint %idx None
+ %71 = OpIAdd %uint %70 %uint_1
+ OpStore %idx %71 None
+ OpBranch %24
+ %25 = OpLabel
OpControlBarrier %uint_2 %uint_2 %uint_264
- %51 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_4 %uint_1
- OpAtomicStore %51 %uint_2 %uint_0 %uint_1
+ %74 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_4 %uint_1
+ OpAtomicStore %74 %uint_2 %uint_0 %uint_1
OpReturn
OpFunctionEnd
-%compute_main_1 = OpFunction %void None %55
- %56 = OpLabel
+%compute_main_1 = OpFunction %void None %78
+ %79 = OpLabel
%x_53 = OpLoad %uint %local_invocation_index_1 None
- %58 = OpFunctionCall %void %compute_main_inner %x_53
+ %81 = OpFunctionCall %void %compute_main_inner %x_53
OpReturn
OpFunctionEnd
%compute_main_inner_0 = OpFunction %void None %16
%local_invocation_index_1_param = OpFunctionParameter %uint
- %61 = OpLabel
- OpBranch %62
- %62 = OpLabel
- OpBranch %65
- %65 = OpLabel
- %67 = OpPhi %uint %local_invocation_index_1_param %62 %68 %64
- OpLoopMerge %66 %64 None
- OpBranch %63
- %63 = OpLabel
- %69 = OpUGreaterThanEqual %bool %67 %uint_10
- OpSelectionMerge %70 None
- OpBranchConditional %69 %71 %70
- %71 = OpLabel
- OpBranch %66
- %70 = OpLabel
- %72 = OpAccessChain %_ptr_Workgroup_int %wg %67 %uint_0
- OpStore %72 %int_0 None
- %73 = OpAccessChain %_ptr_Workgroup_uint %wg %67 %uint_1
- OpAtomicStore %73 %uint_2 %uint_0 %uint_0
- %75 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %67 %uint_2
- OpStore %75 %uint_0 None
- OpBranch %64
- %64 = OpLabel
- %68 = OpIAdd %uint %67 %uint_1
- OpBranch %65
- %66 = OpLabel
+ %84 = OpLabel
+ OpBranch %85
+ %85 = OpLabel
+ OpBranch %88
+ %88 = OpLabel
+ %90 = OpPhi %uint %local_invocation_index_1_param %85 %91 %87
+ OpLoopMerge %89 %87 None
+ OpBranch %86
+ %86 = OpLabel
+ %92 = OpUGreaterThanEqual %bool %90 %uint_10
+ OpSelectionMerge %93 None
+ OpBranchConditional %92 %94 %93
+ %94 = OpLabel
+ OpBranch %89
+ %93 = OpLabel
+ %95 = OpAccessChain %_ptr_Workgroup_int %wg %90 %uint_0
+ OpStore %95 %int_0 None
+ %96 = OpAccessChain %_ptr_Workgroup_uint %wg %90 %uint_1
+ OpAtomicStore %96 %uint_2 %uint_0 %uint_0
+ %98 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %90 %uint_2
+ OpStore %98 %uint_0 None
+ OpBranch %87
+ %87 = OpLabel
+ %91 = OpIAdd %uint %90 %uint_1
+ OpBranch %88
+ %89 = OpLabel
OpControlBarrier %uint_2 %uint_2 %uint_264
OpStore %local_invocation_index_1 %local_invocation_index_1_param None
- %77 = OpFunctionCall %void %compute_main_1
+ %100 = OpFunctionCall %void %compute_main_1
OpReturn
OpFunctionEnd
-%compute_main = OpFunction %void None %55
- %79 = OpLabel
- %80 = OpLoad %uint %compute_main_local_invocation_index_Input None
- %81 = OpFunctionCall %void %compute_main_inner_0 %80
+%compute_main = OpFunction %void None %78
+ %102 = OpLabel
+ %103 = OpLoad %uint %compute_main_local_invocation_index_Input None
+ %104 = OpFunctionCall %void %compute_main_inner_0 %103
OpReturn
OpFunctionEnd
diff --git a/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.spvasm b/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.spvasm
index 3ec2b71..cb24052 100644
--- a/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.spvasm
+++ b/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.spvasm
@@ -1,10 +1,10 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 83
+; Bound: 106
; Schema: 0
OpCapability Shader
- %39 = OpExtInstImport "GLSL.std.450"
+ %52 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %compute_main "compute_main" %compute_main_local_invocation_index_Input
OpExecutionMode %compute_main LocalSize 1 1 1
@@ -18,7 +18,10 @@
OpName %compute_main_inner "compute_main_inner"
OpName %local_invocation_index_2 "local_invocation_index_2"
OpName %idx "idx"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %x_35 "x_35"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %compute_main_1 "compute_main_1"
OpName %x_53 "x_53"
OpName %compute_main_inner_0 "compute_main_inner"
@@ -49,100 +52,129 @@
%int_0 = OpConstant %int 0
%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint
%uint_2 = OpConstant %uint 2
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %35 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %38 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%uint_9 = OpConstant %uint 9
%_ptr_Workgroup_uint_0 = OpTypePointer Workgroup %uint
%uint_1 = OpConstant %uint 1
%uint_264 = OpConstant %uint 264
%uint_4 = OpConstant %uint 4
- %53 = OpTypeFunction %void
+ %76 = OpTypeFunction %void
%compute_main_inner = OpFunction %void None %16
%local_invocation_index_2 = OpFunctionParameter %uint
%17 = OpLabel
%idx = OpVariable %_ptr_Function_uint Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %35
OpStore %idx %uint_0
%21 = OpAccessChain %_ptr_Workgroup_int %wg %uint_0
OpStore %21 %int_0 None
%24 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_2
OpStore %24 %uint_0 None
OpStore %idx %local_invocation_index_2 None
- OpBranch %29
- %29 = OpLabel
- OpLoopMerge %30 %28 None
OpBranch %27
%27 = OpLabel
- %31 = OpLoad %uint %idx None
- %32 = OpULessThan %bool %31 %uint_10
- %34 = OpLogicalNot %bool %32
- OpSelectionMerge %35 None
- OpBranchConditional %34 %36 %35
- %36 = OpLabel
OpBranch %30
- %35 = OpLabel
- %x_35 = OpLoad %uint %idx None
- %38 = OpExtInst %uint %39 UMin %x_35 %uint_9
- %41 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %uint_1 %38
- OpAtomicStore %41 %uint_2 %uint_0 %uint_0
+ %30 = OpLabel
+ OpLoopMerge %31 %29 None
OpBranch %28
%28 = OpLabel
+ %36 = OpLoad %v2uint %tint_loop_idx None
+ %37 = OpIEqual %v2bool %36 %38
+ %42 = OpAll %bool %37
+ OpSelectionMerge %43 None
+ OpBranchConditional %42 %44 %43
+ %44 = OpLabel
+ OpBranch %31
+ %43 = OpLabel
%45 = OpLoad %uint %idx None
- %46 = OpIAdd %uint %45 %uint_1
- OpStore %idx %46 None
+ %46 = OpULessThan %bool %45 %uint_10
+ %47 = OpLogicalNot %bool %46
+ OpSelectionMerge %48 None
+ OpBranchConditional %47 %49 %48
+ %49 = OpLabel
+ OpBranch %31
+ %48 = OpLabel
+ %x_35 = OpLoad %uint %idx None
+ %51 = OpExtInst %uint %52 UMin %x_35 %uint_9
+ %54 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %uint_1 %51
+ OpAtomicStore %54 %uint_2 %uint_0 %uint_0
OpBranch %29
- %30 = OpLabel
+ %29 = OpLabel
+ %58 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %59 = OpLoad %uint %58 None
+%tint_low_inc = OpIAdd %uint %59 %uint_1
+ %61 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %61 %tint_low_inc None
+ %62 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %62 %uint_1 %uint_0
+ %64 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %65 = OpLoad %uint %64 None
+ %66 = OpIAdd %uint %65 %tint_carry
+ %67 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %67 %66 None
+ %68 = OpLoad %uint %idx None
+ %69 = OpIAdd %uint %68 %uint_1
+ OpStore %idx %69 None
+ OpBranch %30
+ %31 = OpLabel
OpControlBarrier %uint_2 %uint_2 %uint_264
- %49 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %uint_1 %uint_4
- OpAtomicStore %49 %uint_2 %uint_0 %uint_1
+ %72 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %uint_1 %uint_4
+ OpAtomicStore %72 %uint_2 %uint_0 %uint_1
OpReturn
OpFunctionEnd
-%compute_main_1 = OpFunction %void None %53
- %54 = OpLabel
+%compute_main_1 = OpFunction %void None %76
+ %77 = OpLabel
%x_53 = OpLoad %uint %local_invocation_index_1 None
- %56 = OpFunctionCall %void %compute_main_inner %x_53
+ %79 = OpFunctionCall %void %compute_main_inner %x_53
OpReturn
OpFunctionEnd
%compute_main_inner_0 = OpFunction %void None %16
%local_invocation_index_1_param = OpFunctionParameter %uint
- %59 = OpLabel
- %60 = OpULessThan %bool %local_invocation_index_1_param %uint_1
- OpSelectionMerge %61 None
- OpBranchConditional %60 %62 %61
- %62 = OpLabel
- %63 = OpAccessChain %_ptr_Workgroup_int %wg %uint_0
- OpStore %63 %int_0 None
- %64 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_2
- OpStore %64 %uint_0 None
- OpBranch %61
- %61 = OpLabel
- OpBranch %65
- %65 = OpLabel
- OpBranch %68
- %68 = OpLabel
- %70 = OpPhi %uint %local_invocation_index_1_param %65 %71 %67
- OpLoopMerge %69 %67 None
- OpBranch %66
- %66 = OpLabel
- %72 = OpUGreaterThanEqual %bool %70 %uint_10
- OpSelectionMerge %73 None
- OpBranchConditional %72 %74 %73
- %74 = OpLabel
- OpBranch %69
- %73 = OpLabel
- %75 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %uint_1 %70
- OpAtomicStore %75 %uint_2 %uint_0 %uint_0
- OpBranch %67
- %67 = OpLabel
- %71 = OpIAdd %uint %70 %uint_1
- OpBranch %68
- %69 = OpLabel
+ %82 = OpLabel
+ %83 = OpULessThan %bool %local_invocation_index_1_param %uint_1
+ OpSelectionMerge %84 None
+ OpBranchConditional %83 %85 %84
+ %85 = OpLabel
+ %86 = OpAccessChain %_ptr_Workgroup_int %wg %uint_0
+ OpStore %86 %int_0 None
+ %87 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_2
+ OpStore %87 %uint_0 None
+ OpBranch %84
+ %84 = OpLabel
+ OpBranch %88
+ %88 = OpLabel
+ OpBranch %91
+ %91 = OpLabel
+ %93 = OpPhi %uint %local_invocation_index_1_param %88 %94 %90
+ OpLoopMerge %92 %90 None
+ OpBranch %89
+ %89 = OpLabel
+ %95 = OpUGreaterThanEqual %bool %93 %uint_10
+ OpSelectionMerge %96 None
+ OpBranchConditional %95 %97 %96
+ %97 = OpLabel
+ OpBranch %92
+ %96 = OpLabel
+ %98 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %uint_1 %93
+ OpAtomicStore %98 %uint_2 %uint_0 %uint_0
+ OpBranch %90
+ %90 = OpLabel
+ %94 = OpIAdd %uint %93 %uint_1
+ OpBranch %91
+ %92 = OpLabel
OpControlBarrier %uint_2 %uint_2 %uint_264
OpStore %local_invocation_index_1 %local_invocation_index_1_param None
- %78 = OpFunctionCall %void %compute_main_1
+ %101 = OpFunctionCall %void %compute_main_1
OpReturn
OpFunctionEnd
-%compute_main = OpFunction %void None %53
- %80 = OpLabel
- %81 = OpLoad %uint %compute_main_local_invocation_index_Input None
- %82 = OpFunctionCall %void %compute_main_inner_0 %81
+%compute_main = OpFunction %void None %76
+ %103 = OpLabel
+ %104 = OpLoad %uint %compute_main_local_invocation_index_Input None
+ %105 = OpFunctionCall %void %compute_main_inner_0 %104
OpReturn
OpFunctionEnd
diff --git a/test/tint/builtins/textureStore/loop_continuing_read_write_texture.wgsl.expected.spvasm b/test/tint/builtins/textureStore/loop_continuing_read_write_texture.wgsl.expected.spvasm
index 453cd2ef..0695c1a 100644
--- a/test/tint/builtins/textureStore/loop_continuing_read_write_texture.wgsl.expected.spvasm
+++ b/test/tint/builtins/textureStore/loop_continuing_read_write_texture.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 31
+; Bound: 57
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -9,7 +9,10 @@
OpExecutionMode %unused_entry_point LocalSize 1 1 1
OpName %tex "tex"
OpName %foo "foo"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %i "i"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
OpDecorate %tex DescriptorSet 0
OpDecorate %tex Binding 2
@@ -20,16 +23,27 @@
%tex = OpVariable %_ptr_UniformConstant_3 UniformConstant
%void = OpTypeVoid
%7 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %18 = OpConstantNull %v2uint
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
- %int_3 = OpConstant %int 3
+%uint_4294967295 = OpConstant %uint 4294967295
+ %24 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %int_3 = OpConstant %int 3
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%v2int = OpTypeVector %int 2
- %25 = OpConstantNull %v2int
+ %51 = OpConstantNull %v2int
%v4int = OpTypeVector %int 4
- %27 = OpConstantNull %v4int
+ %53 = OpConstantNull %v4int
%foo = OpFunction %void None %7
%8 = OpLabel
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %18
%i = OpVariable %_ptr_Function_int Function
OpBranch %9
%9 = OpLabel
@@ -39,22 +53,42 @@
OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
- %17 = OpLoad %int %i None
- %18 = OpSLessThan %bool %17 %int_3
- OpSelectionMerge %21 None
- OpBranchConditional %18 %21 %22
- %22 = OpLabel
+ %22 = OpLoad %v2uint %tint_loop_idx None
+ %23 = OpIEqual %v2bool %22 %24
+ %28 = OpAll %bool %23
+ OpSelectionMerge %29 None
+ OpBranchConditional %28 %30 %29
+ %30 = OpLabel
OpBranch %13
- %21 = OpLabel
+ %29 = OpLabel
+ %31 = OpLoad %int %i None
+ %32 = OpSLessThan %bool %31 %int_3
+ OpSelectionMerge %34 None
+ OpBranchConditional %32 %34 %35
+ %35 = OpLabel
+ OpBranch %13
+ %34 = OpLabel
OpBranch %11
%11 = OpLabel
- %23 = OpLoad %3 %tex None
- OpImageWrite %23 %25 %27 None
+ %36 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %39 = OpLoad %uint %36 None
+%tint_low_inc = OpIAdd %uint %39 %uint_1
+ %42 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %42 %tint_low_inc None
+ %43 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %43 %uint_1 %uint_0
+ %45 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %46 = OpLoad %uint %45 None
+ %47 = OpIAdd %uint %46 %tint_carry
+ %48 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %48 %47 None
+ %49 = OpLoad %3 %tex None
+ OpImageWrite %49 %51 %53 None
OpBranch %12
%13 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %7
- %30 = OpLabel
+ %56 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/builtins/workgroupUniformLoad/for_loop.wgsl.expected.spvasm b/test/tint/builtins/workgroupUniformLoad/for_loop.wgsl.expected.spvasm
index b41cb29..4e89586 100644
--- a/test/tint/builtins/workgroupUniformLoad/for_loop.wgsl.expected.spvasm
+++ b/test/tint/builtins/workgroupUniformLoad/for_loop.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 35
+; Bound: 60
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -10,7 +10,10 @@
OpName %a "a"
OpName %b "b"
OpName %foo "foo"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %i "i"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%int = OpTypeInt 32 1
%_ptr_Workgroup_int = OpTypePointer Workgroup %int
@@ -18,14 +21,24 @@
%b = OpVariable %_ptr_Workgroup_int Workgroup
%void = OpTypeVoid
%7 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %18 = OpConstantNull %v2uint
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
- %uint = OpTypeInt 32 0
+%uint_4294967295 = OpConstant %uint 4294967295
+ %24 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%uint_2 = OpConstant %uint 2
%uint_264 = OpConstant %uint 264
- %bool = OpTypeBool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%foo = OpFunction %void None %7
%8 = OpLabel
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %18
%i = OpVariable %_ptr_Function_int Function
OpBranch %9
%9 = OpLabel
@@ -35,29 +48,49 @@
OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
- %17 = OpLoad %int %i None
- OpControlBarrier %uint_2 %uint_2 %uint_264
- %22 = OpLoad %int %a None
- OpControlBarrier %uint_2 %uint_2 %uint_264
- %24 = OpSLessThan %bool %17 %22
- OpSelectionMerge %26 None
- OpBranchConditional %24 %26 %27
- %27 = OpLabel
+ %22 = OpLoad %v2uint %tint_loop_idx None
+ %23 = OpIEqual %v2bool %22 %24
+ %28 = OpAll %bool %23
+ OpSelectionMerge %29 None
+ OpBranchConditional %28 %30 %29
+ %30 = OpLabel
OpBranch %13
- %26 = OpLabel
+ %29 = OpLabel
+ %31 = OpLoad %int %i None
+ OpControlBarrier %uint_2 %uint_2 %uint_264
+ %35 = OpLoad %int %a None
+ OpControlBarrier %uint_2 %uint_2 %uint_264
+ %37 = OpSLessThan %bool %31 %35
+ OpSelectionMerge %38 None
+ OpBranchConditional %37 %38 %39
+ %39 = OpLabel
+ OpBranch %13
+ %38 = OpLabel
OpBranch %11
%11 = OpLabel
+ %40 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %43 = OpLoad %uint %40 None
+%tint_low_inc = OpIAdd %uint %43 %uint_1
+ %46 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %46 %tint_low_inc None
+ %47 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %47 %uint_1 %uint_0
+ %49 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %50 = OpLoad %uint %49 None
+ %51 = OpIAdd %uint %50 %tint_carry
+ %52 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %52 %51 None
OpControlBarrier %uint_2 %uint_2 %uint_264
- %29 = OpLoad %int %b None
+ %54 = OpLoad %int %b None
OpControlBarrier %uint_2 %uint_2 %uint_264
- %31 = OpLoad %int %i None
- %32 = OpIAdd %int %31 %29
- OpStore %i %32 None
+ %56 = OpLoad %int %i None
+ %57 = OpIAdd %int %56 %54
+ OpStore %i %57 None
OpBranch %12
%13 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %7
- %34 = OpLabel
+ %59 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/diagnostic_filtering/for_loop_attribute.wgsl.expected.spvasm b/test/tint/diagnostic_filtering/for_loop_attribute.wgsl.expected.spvasm
index 3877dda..d4c8f67 100644
--- a/test/tint/diagnostic_filtering/for_loop_attribute.wgsl.expected.spvasm
+++ b/test/tint/diagnostic_filtering/for_loop_attribute.wgsl.expected.spvasm
@@ -13,7 +13,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 40
+; Bound: 65
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -23,6 +23,9 @@
OpName %main_inner "main_inner"
OpName %x "x"
OpName %v "v"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %main "main"
OpDecorate %main_loc0_Input Location 0
%float = OpTypeFloat 32
@@ -33,51 +36,82 @@
%v4float = OpTypeVector %float 4
%_ptr_Function_v4float = OpTypePointer Function %v4float
%12 = OpConstantNull %v4float
-%_ptr_Function_float = OpTypePointer Function %float
%uint = OpTypeInt 32 0
- %uint_0 = OpConstant %uint 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %22 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %25 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+%_ptr_Function_float = OpTypePointer Function %float
+ %uint_0 = OpConstant %uint 0
%float_1 = OpConstant %float 1
%float_0 = OpConstant %float 0
%false = OpConstantFalse %bool
- %36 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_1 = OpConstant %uint 1
+ %61 = OpTypeFunction %void
%main_inner = OpFunction %void None %7
%x = OpFunctionParameter %float
%8 = OpLabel
%v = OpVariable %_ptr_Function_v4float Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %22
OpStore %v %12
- OpBranch %15
- %15 = OpLabel
- OpLoopMerge %16 %14 None
OpBranch %13
%13 = OpLabel
- %17 = OpAccessChain %_ptr_Function_float %v %uint_0
- %21 = OpLoad %float %17 None
- %22 = OpFOrdGreaterThan %bool %x %21
- OpSelectionMerge %24 None
- OpBranchConditional %22 %25 %26
- %25 = OpLabel
- %27 = OpDPdx %float %float_1
- %29 = OpFOrdGreaterThan %bool %27 %float_0
- OpBranch %24
- %26 = OpLabel
- OpBranch %24
- %24 = OpLabel
- %31 = OpPhi %bool %29 %25 %false %26
- OpSelectionMerge %33 None
- OpBranchConditional %31 %33 %34
- %34 = OpLabel
OpBranch %16
- %33 = OpLabel
+ %16 = OpLabel
+ OpLoopMerge %17 %15 None
OpBranch %14
%14 = OpLabel
+ %23 = OpLoad %v2uint %tint_loop_idx None
+ %24 = OpIEqual %v2bool %23 %25
+ %29 = OpAll %bool %24
+ OpSelectionMerge %30 None
+ OpBranchConditional %29 %31 %30
+ %31 = OpLabel
+ OpBranch %17
+ %30 = OpLabel
+ %32 = OpAccessChain %_ptr_Function_float %v %uint_0
+ %35 = OpLoad %float %32 None
+ %36 = OpFOrdGreaterThan %bool %x %35
+ OpSelectionMerge %37 None
+ OpBranchConditional %36 %38 %39
+ %38 = OpLabel
+ %40 = OpDPdx %float %float_1
+ %42 = OpFOrdGreaterThan %bool %40 %float_0
+ OpBranch %37
+ %39 = OpLabel
+ OpBranch %37
+ %37 = OpLabel
+ %44 = OpPhi %bool %42 %38 %false %39
+ OpSelectionMerge %46 None
+ OpBranchConditional %44 %46 %47
+ %47 = OpLabel
+ OpBranch %17
+ %46 = OpLabel
OpBranch %15
- %16 = OpLabel
+ %15 = OpLabel
+ %48 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %50 = OpLoad %uint %48 None
+%tint_low_inc = OpIAdd %uint %50 %uint_1
+ %53 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %53 %tint_low_inc None
+ %54 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %54 %uint_1 %uint_0
+ %56 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %57 = OpLoad %uint %56 None
+ %58 = OpIAdd %uint %57 %tint_carry
+ %59 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %59 %58 None
+ OpBranch %16
+ %17 = OpLabel
OpReturn
OpFunctionEnd
- %main = OpFunction %void None %36
- %37 = OpLabel
- %38 = OpLoad %float %main_loc0_Input None
- %39 = OpFunctionCall %void %main_inner %38
+ %main = OpFunction %void None %61
+ %62 = OpLabel
+ %63 = OpLoad %float %main_loc0_Input None
+ %64 = OpFunctionCall %void %main_inner %63
OpReturn
OpFunctionEnd
diff --git a/test/tint/diagnostic_filtering/for_loop_body_attribute.wgsl.expected.spvasm b/test/tint/diagnostic_filtering/for_loop_body_attribute.wgsl.expected.spvasm
index 8c78fe2..f80a952 100644
--- a/test/tint/diagnostic_filtering/for_loop_body_attribute.wgsl.expected.spvasm
+++ b/test/tint/diagnostic_filtering/for_loop_body_attribute.wgsl.expected.spvasm
@@ -13,7 +13,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 44
+; Bound: 69
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -25,6 +25,9 @@
OpName %main_inner "main_inner"
OpName %x "x"
OpName %v "v"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %main "main"
OpDecorate %t DescriptorSet 0
OpDecorate %t Binding 1
@@ -45,46 +48,77 @@
%v4float = OpTypeVector %float 4
%_ptr_Function_v4float = OpTypePointer Function %v4float
%18 = OpConstantNull %v4float
-%_ptr_Function_float = OpTypePointer Function %float
%uint = OpTypeInt 32 0
- %uint_0 = OpConstant %uint 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %28 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %31 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
- %35 = OpTypeSampledImage %3
+ %v2bool = OpTypeVector %bool 2
+%_ptr_Function_float = OpTypePointer Function %float
+ %uint_0 = OpConstant %uint 0
+ %48 = OpTypeSampledImage %3
%v2float = OpTypeVector %float 2
- %37 = OpConstantNull %v2float
- %40 = OpTypeFunction %void
+ %50 = OpConstantNull %v2float
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_1 = OpConstant %uint 1
+ %65 = OpTypeFunction %void
%main_inner = OpFunction %void None %13
%x = OpFunctionParameter %float
%14 = OpLabel
%v = OpVariable %_ptr_Function_v4float Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %28
OpStore %v %18
- OpBranch %21
- %21 = OpLabel
- OpLoopMerge %22 %20 None
OpBranch %19
%19 = OpLabel
- %23 = OpAccessChain %_ptr_Function_float %v %uint_0
- %27 = OpLoad %float %23 None
- %28 = OpFOrdGreaterThan %bool %x %27
- OpSelectionMerge %30 None
- OpBranchConditional %28 %30 %31
- %31 = OpLabel
OpBranch %22
- %30 = OpLabel
- %32 = OpLoad %3 %t None
- %33 = OpLoad %7 %s None
- %34 = OpSampledImage %35 %32 %33
- %36 = OpImageSampleImplicitLod %v4float %34 %37 None
- OpStore %v %36 None
+ %22 = OpLabel
+ OpLoopMerge %23 %21 None
OpBranch %20
%20 = OpLabel
+ %29 = OpLoad %v2uint %tint_loop_idx None
+ %30 = OpIEqual %v2bool %29 %31
+ %35 = OpAll %bool %30
+ OpSelectionMerge %36 None
+ OpBranchConditional %35 %37 %36
+ %37 = OpLabel
+ OpBranch %23
+ %36 = OpLabel
+ %38 = OpAccessChain %_ptr_Function_float %v %uint_0
+ %41 = OpLoad %float %38 None
+ %42 = OpFOrdGreaterThan %bool %x %41
+ OpSelectionMerge %43 None
+ OpBranchConditional %42 %43 %44
+ %44 = OpLabel
+ OpBranch %23
+ %43 = OpLabel
+ %45 = OpLoad %3 %t None
+ %46 = OpLoad %7 %s None
+ %47 = OpSampledImage %48 %45 %46
+ %49 = OpImageSampleImplicitLod %v4float %47 %50 None
+ OpStore %v %49 None
OpBranch %21
- %22 = OpLabel
+ %21 = OpLabel
+ %52 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %54 = OpLoad %uint %52 None
+%tint_low_inc = OpIAdd %uint %54 %uint_1
+ %57 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %57 %tint_low_inc None
+ %58 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %58 %uint_1 %uint_0
+ %60 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %61 = OpLoad %uint %60 None
+ %62 = OpIAdd %uint %61 %tint_carry
+ %63 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %63 %62 None
+ OpBranch %22
+ %23 = OpLabel
OpReturn
OpFunctionEnd
- %main = OpFunction %void None %40
- %41 = OpLabel
- %42 = OpLoad %float %main_loc0_Input None
- %43 = OpFunctionCall %void %main_inner %42
+ %main = OpFunction %void None %65
+ %66 = OpLabel
+ %67 = OpLoad %float %main_loc0_Input None
+ %68 = OpFunctionCall %void %main_inner %67
OpReturn
OpFunctionEnd
diff --git a/test/tint/diagnostic_filtering/loop_attribute.wgsl.expected.spvasm b/test/tint/diagnostic_filtering/loop_attribute.wgsl.expected.spvasm
index 4fa19b9..68655b7 100644
--- a/test/tint/diagnostic_filtering/loop_attribute.wgsl.expected.spvasm
+++ b/test/tint/diagnostic_filtering/loop_attribute.wgsl.expected.spvasm
@@ -13,7 +13,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 23
+; Bound: 50
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -22,6 +22,9 @@
OpName %main_loc0_Input "main_loc0_Input"
OpName %main_inner "main_inner"
OpName %x "x"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %main "main"
OpDecorate %main_loc0_Input Location 0
%float = OpTypeFloat 32
@@ -29,29 +32,62 @@
%main_loc0_Input = OpVariable %_ptr_Input_float Input
%void = OpTypeVoid
%7 = OpTypeFunction %void %float
- %float_1 = OpConstant %float 1
- %float_0 = OpConstant %float 0
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %18 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
- %19 = OpTypeFunction %void
+ %v2bool = OpTypeVector %bool 2
+ %float_1 = OpConstant %float 1
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
+ %float_0 = OpConstant %float 0
+ %46 = OpTypeFunction %void
%main_inner = OpFunction %void None %7
%x = OpFunctionParameter %float
%8 = OpLabel
- OpBranch %11
- %11 = OpLabel
- OpLoopMerge %12 %10 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %18
OpBranch %9
%9 = OpLabel
- %13 = OpDPdx %float %float_1
+ OpBranch %12
+ %12 = OpLabel
+ OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
- %15 = OpFOrdGreaterThan %bool %x %float_0
- OpBranchConditional %15 %12 %11
- %12 = OpLabel
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
+ %27 = OpLabel
+ OpBranch %13
+ %26 = OpLabel
+ %28 = OpDPdx %float %float_1
+ OpBranch %11
+ %11 = OpLabel
+ %30 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %33 = OpLoad %uint %30 None
+%tint_low_inc = OpIAdd %uint %33 %uint_1
+ %36 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %36 %tint_low_inc None
+ %37 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %37 %uint_1 %uint_0
+ %39 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %40 = OpLoad %uint %39 None
+ %41 = OpIAdd %uint %40 %tint_carry
+ %42 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %42 %41 None
+ %43 = OpFOrdGreaterThan %bool %x %float_0
+ OpBranchConditional %43 %13 %12
+ %13 = OpLabel
OpReturn
OpFunctionEnd
- %main = OpFunction %void None %19
- %20 = OpLabel
- %21 = OpLoad %float %main_loc0_Input None
- %22 = OpFunctionCall %void %main_inner %21
+ %main = OpFunction %void None %46
+ %47 = OpLabel
+ %48 = OpLoad %float %main_loc0_Input None
+ %49 = OpFunctionCall %void %main_inner %48
OpReturn
OpFunctionEnd
diff --git a/test/tint/diagnostic_filtering/loop_body_attribute.wgsl.expected.spvasm b/test/tint/diagnostic_filtering/loop_body_attribute.wgsl.expected.spvasm
index 030cb36..c2d6bfc 100644
--- a/test/tint/diagnostic_filtering/loop_body_attribute.wgsl.expected.spvasm
+++ b/test/tint/diagnostic_filtering/loop_body_attribute.wgsl.expected.spvasm
@@ -13,7 +13,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 23
+; Bound: 50
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -22,6 +22,9 @@
OpName %main_loc0_Input "main_loc0_Input"
OpName %main_inner "main_inner"
OpName %x "x"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %main "main"
OpDecorate %main_loc0_Input Location 0
%float = OpTypeFloat 32
@@ -29,29 +32,62 @@
%main_loc0_Input = OpVariable %_ptr_Input_float Input
%void = OpTypeVoid
%7 = OpTypeFunction %void %float
- %float_1 = OpConstant %float 1
- %float_0 = OpConstant %float 0
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %18 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
- %19 = OpTypeFunction %void
+ %v2bool = OpTypeVector %bool 2
+ %float_1 = OpConstant %float 1
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
+ %float_0 = OpConstant %float 0
+ %46 = OpTypeFunction %void
%main_inner = OpFunction %void None %7
%x = OpFunctionParameter %float
%8 = OpLabel
- OpBranch %11
- %11 = OpLabel
- OpLoopMerge %12 %10 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %18
OpBranch %9
%9 = OpLabel
- %13 = OpDPdx %float %float_1
+ OpBranch %12
+ %12 = OpLabel
+ OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
- %15 = OpFOrdGreaterThan %bool %x %float_0
- OpBranchConditional %15 %12 %11
- %12 = OpLabel
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
+ %27 = OpLabel
+ OpBranch %13
+ %26 = OpLabel
+ %28 = OpDPdx %float %float_1
+ OpBranch %11
+ %11 = OpLabel
+ %30 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %33 = OpLoad %uint %30 None
+%tint_low_inc = OpIAdd %uint %33 %uint_1
+ %36 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %36 %tint_low_inc None
+ %37 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %37 %uint_1 %uint_0
+ %39 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %40 = OpLoad %uint %39 None
+ %41 = OpIAdd %uint %40 %tint_carry
+ %42 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %42 %41 None
+ %43 = OpFOrdGreaterThan %bool %x %float_0
+ OpBranchConditional %43 %13 %12
+ %13 = OpLabel
OpReturn
OpFunctionEnd
- %main = OpFunction %void None %19
- %20 = OpLabel
- %21 = OpLoad %float %main_loc0_Input None
- %22 = OpFunctionCall %void %main_inner %21
+ %main = OpFunction %void None %46
+ %47 = OpLabel
+ %48 = OpLoad %float %main_loc0_Input None
+ %49 = OpFunctionCall %void %main_inner %48
OpReturn
OpFunctionEnd
diff --git a/test/tint/diagnostic_filtering/loop_continuing_attribute.wgsl.expected.spvasm b/test/tint/diagnostic_filtering/loop_continuing_attribute.wgsl.expected.spvasm
index b3e2f66..29d77ea 100644
--- a/test/tint/diagnostic_filtering/loop_continuing_attribute.wgsl.expected.spvasm
+++ b/test/tint/diagnostic_filtering/loop_continuing_attribute.wgsl.expected.spvasm
@@ -13,7 +13,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 23
+; Bound: 50
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -22,6 +22,9 @@
OpName %main_loc0_Input "main_loc0_Input"
OpName %main_inner "main_inner"
OpName %x "x"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %main "main"
OpDecorate %main_loc0_Input Location 0
%float = OpTypeFloat 32
@@ -29,29 +32,62 @@
%main_loc0_Input = OpVariable %_ptr_Input_float Input
%void = OpTypeVoid
%7 = OpTypeFunction %void %float
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %18 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%float_1 = OpConstant %float 1
%float_0 = OpConstant %float 0
- %bool = OpTypeBool
- %19 = OpTypeFunction %void
+ %46 = OpTypeFunction %void
%main_inner = OpFunction %void None %7
%x = OpFunctionParameter %float
%8 = OpLabel
- OpBranch %11
- %11 = OpLabel
- OpLoopMerge %12 %10 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %18
OpBranch %9
%9 = OpLabel
+ OpBranch %12
+ %12 = OpLabel
+ OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
- %13 = OpDPdx %float %float_1
- %15 = OpFOrdGreaterThan %bool %x %float_0
- OpBranchConditional %15 %12 %11
- %12 = OpLabel
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
+ %27 = OpLabel
+ OpBranch %13
+ %26 = OpLabel
+ OpBranch %11
+ %11 = OpLabel
+ %28 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %31 = OpLoad %uint %28 None
+%tint_low_inc = OpIAdd %uint %31 %uint_1
+ %34 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %34 %tint_low_inc None
+ %35 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %35 %uint_1 %uint_0
+ %37 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %38 = OpLoad %uint %37 None
+ %39 = OpIAdd %uint %38 %tint_carry
+ %40 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %40 %39 None
+ %41 = OpDPdx %float %float_1
+ %43 = OpFOrdGreaterThan %bool %x %float_0
+ OpBranchConditional %43 %13 %12
+ %13 = OpLabel
OpReturn
OpFunctionEnd
- %main = OpFunction %void None %19
- %20 = OpLabel
- %21 = OpLoad %float %main_loc0_Input None
- %22 = OpFunctionCall %void %main_inner %21
+ %main = OpFunction %void None %46
+ %47 = OpLabel
+ %48 = OpLoad %float %main_loc0_Input None
+ %49 = OpFunctionCall %void %main_inner %48
OpReturn
OpFunctionEnd
diff --git a/test/tint/diagnostic_filtering/while_loop_attribute.wgsl.expected.spvasm b/test/tint/diagnostic_filtering/while_loop_attribute.wgsl.expected.spvasm
index ea255fd..50cf68f 100644
--- a/test/tint/diagnostic_filtering/while_loop_attribute.wgsl.expected.spvasm
+++ b/test/tint/diagnostic_filtering/while_loop_attribute.wgsl.expected.spvasm
@@ -13,7 +13,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 35
+; Bound: 62
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -23,6 +23,9 @@
OpName %main_inner "main_inner"
OpName %x "x"
OpName %v "v"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %main "main"
OpDecorate %main_loc0_Input Location 0
%float = OpTypeFloat 32
@@ -33,46 +36,79 @@
%v4float = OpTypeVector %float 4
%_ptr_Function_v4float = OpTypePointer Function %v4float
%12 = OpConstantNull %v4float
- %float_0 = OpConstant %float 0
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %22 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %25 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %float_0 = OpConstant %float 0
%float_1 = OpConstant %float 1
%false = OpConstantFalse %bool
- %31 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
+ %58 = OpTypeFunction %void
%main_inner = OpFunction %void None %7
%x = OpFunctionParameter %float
%8 = OpLabel
%v = OpVariable %_ptr_Function_v4float Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %22
OpStore %v %12
- OpBranch %15
- %15 = OpLabel
- OpLoopMerge %16 %14 None
OpBranch %13
%13 = OpLabel
- %17 = OpFOrdGreaterThan %bool %x %float_0
- OpSelectionMerge %20 None
- OpBranchConditional %17 %21 %22
- %21 = OpLabel
- %23 = OpDPdx %float %float_1
- %25 = OpFOrdGreaterThan %bool %23 %float_0
- OpBranch %20
- %22 = OpLabel
- OpBranch %20
- %20 = OpLabel
- %26 = OpPhi %bool %25 %21 %false %22
- OpSelectionMerge %28 None
- OpBranchConditional %26 %28 %29
- %29 = OpLabel
OpBranch %16
- %28 = OpLabel
+ %16 = OpLabel
+ OpLoopMerge %17 %15 None
OpBranch %14
%14 = OpLabel
+ %23 = OpLoad %v2uint %tint_loop_idx None
+ %24 = OpIEqual %v2bool %23 %25
+ %29 = OpAll %bool %24
+ OpSelectionMerge %30 None
+ OpBranchConditional %29 %31 %30
+ %31 = OpLabel
+ OpBranch %17
+ %30 = OpLabel
+ %32 = OpFOrdGreaterThan %bool %x %float_0
+ OpSelectionMerge %34 None
+ OpBranchConditional %32 %35 %36
+ %35 = OpLabel
+ %37 = OpDPdx %float %float_1
+ %39 = OpFOrdGreaterThan %bool %37 %float_0
+ OpBranch %34
+ %36 = OpLabel
+ OpBranch %34
+ %34 = OpLabel
+ %40 = OpPhi %bool %39 %35 %false %36
+ OpSelectionMerge %42 None
+ OpBranchConditional %40 %42 %43
+ %43 = OpLabel
+ OpBranch %17
+ %42 = OpLabel
OpBranch %15
- %16 = OpLabel
+ %15 = OpLabel
+ %44 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %47 = OpLoad %uint %44 None
+%tint_low_inc = OpIAdd %uint %47 %uint_1
+ %50 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %50 %tint_low_inc None
+ %51 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %51 %uint_1 %uint_0
+ %53 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %54 = OpLoad %uint %53 None
+ %55 = OpIAdd %uint %54 %tint_carry
+ %56 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %56 %55 None
+ OpBranch %16
+ %17 = OpLabel
OpReturn
OpFunctionEnd
- %main = OpFunction %void None %31
- %32 = OpLabel
- %33 = OpLoad %float %main_loc0_Input None
- %34 = OpFunctionCall %void %main_inner %33
+ %main = OpFunction %void None %58
+ %59 = OpLabel
+ %60 = OpLoad %float %main_loc0_Input None
+ %61 = OpFunctionCall %void %main_inner %60
OpReturn
OpFunctionEnd
diff --git a/test/tint/diagnostic_filtering/while_loop_body_attribute.wgsl.expected.spvasm b/test/tint/diagnostic_filtering/while_loop_body_attribute.wgsl.expected.spvasm
index 83691e4..ea33d6e 100644
--- a/test/tint/diagnostic_filtering/while_loop_body_attribute.wgsl.expected.spvasm
+++ b/test/tint/diagnostic_filtering/while_loop_body_attribute.wgsl.expected.spvasm
@@ -13,7 +13,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 44
+; Bound: 69
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -25,6 +25,9 @@
OpName %main_inner "main_inner"
OpName %x "x"
OpName %v "v"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %main "main"
OpDecorate %t DescriptorSet 0
OpDecorate %t Binding 1
@@ -45,46 +48,77 @@
%v4float = OpTypeVector %float 4
%_ptr_Function_v4float = OpTypePointer Function %v4float
%18 = OpConstantNull %v4float
-%_ptr_Function_float = OpTypePointer Function %float
%uint = OpTypeInt 32 0
- %uint_0 = OpConstant %uint 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %28 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %31 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
- %35 = OpTypeSampledImage %3
+ %v2bool = OpTypeVector %bool 2
+%_ptr_Function_float = OpTypePointer Function %float
+ %uint_0 = OpConstant %uint 0
+ %48 = OpTypeSampledImage %3
%v2float = OpTypeVector %float 2
- %37 = OpConstantNull %v2float
- %40 = OpTypeFunction %void
+ %50 = OpConstantNull %v2float
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_1 = OpConstant %uint 1
+ %65 = OpTypeFunction %void
%main_inner = OpFunction %void None %13
%x = OpFunctionParameter %float
%14 = OpLabel
%v = OpVariable %_ptr_Function_v4float Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %28
OpStore %v %18
- OpBranch %21
- %21 = OpLabel
- OpLoopMerge %22 %20 None
OpBranch %19
%19 = OpLabel
- %23 = OpAccessChain %_ptr_Function_float %v %uint_0
- %27 = OpLoad %float %23 None
- %28 = OpFOrdGreaterThan %bool %x %27
- OpSelectionMerge %30 None
- OpBranchConditional %28 %30 %31
- %31 = OpLabel
OpBranch %22
- %30 = OpLabel
- %32 = OpLoad %3 %t None
- %33 = OpLoad %7 %s None
- %34 = OpSampledImage %35 %32 %33
- %36 = OpImageSampleImplicitLod %v4float %34 %37 None
- OpStore %v %36 None
+ %22 = OpLabel
+ OpLoopMerge %23 %21 None
OpBranch %20
%20 = OpLabel
+ %29 = OpLoad %v2uint %tint_loop_idx None
+ %30 = OpIEqual %v2bool %29 %31
+ %35 = OpAll %bool %30
+ OpSelectionMerge %36 None
+ OpBranchConditional %35 %37 %36
+ %37 = OpLabel
+ OpBranch %23
+ %36 = OpLabel
+ %38 = OpAccessChain %_ptr_Function_float %v %uint_0
+ %41 = OpLoad %float %38 None
+ %42 = OpFOrdGreaterThan %bool %x %41
+ OpSelectionMerge %43 None
+ OpBranchConditional %42 %43 %44
+ %44 = OpLabel
+ OpBranch %23
+ %43 = OpLabel
+ %45 = OpLoad %3 %t None
+ %46 = OpLoad %7 %s None
+ %47 = OpSampledImage %48 %45 %46
+ %49 = OpImageSampleImplicitLod %v4float %47 %50 None
+ OpStore %v %49 None
OpBranch %21
- %22 = OpLabel
+ %21 = OpLabel
+ %52 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %54 = OpLoad %uint %52 None
+%tint_low_inc = OpIAdd %uint %54 %uint_1
+ %57 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %57 %tint_low_inc None
+ %58 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %58 %uint_1 %uint_0
+ %60 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %61 = OpLoad %uint %60 None
+ %62 = OpIAdd %uint %61 %tint_carry
+ %63 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %63 %62 None
+ OpBranch %22
+ %23 = OpLabel
OpReturn
OpFunctionEnd
- %main = OpFunction %void None %40
- %41 = OpLabel
- %42 = OpLoad %float %main_loc0_Input None
- %43 = OpFunctionCall %void %main_inner %42
+ %main = OpFunction %void None %65
+ %66 = OpLabel
+ %67 = OpLoad %float %main_loc0_Input None
+ %68 = OpFunctionCall %void %main_inner %67
OpReturn
OpFunctionEnd
diff --git a/test/tint/loops/continue_in_switch_with_breakif.wgsl.expected.spvasm b/test/tint/loops/continue_in_switch_with_breakif.wgsl.expected.spvasm
index 055d49b..961b583 100644
--- a/test/tint/loops/continue_in_switch_with_breakif.wgsl.expected.spvasm
+++ b/test/tint/loops/continue_in_switch_with_breakif.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 24
+; Bound: 51
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -9,39 +9,75 @@
OpExecutionMode %f LocalSize 1 1 1
OpName %f "f"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
%void = OpTypeVoid
%3 = OpTypeFunction %void
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %18 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%int_1 = OpConstant %int 1
%int_4 = OpConstant %int 4
- %bool = OpTypeBool
%f = OpFunction %void None %3
%4 = OpLabel
%i = OpVariable %_ptr_Function_int Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %18
OpStore %i %int_0
- OpBranch %11
- %11 = OpLabel
- OpLoopMerge %12 %10 None
OpBranch %9
%9 = OpLabel
- %13 = OpLoad %int %i None
- OpSelectionMerge %16 None
- OpSwitch %13 %14 0 %15
- %15 = OpLabel
- OpBranch %10
- %14 = OpLabel
- OpBranch %16
- %16 = OpLabel
+ OpBranch %12
+ %12 = OpLabel
+ OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
- %17 = OpLoad %int %i None
- %18 = OpIAdd %int %17 %int_1
- OpStore %i %18 None
- %20 = OpLoad %int %i None
- %21 = OpSGreaterThanEqual %bool %20 %int_4
- OpBranchConditional %21 %12 %11
- %12 = OpLabel
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
+ %27 = OpLabel
+ OpBranch %13
+ %26 = OpLabel
+ %28 = OpLoad %int %i None
+ OpSelectionMerge %31 None
+ OpSwitch %28 %29 0 %30
+ %30 = OpLabel
+ OpBranch %11
+ %29 = OpLabel
+ OpBranch %31
+ %31 = OpLabel
+ OpBranch %11
+ %11 = OpLabel
+ %32 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %35 = OpLoad %uint %32 None
+%tint_low_inc = OpIAdd %uint %35 %uint_1
+ %38 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %38 %tint_low_inc None
+ %39 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %39 %uint_1 %uint_0
+ %41 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %42 = OpLoad %uint %41 None
+ %43 = OpIAdd %uint %42 %tint_carry
+ %44 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %44 %43 None
+ %45 = OpLoad %int %i None
+ %46 = OpIAdd %int %45 %int_1
+ OpStore %i %46 None
+ %48 = OpLoad %int %i None
+ %49 = OpSGreaterThanEqual %bool %48 %int_4
+ OpBranchConditional %49 %13 %12
+ %13 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/loops/continue_in_switch_with_breakif_robustness.wgsl.expected.spvasm b/test/tint/loops/continue_in_switch_with_breakif_robustness.wgsl.expected.spvasm
index 055d49b..961b583 100644
--- a/test/tint/loops/continue_in_switch_with_breakif_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/continue_in_switch_with_breakif_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 24
+; Bound: 51
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -9,39 +9,75 @@
OpExecutionMode %f LocalSize 1 1 1
OpName %f "f"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
%void = OpTypeVoid
%3 = OpTypeFunction %void
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %18 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%int_1 = OpConstant %int 1
%int_4 = OpConstant %int 4
- %bool = OpTypeBool
%f = OpFunction %void None %3
%4 = OpLabel
%i = OpVariable %_ptr_Function_int Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %18
OpStore %i %int_0
- OpBranch %11
- %11 = OpLabel
- OpLoopMerge %12 %10 None
OpBranch %9
%9 = OpLabel
- %13 = OpLoad %int %i None
- OpSelectionMerge %16 None
- OpSwitch %13 %14 0 %15
- %15 = OpLabel
- OpBranch %10
- %14 = OpLabel
- OpBranch %16
- %16 = OpLabel
+ OpBranch %12
+ %12 = OpLabel
+ OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
- %17 = OpLoad %int %i None
- %18 = OpIAdd %int %17 %int_1
- OpStore %i %18 None
- %20 = OpLoad %int %i None
- %21 = OpSGreaterThanEqual %bool %20 %int_4
- OpBranchConditional %21 %12 %11
- %12 = OpLabel
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
+ %27 = OpLabel
+ OpBranch %13
+ %26 = OpLabel
+ %28 = OpLoad %int %i None
+ OpSelectionMerge %31 None
+ OpSwitch %28 %29 0 %30
+ %30 = OpLabel
+ OpBranch %11
+ %29 = OpLabel
+ OpBranch %31
+ %31 = OpLabel
+ OpBranch %11
+ %11 = OpLabel
+ %32 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %35 = OpLoad %uint %32 None
+%tint_low_inc = OpIAdd %uint %35 %uint_1
+ %38 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %38 %tint_low_inc None
+ %39 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %39 %uint_1 %uint_0
+ %41 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %42 = OpLoad %uint %41 None
+ %43 = OpIAdd %uint %42 %tint_carry
+ %44 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %44 %43 None
+ %45 = OpLoad %int %i None
+ %46 = OpIAdd %int %45 %int_1
+ OpStore %i %46 None
+ %48 = OpLoad %int %i None
+ %49 = OpSGreaterThanEqual %bool %48 %int_4
+ OpBranchConditional %49 %13 %12
+ %13 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/loops/loop.wgsl.expected.spvasm b/test/tint/loops/loop.wgsl.expected.spvasm
index 7fe64e4..845afba 100644
--- a/test/tint/loops/loop.wgsl.expected.spvasm
+++ b/test/tint/loops/loop.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 35
+; Bound: 62
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -11,6 +11,9 @@
OpName %return_value "return_value"
OpName %continue_execution "continue_execution"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%int = OpTypeInt 32 1
%3 = OpTypeFunction %int
@@ -19,49 +22,82 @@
%bool = OpTypeBool
%_ptr_Function_bool = OpTypePointer Function %bool
%true = OpConstantTrue %bool
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %22 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %25 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %v2bool = OpTypeVector %bool 2
%int_1 = OpConstant %int 1
%int_4 = OpConstant %int 4
%false = OpConstantFalse %bool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%void = OpTypeVoid
- %33 = OpTypeFunction %void
+ %60 = OpTypeFunction %void
%f = OpFunction %int None %3
%4 = OpLabel
%return_value = OpVariable %_ptr_Function_int Function %7
%continue_execution = OpVariable %_ptr_Function_bool Function
%i = OpVariable %_ptr_Function_int Function %7
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %22
OpStore %continue_execution %true
- OpBranch %15
- %15 = OpLabel
- OpLoopMerge %16 %14 None
OpBranch %13
%13 = OpLabel
- %17 = OpLoad %int %i None
- %18 = OpIAdd %int %17 %int_1
- OpStore %i %18 None
- %20 = OpLoad %int %i None
- %21 = OpSGreaterThan %bool %20 %int_4
- OpSelectionMerge %23 None
- OpBranchConditional %21 %24 %23
- %24 = OpLabel
- %25 = OpLoad %int %i None
- OpStore %continue_execution %false None
- OpStore %return_value %25 None
- OpBranch %23
- %23 = OpLabel
- %27 = OpLoad %bool %continue_execution None
- OpSelectionMerge %28 None
- OpBranchConditional %27 %29 %28
- %29 = OpLabel
- OpBranch %14
- %28 = OpLabel
OpBranch %16
- %14 = OpLabel
- OpBranch %15
%16 = OpLabel
- %30 = OpLoad %int %return_value None
- OpReturnValue %30
+ OpLoopMerge %17 %15 None
+ OpBranch %14
+ %14 = OpLabel
+ %23 = OpLoad %v2uint %tint_loop_idx None
+ %24 = OpIEqual %v2bool %23 %25
+ %28 = OpAll %bool %24
+ OpSelectionMerge %29 None
+ OpBranchConditional %28 %30 %29
+ %30 = OpLabel
+ OpBranch %17
+ %29 = OpLabel
+ %31 = OpLoad %int %i None
+ %32 = OpIAdd %int %31 %int_1
+ OpStore %i %32 None
+ %34 = OpLoad %int %i None
+ %35 = OpSGreaterThan %bool %34 %int_4
+ OpSelectionMerge %37 None
+ OpBranchConditional %35 %38 %37
+ %38 = OpLabel
+ %39 = OpLoad %int %i None
+ OpStore %continue_execution %false None
+ OpStore %return_value %39 None
+ OpBranch %37
+ %37 = OpLabel
+ %41 = OpLoad %bool %continue_execution None
+ OpSelectionMerge %42 None
+ OpBranchConditional %41 %43 %42
+ %43 = OpLabel
+ OpBranch %15
+ %42 = OpLabel
+ OpBranch %17
+ %15 = OpLabel
+ %44 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %47 = OpLoad %uint %44 None
+%tint_low_inc = OpIAdd %uint %47 %uint_1
+ %50 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %50 %tint_low_inc None
+ %51 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %51 %uint_1 %uint_0
+ %53 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %54 = OpLoad %uint %53 None
+ %55 = OpIAdd %uint %54 %tint_carry
+ %56 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %56 %55 None
+ OpBranch %16
+ %17 = OpLabel
+ %57 = OpLoad %int %return_value None
+ OpReturnValue %57
OpFunctionEnd
-%unused_entry_point = OpFunction %void None %33
- %34 = OpLabel
+%unused_entry_point = OpFunction %void None %60
+ %61 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/loops/loop_robustness.wgsl.expected.spvasm b/test/tint/loops/loop_robustness.wgsl.expected.spvasm
index 7fe64e4..845afba 100644
--- a/test/tint/loops/loop_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/loop_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 35
+; Bound: 62
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -11,6 +11,9 @@
OpName %return_value "return_value"
OpName %continue_execution "continue_execution"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%int = OpTypeInt 32 1
%3 = OpTypeFunction %int
@@ -19,49 +22,82 @@
%bool = OpTypeBool
%_ptr_Function_bool = OpTypePointer Function %bool
%true = OpConstantTrue %bool
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %22 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %25 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %v2bool = OpTypeVector %bool 2
%int_1 = OpConstant %int 1
%int_4 = OpConstant %int 4
%false = OpConstantFalse %bool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%void = OpTypeVoid
- %33 = OpTypeFunction %void
+ %60 = OpTypeFunction %void
%f = OpFunction %int None %3
%4 = OpLabel
%return_value = OpVariable %_ptr_Function_int Function %7
%continue_execution = OpVariable %_ptr_Function_bool Function
%i = OpVariable %_ptr_Function_int Function %7
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %22
OpStore %continue_execution %true
- OpBranch %15
- %15 = OpLabel
- OpLoopMerge %16 %14 None
OpBranch %13
%13 = OpLabel
- %17 = OpLoad %int %i None
- %18 = OpIAdd %int %17 %int_1
- OpStore %i %18 None
- %20 = OpLoad %int %i None
- %21 = OpSGreaterThan %bool %20 %int_4
- OpSelectionMerge %23 None
- OpBranchConditional %21 %24 %23
- %24 = OpLabel
- %25 = OpLoad %int %i None
- OpStore %continue_execution %false None
- OpStore %return_value %25 None
- OpBranch %23
- %23 = OpLabel
- %27 = OpLoad %bool %continue_execution None
- OpSelectionMerge %28 None
- OpBranchConditional %27 %29 %28
- %29 = OpLabel
- OpBranch %14
- %28 = OpLabel
OpBranch %16
- %14 = OpLabel
- OpBranch %15
%16 = OpLabel
- %30 = OpLoad %int %return_value None
- OpReturnValue %30
+ OpLoopMerge %17 %15 None
+ OpBranch %14
+ %14 = OpLabel
+ %23 = OpLoad %v2uint %tint_loop_idx None
+ %24 = OpIEqual %v2bool %23 %25
+ %28 = OpAll %bool %24
+ OpSelectionMerge %29 None
+ OpBranchConditional %28 %30 %29
+ %30 = OpLabel
+ OpBranch %17
+ %29 = OpLabel
+ %31 = OpLoad %int %i None
+ %32 = OpIAdd %int %31 %int_1
+ OpStore %i %32 None
+ %34 = OpLoad %int %i None
+ %35 = OpSGreaterThan %bool %34 %int_4
+ OpSelectionMerge %37 None
+ OpBranchConditional %35 %38 %37
+ %38 = OpLabel
+ %39 = OpLoad %int %i None
+ OpStore %continue_execution %false None
+ OpStore %return_value %39 None
+ OpBranch %37
+ %37 = OpLabel
+ %41 = OpLoad %bool %continue_execution None
+ OpSelectionMerge %42 None
+ OpBranchConditional %41 %43 %42
+ %43 = OpLabel
+ OpBranch %15
+ %42 = OpLabel
+ OpBranch %17
+ %15 = OpLabel
+ %44 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %47 = OpLoad %uint %44 None
+%tint_low_inc = OpIAdd %uint %47 %uint_1
+ %50 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %50 %tint_low_inc None
+ %51 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %51 %uint_1 %uint_0
+ %53 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %54 = OpLoad %uint %53 None
+ %55 = OpIAdd %uint %54 %tint_carry
+ %56 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %56 %55 None
+ OpBranch %16
+ %17 = OpLabel
+ %57 = OpLoad %int %return_value None
+ OpReturnValue %57
OpFunctionEnd
-%unused_entry_point = OpFunction %void None %33
- %34 = OpLabel
+%unused_entry_point = OpFunction %void None %60
+ %61 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/loops/loop_with_break_if.wgsl.expected.spvasm b/test/tint/loops/loop_with_break_if.wgsl.expected.spvasm
index 4fc5467..a78d9bf 100644
--- a/test/tint/loops/loop_with_break_if.wgsl.expected.spvasm
+++ b/test/tint/loops/loop_with_break_if.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 41
+; Bound: 68
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -11,6 +11,9 @@
OpName %return_value "return_value"
OpName %continue_execution "continue_execution"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%int = OpTypeInt 32 1
%3 = OpTypeFunction %int
@@ -19,59 +22,92 @@
%bool = OpTypeBool
%_ptr_Function_bool = OpTypePointer Function %bool
%true = OpConstantTrue %bool
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %22 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %25 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %v2bool = OpTypeVector %bool 2
%int_4 = OpConstant %int 4
%false = OpConstantFalse %bool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%int_1 = OpConstant %int 1
%void = OpTypeVoid
- %39 = OpTypeFunction %void
+ %66 = OpTypeFunction %void
%f = OpFunction %int None %3
%4 = OpLabel
%return_value = OpVariable %_ptr_Function_int Function %7
%continue_execution = OpVariable %_ptr_Function_bool Function
%i = OpVariable %_ptr_Function_int Function %7
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %22
OpStore %continue_execution %true
- OpBranch %15
- %15 = OpLabel
- OpLoopMerge %16 %14 None
OpBranch %13
%13 = OpLabel
- %17 = OpLoad %int %i None
- %18 = OpSGreaterThan %bool %17 %int_4
- OpSelectionMerge %20 None
- OpBranchConditional %18 %21 %20
- %21 = OpLabel
- %22 = OpLoad %int %i None
- OpStore %continue_execution %false None
- OpStore %return_value %22 None
- OpBranch %20
- %20 = OpLabel
- %24 = OpLoad %bool %continue_execution None
- OpSelectionMerge %25 None
- OpBranchConditional %24 %26 %25
- %26 = OpLabel
- OpBranch %14
- %25 = OpLabel
OpBranch %16
- %14 = OpLabel
- %27 = OpLoad %int %i None
- %28 = OpIAdd %int %27 %int_1
- OpStore %i %28 None
- %30 = OpLoad %int %i None
- %31 = OpIEqual %bool %30 %int_4
- OpBranchConditional %31 %16 %15
%16 = OpLabel
- %32 = OpLoad %bool %continue_execution None
- OpSelectionMerge %33 None
- OpBranchConditional %32 %34 %33
+ OpLoopMerge %17 %15 None
+ OpBranch %14
+ %14 = OpLabel
+ %23 = OpLoad %v2uint %tint_loop_idx None
+ %24 = OpIEqual %v2bool %23 %25
+ %28 = OpAll %bool %24
+ OpSelectionMerge %29 None
+ OpBranchConditional %28 %30 %29
+ %30 = OpLabel
+ OpBranch %17
+ %29 = OpLabel
+ %31 = OpLoad %int %i None
+ %32 = OpSGreaterThan %bool %31 %int_4
+ OpSelectionMerge %34 None
+ OpBranchConditional %32 %35 %34
+ %35 = OpLabel
+ %36 = OpLoad %int %i None
+ OpStore %continue_execution %false None
+ OpStore %return_value %36 None
+ OpBranch %34
%34 = OpLabel
- %35 = OpLoad %int %i None
- OpStore %return_value %35 None
- OpBranch %33
- %33 = OpLabel
- %36 = OpLoad %int %return_value None
- OpReturnValue %36
- OpFunctionEnd
-%unused_entry_point = OpFunction %void None %39
+ %38 = OpLoad %bool %continue_execution None
+ OpSelectionMerge %39 None
+ OpBranchConditional %38 %40 %39
%40 = OpLabel
+ OpBranch %15
+ %39 = OpLabel
+ OpBranch %17
+ %15 = OpLabel
+ %41 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %44 = OpLoad %uint %41 None
+%tint_low_inc = OpIAdd %uint %44 %uint_1
+ %47 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %47 %tint_low_inc None
+ %48 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %48 %uint_1 %uint_0
+ %50 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %51 = OpLoad %uint %50 None
+ %52 = OpIAdd %uint %51 %tint_carry
+ %53 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %53 %52 None
+ %54 = OpLoad %int %i None
+ %55 = OpIAdd %int %54 %int_1
+ OpStore %i %55 None
+ %57 = OpLoad %int %i None
+ %58 = OpIEqual %bool %57 %int_4
+ OpBranchConditional %58 %17 %16
+ %17 = OpLabel
+ %59 = OpLoad %bool %continue_execution None
+ OpSelectionMerge %60 None
+ OpBranchConditional %59 %61 %60
+ %61 = OpLabel
+ %62 = OpLoad %int %i None
+ OpStore %return_value %62 None
+ OpBranch %60
+ %60 = OpLabel
+ %63 = OpLoad %int %return_value None
+ OpReturnValue %63
+ OpFunctionEnd
+%unused_entry_point = OpFunction %void None %66
+ %67 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/loops/loop_with_break_if_robustness.wgsl.expected.spvasm b/test/tint/loops/loop_with_break_if_robustness.wgsl.expected.spvasm
index 4fc5467..a78d9bf 100644
--- a/test/tint/loops/loop_with_break_if_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/loop_with_break_if_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 41
+; Bound: 68
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -11,6 +11,9 @@
OpName %return_value "return_value"
OpName %continue_execution "continue_execution"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%int = OpTypeInt 32 1
%3 = OpTypeFunction %int
@@ -19,59 +22,92 @@
%bool = OpTypeBool
%_ptr_Function_bool = OpTypePointer Function %bool
%true = OpConstantTrue %bool
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %22 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %25 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %v2bool = OpTypeVector %bool 2
%int_4 = OpConstant %int 4
%false = OpConstantFalse %bool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%int_1 = OpConstant %int 1
%void = OpTypeVoid
- %39 = OpTypeFunction %void
+ %66 = OpTypeFunction %void
%f = OpFunction %int None %3
%4 = OpLabel
%return_value = OpVariable %_ptr_Function_int Function %7
%continue_execution = OpVariable %_ptr_Function_bool Function
%i = OpVariable %_ptr_Function_int Function %7
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %22
OpStore %continue_execution %true
- OpBranch %15
- %15 = OpLabel
- OpLoopMerge %16 %14 None
OpBranch %13
%13 = OpLabel
- %17 = OpLoad %int %i None
- %18 = OpSGreaterThan %bool %17 %int_4
- OpSelectionMerge %20 None
- OpBranchConditional %18 %21 %20
- %21 = OpLabel
- %22 = OpLoad %int %i None
- OpStore %continue_execution %false None
- OpStore %return_value %22 None
- OpBranch %20
- %20 = OpLabel
- %24 = OpLoad %bool %continue_execution None
- OpSelectionMerge %25 None
- OpBranchConditional %24 %26 %25
- %26 = OpLabel
- OpBranch %14
- %25 = OpLabel
OpBranch %16
- %14 = OpLabel
- %27 = OpLoad %int %i None
- %28 = OpIAdd %int %27 %int_1
- OpStore %i %28 None
- %30 = OpLoad %int %i None
- %31 = OpIEqual %bool %30 %int_4
- OpBranchConditional %31 %16 %15
%16 = OpLabel
- %32 = OpLoad %bool %continue_execution None
- OpSelectionMerge %33 None
- OpBranchConditional %32 %34 %33
+ OpLoopMerge %17 %15 None
+ OpBranch %14
+ %14 = OpLabel
+ %23 = OpLoad %v2uint %tint_loop_idx None
+ %24 = OpIEqual %v2bool %23 %25
+ %28 = OpAll %bool %24
+ OpSelectionMerge %29 None
+ OpBranchConditional %28 %30 %29
+ %30 = OpLabel
+ OpBranch %17
+ %29 = OpLabel
+ %31 = OpLoad %int %i None
+ %32 = OpSGreaterThan %bool %31 %int_4
+ OpSelectionMerge %34 None
+ OpBranchConditional %32 %35 %34
+ %35 = OpLabel
+ %36 = OpLoad %int %i None
+ OpStore %continue_execution %false None
+ OpStore %return_value %36 None
+ OpBranch %34
%34 = OpLabel
- %35 = OpLoad %int %i None
- OpStore %return_value %35 None
- OpBranch %33
- %33 = OpLabel
- %36 = OpLoad %int %return_value None
- OpReturnValue %36
- OpFunctionEnd
-%unused_entry_point = OpFunction %void None %39
+ %38 = OpLoad %bool %continue_execution None
+ OpSelectionMerge %39 None
+ OpBranchConditional %38 %40 %39
%40 = OpLabel
+ OpBranch %15
+ %39 = OpLabel
+ OpBranch %17
+ %15 = OpLabel
+ %41 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %44 = OpLoad %uint %41 None
+%tint_low_inc = OpIAdd %uint %44 %uint_1
+ %47 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %47 %tint_low_inc None
+ %48 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %48 %uint_1 %uint_0
+ %50 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %51 = OpLoad %uint %50 None
+ %52 = OpIAdd %uint %51 %tint_carry
+ %53 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %53 %52 None
+ %54 = OpLoad %int %i None
+ %55 = OpIAdd %int %54 %int_1
+ OpStore %i %55 None
+ %57 = OpLoad %int %i None
+ %58 = OpIEqual %bool %57 %int_4
+ OpBranchConditional %58 %17 %16
+ %17 = OpLabel
+ %59 = OpLoad %bool %continue_execution None
+ OpSelectionMerge %60 None
+ OpBranchConditional %59 %61 %60
+ %61 = OpLabel
+ %62 = OpLoad %int %i None
+ OpStore %return_value %62 None
+ OpBranch %60
+ %60 = OpLabel
+ %63 = OpLoad %int %return_value None
+ OpReturnValue %63
+ OpFunctionEnd
+%unused_entry_point = OpFunction %void None %66
+ %67 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/loops/loop_with_continuing.wgsl.expected.spvasm b/test/tint/loops/loop_with_continuing.wgsl.expected.spvasm
index b0c081c..8a4a5b5 100644
--- a/test/tint/loops/loop_with_continuing.wgsl.expected.spvasm
+++ b/test/tint/loops/loop_with_continuing.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 35
+; Bound: 62
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -11,6 +11,9 @@
OpName %return_value "return_value"
OpName %continue_execution "continue_execution"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%int = OpTypeInt 32 1
%3 = OpTypeFunction %int
@@ -19,49 +22,82 @@
%bool = OpTypeBool
%_ptr_Function_bool = OpTypePointer Function %bool
%true = OpConstantTrue %bool
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %22 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %25 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %v2bool = OpTypeVector %bool 2
%int_4 = OpConstant %int 4
%false = OpConstantFalse %bool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%int_1 = OpConstant %int 1
%void = OpTypeVoid
- %33 = OpTypeFunction %void
+ %60 = OpTypeFunction %void
%f = OpFunction %int None %3
%4 = OpLabel
%return_value = OpVariable %_ptr_Function_int Function %7
%continue_execution = OpVariable %_ptr_Function_bool Function
%i = OpVariable %_ptr_Function_int Function %7
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %22
OpStore %continue_execution %true
- OpBranch %15
- %15 = OpLabel
- OpLoopMerge %16 %14 None
OpBranch %13
%13 = OpLabel
- %17 = OpLoad %int %i None
- %18 = OpSGreaterThan %bool %17 %int_4
- OpSelectionMerge %20 None
- OpBranchConditional %18 %21 %20
- %21 = OpLabel
- %22 = OpLoad %int %i None
- OpStore %continue_execution %false None
- OpStore %return_value %22 None
- OpBranch %20
- %20 = OpLabel
- %24 = OpLoad %bool %continue_execution None
- OpSelectionMerge %25 None
- OpBranchConditional %24 %26 %25
- %26 = OpLabel
- OpBranch %14
- %25 = OpLabel
OpBranch %16
- %14 = OpLabel
- %27 = OpLoad %int %i None
- %28 = OpIAdd %int %27 %int_1
- OpStore %i %28 None
- OpBranch %15
%16 = OpLabel
- %30 = OpLoad %int %return_value None
- OpReturnValue %30
- OpFunctionEnd
-%unused_entry_point = OpFunction %void None %33
+ OpLoopMerge %17 %15 None
+ OpBranch %14
+ %14 = OpLabel
+ %23 = OpLoad %v2uint %tint_loop_idx None
+ %24 = OpIEqual %v2bool %23 %25
+ %28 = OpAll %bool %24
+ OpSelectionMerge %29 None
+ OpBranchConditional %28 %30 %29
+ %30 = OpLabel
+ OpBranch %17
+ %29 = OpLabel
+ %31 = OpLoad %int %i None
+ %32 = OpSGreaterThan %bool %31 %int_4
+ OpSelectionMerge %34 None
+ OpBranchConditional %32 %35 %34
+ %35 = OpLabel
+ %36 = OpLoad %int %i None
+ OpStore %continue_execution %false None
+ OpStore %return_value %36 None
+ OpBranch %34
%34 = OpLabel
+ %38 = OpLoad %bool %continue_execution None
+ OpSelectionMerge %39 None
+ OpBranchConditional %38 %40 %39
+ %40 = OpLabel
+ OpBranch %15
+ %39 = OpLabel
+ OpBranch %17
+ %15 = OpLabel
+ %41 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %44 = OpLoad %uint %41 None
+%tint_low_inc = OpIAdd %uint %44 %uint_1
+ %47 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %47 %tint_low_inc None
+ %48 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %48 %uint_1 %uint_0
+ %50 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %51 = OpLoad %uint %50 None
+ %52 = OpIAdd %uint %51 %tint_carry
+ %53 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %53 %52 None
+ %54 = OpLoad %int %i None
+ %55 = OpIAdd %int %54 %int_1
+ OpStore %i %55 None
+ OpBranch %16
+ %17 = OpLabel
+ %57 = OpLoad %int %return_value None
+ OpReturnValue %57
+ OpFunctionEnd
+%unused_entry_point = OpFunction %void None %60
+ %61 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/loops/loop_with_continuing_robustness.wgsl.expected.spvasm b/test/tint/loops/loop_with_continuing_robustness.wgsl.expected.spvasm
index b0c081c..8a4a5b5 100644
--- a/test/tint/loops/loop_with_continuing_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/loop_with_continuing_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 35
+; Bound: 62
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -11,6 +11,9 @@
OpName %return_value "return_value"
OpName %continue_execution "continue_execution"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%int = OpTypeInt 32 1
%3 = OpTypeFunction %int
@@ -19,49 +22,82 @@
%bool = OpTypeBool
%_ptr_Function_bool = OpTypePointer Function %bool
%true = OpConstantTrue %bool
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %22 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %25 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %v2bool = OpTypeVector %bool 2
%int_4 = OpConstant %int 4
%false = OpConstantFalse %bool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%int_1 = OpConstant %int 1
%void = OpTypeVoid
- %33 = OpTypeFunction %void
+ %60 = OpTypeFunction %void
%f = OpFunction %int None %3
%4 = OpLabel
%return_value = OpVariable %_ptr_Function_int Function %7
%continue_execution = OpVariable %_ptr_Function_bool Function
%i = OpVariable %_ptr_Function_int Function %7
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %22
OpStore %continue_execution %true
- OpBranch %15
- %15 = OpLabel
- OpLoopMerge %16 %14 None
OpBranch %13
%13 = OpLabel
- %17 = OpLoad %int %i None
- %18 = OpSGreaterThan %bool %17 %int_4
- OpSelectionMerge %20 None
- OpBranchConditional %18 %21 %20
- %21 = OpLabel
- %22 = OpLoad %int %i None
- OpStore %continue_execution %false None
- OpStore %return_value %22 None
- OpBranch %20
- %20 = OpLabel
- %24 = OpLoad %bool %continue_execution None
- OpSelectionMerge %25 None
- OpBranchConditional %24 %26 %25
- %26 = OpLabel
- OpBranch %14
- %25 = OpLabel
OpBranch %16
- %14 = OpLabel
- %27 = OpLoad %int %i None
- %28 = OpIAdd %int %27 %int_1
- OpStore %i %28 None
- OpBranch %15
%16 = OpLabel
- %30 = OpLoad %int %return_value None
- OpReturnValue %30
- OpFunctionEnd
-%unused_entry_point = OpFunction %void None %33
+ OpLoopMerge %17 %15 None
+ OpBranch %14
+ %14 = OpLabel
+ %23 = OpLoad %v2uint %tint_loop_idx None
+ %24 = OpIEqual %v2bool %23 %25
+ %28 = OpAll %bool %24
+ OpSelectionMerge %29 None
+ OpBranchConditional %28 %30 %29
+ %30 = OpLabel
+ OpBranch %17
+ %29 = OpLabel
+ %31 = OpLoad %int %i None
+ %32 = OpSGreaterThan %bool %31 %int_4
+ OpSelectionMerge %34 None
+ OpBranchConditional %32 %35 %34
+ %35 = OpLabel
+ %36 = OpLoad %int %i None
+ OpStore %continue_execution %false None
+ OpStore %return_value %36 None
+ OpBranch %34
%34 = OpLabel
+ %38 = OpLoad %bool %continue_execution None
+ OpSelectionMerge %39 None
+ OpBranchConditional %38 %40 %39
+ %40 = OpLabel
+ OpBranch %15
+ %39 = OpLabel
+ OpBranch %17
+ %15 = OpLabel
+ %41 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %44 = OpLoad %uint %41 None
+%tint_low_inc = OpIAdd %uint %44 %uint_1
+ %47 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %47 %tint_low_inc None
+ %48 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %48 %uint_1 %uint_0
+ %50 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %51 = OpLoad %uint %50 None
+ %52 = OpIAdd %uint %51 %tint_carry
+ %53 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %53 %52 None
+ %54 = OpLoad %int %i None
+ %55 = OpIAdd %int %54 %int_1
+ OpStore %i %55 None
+ OpBranch %16
+ %17 = OpLabel
+ %57 = OpLoad %int %return_value None
+ OpReturnValue %57
+ OpFunctionEnd
+%unused_entry_point = OpFunction %void None %60
+ %61 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/loops/nested_loop_loop_switch.wgsl.expected.spvasm b/test/tint/loops/nested_loop_loop_switch.wgsl.expected.spvasm
index 119b05c..4f70bea 100644
--- a/test/tint/loops/nested_loop_loop_switch.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loop_loop_switch.wgsl.expected.spvasm
@@ -1,25 +1,43 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 38
+; Bound: 80
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main"
OpExecutionMode %main LocalSize 1 1 1
OpName %main "main"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %i "i"
+ OpName %tint_loop_idx_0 "tint_loop_idx"
OpName %j "j"
+ OpName %tint_low_inc_1 "tint_low_inc_1"
+ OpName %tint_carry_1 "tint_carry_1"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
%void = OpTypeVoid
%3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %14 = OpConstantNull %v2uint
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
- %int_2 = OpConstant %int 2
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %int_2 = OpConstant %int 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%main = OpFunction %void None %3
%4 = OpLabel
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %14
%i = OpVariable %_ptr_Function_int Function
+%tint_loop_idx_0 = OpVariable %_ptr_Function_v2uint Function %14
%j = OpVariable %_ptr_Function_int Function
OpBranch %5
%5 = OpLabel
@@ -29,48 +47,88 @@
OpLoopMerge %9 %7 None
OpBranch %6
%6 = OpLabel
- %14 = OpLoad %int %i None
- %15 = OpSLessThan %bool %14 %int_2
- OpSelectionMerge %18 None
- OpBranchConditional %15 %18 %19
- %19 = OpLabel
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
+ %27 = OpLabel
OpBranch %9
- %18 = OpLabel
- OpBranch %20
- %20 = OpLabel
- OpStore %j %int_0
- OpBranch %23
- %23 = OpLabel
- OpLoopMerge %24 %22 None
- OpBranch %21
- %21 = OpLabel
- %26 = OpLoad %int %j None
- %27 = OpSLessThan %bool %26 %int_2
- OpSelectionMerge %28 None
- OpBranchConditional %27 %28 %29
- %29 = OpLabel
- OpBranch %24
- %28 = OpLabel
- %30 = OpLoad %int %i None
- OpSelectionMerge %33 None
- OpSwitch %30 %31 0 %32
+ %26 = OpLabel
+ %28 = OpLoad %int %i None
+ %29 = OpSLessThan %bool %28 %int_2
+ OpSelectionMerge %31 None
+ OpBranchConditional %29 %31 %32
%32 = OpLabel
- OpBranch %22
+ OpBranch %9
%31 = OpLabel
OpBranch %33
%33 = OpLabel
- OpBranch %22
- %22 = OpLabel
- %34 = OpLoad %int %j None
- %35 = OpIAdd %int %34 %int_2
- OpStore %j %35 None
- OpBranch %23
- %24 = OpLabel
+ OpStore %j %int_0
+ OpBranch %36
+ %36 = OpLabel
+ OpLoopMerge %37 %35 None
+ OpBranch %34
+ %34 = OpLabel
+ %40 = OpLoad %v2uint %tint_loop_idx_0 None
+ %41 = OpIEqual %v2bool %40 %21
+ %42 = OpAll %bool %41
+ OpSelectionMerge %43 None
+ OpBranchConditional %42 %44 %43
+ %44 = OpLabel
+ OpBranch %37
+ %43 = OpLabel
+ %45 = OpLoad %int %j None
+ %46 = OpSLessThan %bool %45 %int_2
+ OpSelectionMerge %47 None
+ OpBranchConditional %46 %47 %48
+ %48 = OpLabel
+ OpBranch %37
+ %47 = OpLabel
+ %49 = OpLoad %int %i None
+ OpSelectionMerge %52 None
+ OpSwitch %49 %50 0 %51
+ %51 = OpLabel
+ OpBranch %35
+ %50 = OpLabel
+ OpBranch %52
+ %52 = OpLabel
+ OpBranch %35
+ %35 = OpLabel
+ %53 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ %56 = OpLoad %uint %53 None
+%tint_low_inc_1 = OpIAdd %uint %56 %uint_1
+ %59 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ OpStore %59 %tint_low_inc_1 None
+ %60 = OpIEqual %bool %tint_low_inc_1 %uint_0
+%tint_carry_1 = OpSelect %uint %60 %uint_1 %uint_0
+ %62 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ %63 = OpLoad %uint %62 None
+ %64 = OpIAdd %uint %63 %tint_carry_1
+ %65 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ OpStore %65 %64 None
+ %66 = OpLoad %int %j None
+ %67 = OpIAdd %int %66 %int_2
+ OpStore %j %67 None
+ OpBranch %36
+ %37 = OpLabel
OpBranch %7
%7 = OpLabel
- %36 = OpLoad %int %i None
- %37 = OpIAdd %int %36 %int_2
- OpStore %i %37 None
+ %68 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %69 = OpLoad %uint %68 None
+%tint_low_inc = OpIAdd %uint %69 %uint_1
+ %71 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %71 %tint_low_inc None
+ %72 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %72 %uint_1 %uint_0
+ %74 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %75 = OpLoad %uint %74 None
+ %76 = OpIAdd %uint %75 %tint_carry
+ %77 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %77 %76 None
+ %78 = OpLoad %int %i None
+ %79 = OpIAdd %int %78 %int_2
+ OpStore %i %79 None
OpBranch %8
%9 = OpLabel
OpReturn
diff --git a/test/tint/loops/nested_loop_loop_switch_robustness.wgsl.expected.spvasm b/test/tint/loops/nested_loop_loop_switch_robustness.wgsl.expected.spvasm
index 119b05c..4f70bea 100644
--- a/test/tint/loops/nested_loop_loop_switch_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loop_loop_switch_robustness.wgsl.expected.spvasm
@@ -1,25 +1,43 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 38
+; Bound: 80
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main"
OpExecutionMode %main LocalSize 1 1 1
OpName %main "main"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %i "i"
+ OpName %tint_loop_idx_0 "tint_loop_idx"
OpName %j "j"
+ OpName %tint_low_inc_1 "tint_low_inc_1"
+ OpName %tint_carry_1 "tint_carry_1"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
%void = OpTypeVoid
%3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %14 = OpConstantNull %v2uint
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
- %int_2 = OpConstant %int 2
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %int_2 = OpConstant %int 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%main = OpFunction %void None %3
%4 = OpLabel
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %14
%i = OpVariable %_ptr_Function_int Function
+%tint_loop_idx_0 = OpVariable %_ptr_Function_v2uint Function %14
%j = OpVariable %_ptr_Function_int Function
OpBranch %5
%5 = OpLabel
@@ -29,48 +47,88 @@
OpLoopMerge %9 %7 None
OpBranch %6
%6 = OpLabel
- %14 = OpLoad %int %i None
- %15 = OpSLessThan %bool %14 %int_2
- OpSelectionMerge %18 None
- OpBranchConditional %15 %18 %19
- %19 = OpLabel
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
+ %27 = OpLabel
OpBranch %9
- %18 = OpLabel
- OpBranch %20
- %20 = OpLabel
- OpStore %j %int_0
- OpBranch %23
- %23 = OpLabel
- OpLoopMerge %24 %22 None
- OpBranch %21
- %21 = OpLabel
- %26 = OpLoad %int %j None
- %27 = OpSLessThan %bool %26 %int_2
- OpSelectionMerge %28 None
- OpBranchConditional %27 %28 %29
- %29 = OpLabel
- OpBranch %24
- %28 = OpLabel
- %30 = OpLoad %int %i None
- OpSelectionMerge %33 None
- OpSwitch %30 %31 0 %32
+ %26 = OpLabel
+ %28 = OpLoad %int %i None
+ %29 = OpSLessThan %bool %28 %int_2
+ OpSelectionMerge %31 None
+ OpBranchConditional %29 %31 %32
%32 = OpLabel
- OpBranch %22
+ OpBranch %9
%31 = OpLabel
OpBranch %33
%33 = OpLabel
- OpBranch %22
- %22 = OpLabel
- %34 = OpLoad %int %j None
- %35 = OpIAdd %int %34 %int_2
- OpStore %j %35 None
- OpBranch %23
- %24 = OpLabel
+ OpStore %j %int_0
+ OpBranch %36
+ %36 = OpLabel
+ OpLoopMerge %37 %35 None
+ OpBranch %34
+ %34 = OpLabel
+ %40 = OpLoad %v2uint %tint_loop_idx_0 None
+ %41 = OpIEqual %v2bool %40 %21
+ %42 = OpAll %bool %41
+ OpSelectionMerge %43 None
+ OpBranchConditional %42 %44 %43
+ %44 = OpLabel
+ OpBranch %37
+ %43 = OpLabel
+ %45 = OpLoad %int %j None
+ %46 = OpSLessThan %bool %45 %int_2
+ OpSelectionMerge %47 None
+ OpBranchConditional %46 %47 %48
+ %48 = OpLabel
+ OpBranch %37
+ %47 = OpLabel
+ %49 = OpLoad %int %i None
+ OpSelectionMerge %52 None
+ OpSwitch %49 %50 0 %51
+ %51 = OpLabel
+ OpBranch %35
+ %50 = OpLabel
+ OpBranch %52
+ %52 = OpLabel
+ OpBranch %35
+ %35 = OpLabel
+ %53 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ %56 = OpLoad %uint %53 None
+%tint_low_inc_1 = OpIAdd %uint %56 %uint_1
+ %59 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ OpStore %59 %tint_low_inc_1 None
+ %60 = OpIEqual %bool %tint_low_inc_1 %uint_0
+%tint_carry_1 = OpSelect %uint %60 %uint_1 %uint_0
+ %62 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ %63 = OpLoad %uint %62 None
+ %64 = OpIAdd %uint %63 %tint_carry_1
+ %65 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ OpStore %65 %64 None
+ %66 = OpLoad %int %j None
+ %67 = OpIAdd %int %66 %int_2
+ OpStore %j %67 None
+ OpBranch %36
+ %37 = OpLabel
OpBranch %7
%7 = OpLabel
- %36 = OpLoad %int %i None
- %37 = OpIAdd %int %36 %int_2
- OpStore %i %37 None
+ %68 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %69 = OpLoad %uint %68 None
+%tint_low_inc = OpIAdd %uint %69 %uint_1
+ %71 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %71 %tint_low_inc None
+ %72 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %72 %uint_1 %uint_0
+ %74 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %75 = OpLoad %uint %74 None
+ %76 = OpIAdd %uint %75 %tint_carry
+ %77 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %77 %76 None
+ %78 = OpLoad %int %i None
+ %79 = OpIAdd %int %78 %int_2
+ OpStore %i %79 None
OpBranch %8
%9 = OpLabel
OpReturn
diff --git a/test/tint/loops/nested_loop_switch_loop_switch.wgsl.expected.spvasm b/test/tint/loops/nested_loop_switch_loop_switch.wgsl.expected.spvasm
index f90fd45..e4ad29c 100644
--- a/test/tint/loops/nested_loop_switch_loop_switch.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loop_switch_loop_switch.wgsl.expected.spvasm
@@ -1,25 +1,43 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 42
+; Bound: 84
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main"
OpExecutionMode %main LocalSize 1 1 1
OpName %main "main"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %i "i"
+ OpName %tint_loop_idx_0 "tint_loop_idx"
OpName %j "j"
+ OpName %tint_low_inc_1 "tint_low_inc_1"
+ OpName %tint_carry_1 "tint_carry_1"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
%void = OpTypeVoid
%3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %14 = OpConstantNull %v2uint
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
- %int_2 = OpConstant %int 2
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %int_2 = OpConstant %int 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%main = OpFunction %void None %3
%4 = OpLabel
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %14
%i = OpVariable %_ptr_Function_int Function
+%tint_loop_idx_0 = OpVariable %_ptr_Function_v2uint Function %14
%j = OpVariable %_ptr_Function_int Function
OpBranch %5
%5 = OpLabel
@@ -29,56 +47,96 @@
OpLoopMerge %9 %7 None
OpBranch %6
%6 = OpLabel
- %14 = OpLoad %int %i None
- %15 = OpSLessThan %bool %14 %int_2
- OpSelectionMerge %18 None
- OpBranchConditional %15 %18 %19
- %19 = OpLabel
- OpBranch %9
- %18 = OpLabel
- %20 = OpLoad %int %i None
- OpSelectionMerge %23 None
- OpSwitch %20 %21 0 %22
- %22 = OpLabel
- OpBranch %24
- %24 = OpLabel
- OpStore %j %int_0
- OpBranch %27
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
%27 = OpLabel
- OpLoopMerge %28 %26 None
- OpBranch %25
- %25 = OpLabel
- %30 = OpLoad %int %j None
- %31 = OpSLessThan %bool %30 %int_2
- OpSelectionMerge %32 None
- OpBranchConditional %31 %32 %33
- %33 = OpLabel
- OpBranch %28
+ OpBranch %9
+ %26 = OpLabel
+ %28 = OpLoad %int %i None
+ %29 = OpSLessThan %bool %28 %int_2
+ OpSelectionMerge %31 None
+ OpBranchConditional %29 %31 %32
%32 = OpLabel
- %34 = OpLoad %int %j None
- OpSelectionMerge %37 None
- OpSwitch %34 %35 0 %36
- %36 = OpLabel
- OpBranch %26
+ OpBranch %9
+ %31 = OpLabel
+ %33 = OpLoad %int %i None
+ OpSelectionMerge %36 None
+ OpSwitch %33 %34 0 %35
%35 = OpLabel
OpBranch %37
%37 = OpLabel
- OpBranch %26
- %26 = OpLabel
- %38 = OpLoad %int %j None
- %39 = OpIAdd %int %38 %int_2
- OpStore %j %39 None
- OpBranch %27
- %28 = OpLabel
+ OpStore %j %int_0
+ OpBranch %40
+ %40 = OpLabel
+ OpLoopMerge %41 %39 None
+ OpBranch %38
+ %38 = OpLabel
+ %44 = OpLoad %v2uint %tint_loop_idx_0 None
+ %45 = OpIEqual %v2bool %44 %21
+ %46 = OpAll %bool %45
+ OpSelectionMerge %47 None
+ OpBranchConditional %46 %48 %47
+ %48 = OpLabel
+ OpBranch %41
+ %47 = OpLabel
+ %49 = OpLoad %int %j None
+ %50 = OpSLessThan %bool %49 %int_2
+ OpSelectionMerge %51 None
+ OpBranchConditional %50 %51 %52
+ %52 = OpLabel
+ OpBranch %41
+ %51 = OpLabel
+ %53 = OpLoad %int %j None
+ OpSelectionMerge %56 None
+ OpSwitch %53 %54 0 %55
+ %55 = OpLabel
+ OpBranch %39
+ %54 = OpLabel
+ OpBranch %56
+ %56 = OpLabel
+ OpBranch %39
+ %39 = OpLabel
+ %57 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ %60 = OpLoad %uint %57 None
+%tint_low_inc_1 = OpIAdd %uint %60 %uint_1
+ %63 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ OpStore %63 %tint_low_inc_1 None
+ %64 = OpIEqual %bool %tint_low_inc_1 %uint_0
+%tint_carry_1 = OpSelect %uint %64 %uint_1 %uint_0
+ %66 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ %67 = OpLoad %uint %66 None
+ %68 = OpIAdd %uint %67 %tint_carry_1
+ %69 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ OpStore %69 %68 None
+ %70 = OpLoad %int %j None
+ %71 = OpIAdd %int %70 %int_2
+ OpStore %j %71 None
+ OpBranch %40
+ %41 = OpLabel
OpBranch %7
- %21 = OpLabel
- OpBranch %23
- %23 = OpLabel
+ %34 = OpLabel
+ OpBranch %36
+ %36 = OpLabel
OpBranch %7
%7 = OpLabel
- %40 = OpLoad %int %i None
- %41 = OpIAdd %int %40 %int_2
- OpStore %i %41 None
+ %72 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %73 = OpLoad %uint %72 None
+%tint_low_inc = OpIAdd %uint %73 %uint_1
+ %75 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %75 %tint_low_inc None
+ %76 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %76 %uint_1 %uint_0
+ %78 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %79 = OpLoad %uint %78 None
+ %80 = OpIAdd %uint %79 %tint_carry
+ %81 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %81 %80 None
+ %82 = OpLoad %int %i None
+ %83 = OpIAdd %int %82 %int_2
+ OpStore %i %83 None
OpBranch %8
%9 = OpLabel
OpReturn
diff --git a/test/tint/loops/nested_loop_switch_loop_switch_robustness.wgsl.expected.spvasm b/test/tint/loops/nested_loop_switch_loop_switch_robustness.wgsl.expected.spvasm
index f90fd45..e4ad29c 100644
--- a/test/tint/loops/nested_loop_switch_loop_switch_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loop_switch_loop_switch_robustness.wgsl.expected.spvasm
@@ -1,25 +1,43 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 42
+; Bound: 84
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main"
OpExecutionMode %main LocalSize 1 1 1
OpName %main "main"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %i "i"
+ OpName %tint_loop_idx_0 "tint_loop_idx"
OpName %j "j"
+ OpName %tint_low_inc_1 "tint_low_inc_1"
+ OpName %tint_carry_1 "tint_carry_1"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
%void = OpTypeVoid
%3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %14 = OpConstantNull %v2uint
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
- %int_2 = OpConstant %int 2
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %int_2 = OpConstant %int 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%main = OpFunction %void None %3
%4 = OpLabel
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %14
%i = OpVariable %_ptr_Function_int Function
+%tint_loop_idx_0 = OpVariable %_ptr_Function_v2uint Function %14
%j = OpVariable %_ptr_Function_int Function
OpBranch %5
%5 = OpLabel
@@ -29,56 +47,96 @@
OpLoopMerge %9 %7 None
OpBranch %6
%6 = OpLabel
- %14 = OpLoad %int %i None
- %15 = OpSLessThan %bool %14 %int_2
- OpSelectionMerge %18 None
- OpBranchConditional %15 %18 %19
- %19 = OpLabel
- OpBranch %9
- %18 = OpLabel
- %20 = OpLoad %int %i None
- OpSelectionMerge %23 None
- OpSwitch %20 %21 0 %22
- %22 = OpLabel
- OpBranch %24
- %24 = OpLabel
- OpStore %j %int_0
- OpBranch %27
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
%27 = OpLabel
- OpLoopMerge %28 %26 None
- OpBranch %25
- %25 = OpLabel
- %30 = OpLoad %int %j None
- %31 = OpSLessThan %bool %30 %int_2
- OpSelectionMerge %32 None
- OpBranchConditional %31 %32 %33
- %33 = OpLabel
- OpBranch %28
+ OpBranch %9
+ %26 = OpLabel
+ %28 = OpLoad %int %i None
+ %29 = OpSLessThan %bool %28 %int_2
+ OpSelectionMerge %31 None
+ OpBranchConditional %29 %31 %32
%32 = OpLabel
- %34 = OpLoad %int %j None
- OpSelectionMerge %37 None
- OpSwitch %34 %35 0 %36
- %36 = OpLabel
- OpBranch %26
+ OpBranch %9
+ %31 = OpLabel
+ %33 = OpLoad %int %i None
+ OpSelectionMerge %36 None
+ OpSwitch %33 %34 0 %35
%35 = OpLabel
OpBranch %37
%37 = OpLabel
- OpBranch %26
- %26 = OpLabel
- %38 = OpLoad %int %j None
- %39 = OpIAdd %int %38 %int_2
- OpStore %j %39 None
- OpBranch %27
- %28 = OpLabel
+ OpStore %j %int_0
+ OpBranch %40
+ %40 = OpLabel
+ OpLoopMerge %41 %39 None
+ OpBranch %38
+ %38 = OpLabel
+ %44 = OpLoad %v2uint %tint_loop_idx_0 None
+ %45 = OpIEqual %v2bool %44 %21
+ %46 = OpAll %bool %45
+ OpSelectionMerge %47 None
+ OpBranchConditional %46 %48 %47
+ %48 = OpLabel
+ OpBranch %41
+ %47 = OpLabel
+ %49 = OpLoad %int %j None
+ %50 = OpSLessThan %bool %49 %int_2
+ OpSelectionMerge %51 None
+ OpBranchConditional %50 %51 %52
+ %52 = OpLabel
+ OpBranch %41
+ %51 = OpLabel
+ %53 = OpLoad %int %j None
+ OpSelectionMerge %56 None
+ OpSwitch %53 %54 0 %55
+ %55 = OpLabel
+ OpBranch %39
+ %54 = OpLabel
+ OpBranch %56
+ %56 = OpLabel
+ OpBranch %39
+ %39 = OpLabel
+ %57 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ %60 = OpLoad %uint %57 None
+%tint_low_inc_1 = OpIAdd %uint %60 %uint_1
+ %63 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ OpStore %63 %tint_low_inc_1 None
+ %64 = OpIEqual %bool %tint_low_inc_1 %uint_0
+%tint_carry_1 = OpSelect %uint %64 %uint_1 %uint_0
+ %66 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ %67 = OpLoad %uint %66 None
+ %68 = OpIAdd %uint %67 %tint_carry_1
+ %69 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ OpStore %69 %68 None
+ %70 = OpLoad %int %j None
+ %71 = OpIAdd %int %70 %int_2
+ OpStore %j %71 None
+ OpBranch %40
+ %41 = OpLabel
OpBranch %7
- %21 = OpLabel
- OpBranch %23
- %23 = OpLabel
+ %34 = OpLabel
+ OpBranch %36
+ %36 = OpLabel
OpBranch %7
%7 = OpLabel
- %40 = OpLoad %int %i None
- %41 = OpIAdd %int %40 %int_2
- OpStore %i %41 None
+ %72 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %73 = OpLoad %uint %72 None
+%tint_low_inc = OpIAdd %uint %73 %uint_1
+ %75 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %75 %tint_low_inc None
+ %76 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %76 %uint_1 %uint_0
+ %78 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %79 = OpLoad %uint %78 None
+ %80 = OpIAdd %uint %79 %tint_carry
+ %81 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %81 %80 None
+ %82 = OpLoad %int %i None
+ %83 = OpIAdd %int %82 %int_2
+ OpStore %i %83 None
OpBranch %8
%9 = OpLabel
OpReturn
diff --git a/test/tint/loops/nested_loop_switch_loop_switch_switch.wgsl.expected.spvasm b/test/tint/loops/nested_loop_switch_loop_switch_switch.wgsl.expected.spvasm
index d49a469..9fc4100 100644
--- a/test/tint/loops/nested_loop_switch_loop_switch_switch.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loop_switch_loop_switch_switch.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 48
+; Bound: 90
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -9,19 +9,37 @@
OpExecutionMode %main LocalSize 1 1 1
OpName %main "main"
OpName %k "k"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %i "i"
+ OpName %tint_loop_idx_0 "tint_loop_idx"
OpName %j "j"
+ OpName %tint_low_inc_1 "tint_low_inc_1"
+ OpName %tint_carry_1 "tint_carry_1"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
%void = OpTypeVoid
%3 = OpTypeFunction %void
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
- %int_2 = OpConstant %int 2
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %18 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %22 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %int_2 = OpConstant %int 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%main = OpFunction %void None %3
%4 = OpLabel
%k = OpVariable %_ptr_Function_int Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %18
%i = OpVariable %_ptr_Function_int Function
+%tint_loop_idx_0 = OpVariable %_ptr_Function_v2uint Function %18
%j = OpVariable %_ptr_Function_int Function
OpStore %k %int_0
OpBranch %9
@@ -32,66 +50,106 @@
OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
- %15 = OpLoad %int %i None
- %16 = OpSLessThan %bool %15 %int_2
- OpSelectionMerge %19 None
- OpBranchConditional %16 %19 %20
- %20 = OpLabel
- OpBranch %13
- %19 = OpLabel
- %21 = OpLoad %int %i None
- OpSelectionMerge %24 None
- OpSwitch %21 %22 0 %23
- %23 = OpLabel
- OpBranch %25
- %25 = OpLabel
- OpStore %j %int_0
- OpBranch %28
+ %20 = OpLoad %v2uint %tint_loop_idx None
+ %21 = OpIEqual %v2bool %20 %22
+ %26 = OpAll %bool %21
+ OpSelectionMerge %27 None
+ OpBranchConditional %26 %28 %27
%28 = OpLabel
- OpLoopMerge %29 %27 None
- OpBranch %26
- %26 = OpLabel
- %31 = OpLoad %int %j None
- %32 = OpSLessThan %bool %31 %int_2
- OpSelectionMerge %33 None
- OpBranchConditional %32 %33 %34
- %34 = OpLabel
- OpBranch %29
+ OpBranch %13
+ %27 = OpLabel
+ %29 = OpLoad %int %i None
+ %30 = OpSLessThan %bool %29 %int_2
+ OpSelectionMerge %32 None
+ OpBranchConditional %30 %32 %33
%33 = OpLabel
- %35 = OpLoad %int %j None
- OpSelectionMerge %39 None
- OpSwitch %35 %36 0 %37 1 %38
- %37 = OpLabel
- OpBranch %27
- %38 = OpLabel
- %40 = OpLoad %int %k None
- OpSelectionMerge %43 None
- OpSwitch %40 %41 0 %42
- %42 = OpLabel
- OpBranch %27
- %41 = OpLabel
- OpBranch %43
- %43 = OpLabel
- OpBranch %39
+ OpBranch %13
+ %32 = OpLabel
+ %34 = OpLoad %int %i None
+ OpSelectionMerge %37 None
+ OpSwitch %34 %35 0 %36
%36 = OpLabel
+ OpBranch %38
+ %38 = OpLabel
+ OpStore %j %int_0
+ OpBranch %41
+ %41 = OpLabel
+ OpLoopMerge %42 %40 None
OpBranch %39
%39 = OpLabel
- OpBranch %27
- %27 = OpLabel
- %44 = OpLoad %int %j None
- %45 = OpIAdd %int %44 %int_2
- OpStore %j %45 None
- OpBranch %28
- %29 = OpLabel
+ %45 = OpLoad %v2uint %tint_loop_idx_0 None
+ %46 = OpIEqual %v2bool %45 %22
+ %47 = OpAll %bool %46
+ OpSelectionMerge %48 None
+ OpBranchConditional %47 %49 %48
+ %49 = OpLabel
+ OpBranch %42
+ %48 = OpLabel
+ %50 = OpLoad %int %j None
+ %51 = OpSLessThan %bool %50 %int_2
+ OpSelectionMerge %52 None
+ OpBranchConditional %51 %52 %53
+ %53 = OpLabel
+ OpBranch %42
+ %52 = OpLabel
+ %54 = OpLoad %int %j None
+ OpSelectionMerge %58 None
+ OpSwitch %54 %55 0 %56 1 %57
+ %56 = OpLabel
+ OpBranch %40
+ %57 = OpLabel
+ %59 = OpLoad %int %k None
+ OpSelectionMerge %62 None
+ OpSwitch %59 %60 0 %61
+ %61 = OpLabel
+ OpBranch %40
+ %60 = OpLabel
+ OpBranch %62
+ %62 = OpLabel
+ OpBranch %58
+ %55 = OpLabel
+ OpBranch %58
+ %58 = OpLabel
+ OpBranch %40
+ %40 = OpLabel
+ %63 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ %66 = OpLoad %uint %63 None
+%tint_low_inc_1 = OpIAdd %uint %66 %uint_1
+ %69 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ OpStore %69 %tint_low_inc_1 None
+ %70 = OpIEqual %bool %tint_low_inc_1 %uint_0
+%tint_carry_1 = OpSelect %uint %70 %uint_1 %uint_0
+ %72 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ %73 = OpLoad %uint %72 None
+ %74 = OpIAdd %uint %73 %tint_carry_1
+ %75 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ OpStore %75 %74 None
+ %76 = OpLoad %int %j None
+ %77 = OpIAdd %int %76 %int_2
+ OpStore %j %77 None
+ OpBranch %41
+ %42 = OpLabel
OpBranch %11
- %22 = OpLabel
- OpBranch %24
- %24 = OpLabel
+ %35 = OpLabel
+ OpBranch %37
+ %37 = OpLabel
OpBranch %11
%11 = OpLabel
- %46 = OpLoad %int %i None
- %47 = OpIAdd %int %46 %int_2
- OpStore %i %47 None
+ %78 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %79 = OpLoad %uint %78 None
+%tint_low_inc = OpIAdd %uint %79 %uint_1
+ %81 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %81 %tint_low_inc None
+ %82 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %82 %uint_1 %uint_0
+ %84 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %85 = OpLoad %uint %84 None
+ %86 = OpIAdd %uint %85 %tint_carry
+ %87 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %87 %86 None
+ %88 = OpLoad %int %i None
+ %89 = OpIAdd %int %88 %int_2
+ OpStore %i %89 None
OpBranch %12
%13 = OpLabel
OpReturn
diff --git a/test/tint/loops/nested_loop_switch_loop_switch_switch_robustness.wgsl.expected.spvasm b/test/tint/loops/nested_loop_switch_loop_switch_switch_robustness.wgsl.expected.spvasm
index d49a469..9fc4100 100644
--- a/test/tint/loops/nested_loop_switch_loop_switch_switch_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loop_switch_loop_switch_switch_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 48
+; Bound: 90
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -9,19 +9,37 @@
OpExecutionMode %main LocalSize 1 1 1
OpName %main "main"
OpName %k "k"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %i "i"
+ OpName %tint_loop_idx_0 "tint_loop_idx"
OpName %j "j"
+ OpName %tint_low_inc_1 "tint_low_inc_1"
+ OpName %tint_carry_1 "tint_carry_1"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
%void = OpTypeVoid
%3 = OpTypeFunction %void
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
- %int_2 = OpConstant %int 2
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %18 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %22 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %int_2 = OpConstant %int 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%main = OpFunction %void None %3
%4 = OpLabel
%k = OpVariable %_ptr_Function_int Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %18
%i = OpVariable %_ptr_Function_int Function
+%tint_loop_idx_0 = OpVariable %_ptr_Function_v2uint Function %18
%j = OpVariable %_ptr_Function_int Function
OpStore %k %int_0
OpBranch %9
@@ -32,66 +50,106 @@
OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
- %15 = OpLoad %int %i None
- %16 = OpSLessThan %bool %15 %int_2
- OpSelectionMerge %19 None
- OpBranchConditional %16 %19 %20
- %20 = OpLabel
- OpBranch %13
- %19 = OpLabel
- %21 = OpLoad %int %i None
- OpSelectionMerge %24 None
- OpSwitch %21 %22 0 %23
- %23 = OpLabel
- OpBranch %25
- %25 = OpLabel
- OpStore %j %int_0
- OpBranch %28
+ %20 = OpLoad %v2uint %tint_loop_idx None
+ %21 = OpIEqual %v2bool %20 %22
+ %26 = OpAll %bool %21
+ OpSelectionMerge %27 None
+ OpBranchConditional %26 %28 %27
%28 = OpLabel
- OpLoopMerge %29 %27 None
- OpBranch %26
- %26 = OpLabel
- %31 = OpLoad %int %j None
- %32 = OpSLessThan %bool %31 %int_2
- OpSelectionMerge %33 None
- OpBranchConditional %32 %33 %34
- %34 = OpLabel
- OpBranch %29
+ OpBranch %13
+ %27 = OpLabel
+ %29 = OpLoad %int %i None
+ %30 = OpSLessThan %bool %29 %int_2
+ OpSelectionMerge %32 None
+ OpBranchConditional %30 %32 %33
%33 = OpLabel
- %35 = OpLoad %int %j None
- OpSelectionMerge %39 None
- OpSwitch %35 %36 0 %37 1 %38
- %37 = OpLabel
- OpBranch %27
- %38 = OpLabel
- %40 = OpLoad %int %k None
- OpSelectionMerge %43 None
- OpSwitch %40 %41 0 %42
- %42 = OpLabel
- OpBranch %27
- %41 = OpLabel
- OpBranch %43
- %43 = OpLabel
- OpBranch %39
+ OpBranch %13
+ %32 = OpLabel
+ %34 = OpLoad %int %i None
+ OpSelectionMerge %37 None
+ OpSwitch %34 %35 0 %36
%36 = OpLabel
+ OpBranch %38
+ %38 = OpLabel
+ OpStore %j %int_0
+ OpBranch %41
+ %41 = OpLabel
+ OpLoopMerge %42 %40 None
OpBranch %39
%39 = OpLabel
- OpBranch %27
- %27 = OpLabel
- %44 = OpLoad %int %j None
- %45 = OpIAdd %int %44 %int_2
- OpStore %j %45 None
- OpBranch %28
- %29 = OpLabel
+ %45 = OpLoad %v2uint %tint_loop_idx_0 None
+ %46 = OpIEqual %v2bool %45 %22
+ %47 = OpAll %bool %46
+ OpSelectionMerge %48 None
+ OpBranchConditional %47 %49 %48
+ %49 = OpLabel
+ OpBranch %42
+ %48 = OpLabel
+ %50 = OpLoad %int %j None
+ %51 = OpSLessThan %bool %50 %int_2
+ OpSelectionMerge %52 None
+ OpBranchConditional %51 %52 %53
+ %53 = OpLabel
+ OpBranch %42
+ %52 = OpLabel
+ %54 = OpLoad %int %j None
+ OpSelectionMerge %58 None
+ OpSwitch %54 %55 0 %56 1 %57
+ %56 = OpLabel
+ OpBranch %40
+ %57 = OpLabel
+ %59 = OpLoad %int %k None
+ OpSelectionMerge %62 None
+ OpSwitch %59 %60 0 %61
+ %61 = OpLabel
+ OpBranch %40
+ %60 = OpLabel
+ OpBranch %62
+ %62 = OpLabel
+ OpBranch %58
+ %55 = OpLabel
+ OpBranch %58
+ %58 = OpLabel
+ OpBranch %40
+ %40 = OpLabel
+ %63 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ %66 = OpLoad %uint %63 None
+%tint_low_inc_1 = OpIAdd %uint %66 %uint_1
+ %69 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ OpStore %69 %tint_low_inc_1 None
+ %70 = OpIEqual %bool %tint_low_inc_1 %uint_0
+%tint_carry_1 = OpSelect %uint %70 %uint_1 %uint_0
+ %72 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ %73 = OpLoad %uint %72 None
+ %74 = OpIAdd %uint %73 %tint_carry_1
+ %75 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ OpStore %75 %74 None
+ %76 = OpLoad %int %j None
+ %77 = OpIAdd %int %76 %int_2
+ OpStore %j %77 None
+ OpBranch %41
+ %42 = OpLabel
OpBranch %11
- %22 = OpLabel
- OpBranch %24
- %24 = OpLabel
+ %35 = OpLabel
+ OpBranch %37
+ %37 = OpLabel
OpBranch %11
%11 = OpLabel
- %46 = OpLoad %int %i None
- %47 = OpIAdd %int %46 %int_2
- OpStore %i %47 None
+ %78 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %79 = OpLoad %uint %78 None
+%tint_low_inc = OpIAdd %uint %79 %uint_1
+ %81 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %81 %tint_low_inc None
+ %82 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %82 %uint_1 %uint_0
+ %84 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %85 = OpLoad %uint %84 None
+ %86 = OpIAdd %uint %85 %tint_carry
+ %87 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %87 %86 None
+ %88 = OpLoad %int %i None
+ %89 = OpIAdd %int %88 %int_2
+ OpStore %i %89 None
OpBranch %12
%13 = OpLabel
OpReturn
diff --git a/test/tint/loops/nested_loop_switch_switch.wgsl.expected.spvasm b/test/tint/loops/nested_loop_switch_switch.wgsl.expected.spvasm
index 5c00abe..6d29564 100644
--- a/test/tint/loops/nested_loop_switch_switch.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loop_switch_switch.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 31
+; Bound: 57
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -9,17 +9,31 @@
OpExecutionMode %main LocalSize 1 1 1
OpName %main "main"
OpName %j "j"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %i "i"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
%void = OpTypeVoid
%3 = OpTypeFunction %void
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
- %int_2 = OpConstant %int 2
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %18 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %22 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %int_2 = OpConstant %int 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%main = OpFunction %void None %3
%4 = OpLabel
%j = OpVariable %_ptr_Function_int Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %18
%i = OpVariable %_ptr_Function_int Function
OpStore %j %int_0
OpBranch %9
@@ -30,34 +44,54 @@
OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
- %15 = OpLoad %int %i None
- %16 = OpSLessThan %bool %15 %int_2
- OpSelectionMerge %19 None
- OpBranchConditional %16 %19 %20
- %20 = OpLabel
- OpBranch %13
- %19 = OpLabel
- %21 = OpLoad %int %i None
- OpSelectionMerge %24 None
- OpSwitch %21 %22 0 %23
- %23 = OpLabel
- %25 = OpLoad %int %j None
- OpSelectionMerge %28 None
- OpSwitch %25 %26 0 %27
- %27 = OpLabel
- OpBranch %11
- %26 = OpLabel
- OpBranch %28
+ %20 = OpLoad %v2uint %tint_loop_idx None
+ %21 = OpIEqual %v2bool %20 %22
+ %26 = OpAll %bool %21
+ OpSelectionMerge %27 None
+ OpBranchConditional %26 %28 %27
%28 = OpLabel
- OpBranch %24
- %22 = OpLabel
- OpBranch %24
- %24 = OpLabel
+ OpBranch %13
+ %27 = OpLabel
+ %29 = OpLoad %int %i None
+ %30 = OpSLessThan %bool %29 %int_2
+ OpSelectionMerge %32 None
+ OpBranchConditional %30 %32 %33
+ %33 = OpLabel
+ OpBranch %13
+ %32 = OpLabel
+ %34 = OpLoad %int %i None
+ OpSelectionMerge %37 None
+ OpSwitch %34 %35 0 %36
+ %36 = OpLabel
+ %38 = OpLoad %int %j None
+ OpSelectionMerge %41 None
+ OpSwitch %38 %39 0 %40
+ %40 = OpLabel
+ OpBranch %11
+ %39 = OpLabel
+ OpBranch %41
+ %41 = OpLabel
+ OpBranch %37
+ %35 = OpLabel
+ OpBranch %37
+ %37 = OpLabel
OpBranch %11
%11 = OpLabel
- %29 = OpLoad %int %i None
- %30 = OpIAdd %int %29 %int_2
- OpStore %i %30 None
+ %42 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %45 = OpLoad %uint %42 None
+%tint_low_inc = OpIAdd %uint %45 %uint_1
+ %48 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %48 %tint_low_inc None
+ %49 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %49 %uint_1 %uint_0
+ %51 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %52 = OpLoad %uint %51 None
+ %53 = OpIAdd %uint %52 %tint_carry
+ %54 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %54 %53 None
+ %55 = OpLoad %int %i None
+ %56 = OpIAdd %int %55 %int_2
+ OpStore %i %56 None
OpBranch %12
%13 = OpLabel
OpReturn
diff --git a/test/tint/loops/nested_loop_switch_switch_robustness.wgsl.expected.spvasm b/test/tint/loops/nested_loop_switch_switch_robustness.wgsl.expected.spvasm
index 5c00abe..6d29564 100644
--- a/test/tint/loops/nested_loop_switch_switch_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loop_switch_switch_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 31
+; Bound: 57
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -9,17 +9,31 @@
OpExecutionMode %main LocalSize 1 1 1
OpName %main "main"
OpName %j "j"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %i "i"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
%void = OpTypeVoid
%3 = OpTypeFunction %void
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
- %int_2 = OpConstant %int 2
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %18 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %22 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %int_2 = OpConstant %int 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%main = OpFunction %void None %3
%4 = OpLabel
%j = OpVariable %_ptr_Function_int Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %18
%i = OpVariable %_ptr_Function_int Function
OpStore %j %int_0
OpBranch %9
@@ -30,34 +44,54 @@
OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
- %15 = OpLoad %int %i None
- %16 = OpSLessThan %bool %15 %int_2
- OpSelectionMerge %19 None
- OpBranchConditional %16 %19 %20
- %20 = OpLabel
- OpBranch %13
- %19 = OpLabel
- %21 = OpLoad %int %i None
- OpSelectionMerge %24 None
- OpSwitch %21 %22 0 %23
- %23 = OpLabel
- %25 = OpLoad %int %j None
- OpSelectionMerge %28 None
- OpSwitch %25 %26 0 %27
- %27 = OpLabel
- OpBranch %11
- %26 = OpLabel
- OpBranch %28
+ %20 = OpLoad %v2uint %tint_loop_idx None
+ %21 = OpIEqual %v2bool %20 %22
+ %26 = OpAll %bool %21
+ OpSelectionMerge %27 None
+ OpBranchConditional %26 %28 %27
%28 = OpLabel
- OpBranch %24
- %22 = OpLabel
- OpBranch %24
- %24 = OpLabel
+ OpBranch %13
+ %27 = OpLabel
+ %29 = OpLoad %int %i None
+ %30 = OpSLessThan %bool %29 %int_2
+ OpSelectionMerge %32 None
+ OpBranchConditional %30 %32 %33
+ %33 = OpLabel
+ OpBranch %13
+ %32 = OpLabel
+ %34 = OpLoad %int %i None
+ OpSelectionMerge %37 None
+ OpSwitch %34 %35 0 %36
+ %36 = OpLabel
+ %38 = OpLoad %int %j None
+ OpSelectionMerge %41 None
+ OpSwitch %38 %39 0 %40
+ %40 = OpLabel
+ OpBranch %11
+ %39 = OpLabel
+ OpBranch %41
+ %41 = OpLabel
+ OpBranch %37
+ %35 = OpLabel
+ OpBranch %37
+ %37 = OpLabel
OpBranch %11
%11 = OpLabel
- %29 = OpLoad %int %i None
- %30 = OpIAdd %int %29 %int_2
- OpStore %i %30 None
+ %42 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %45 = OpLoad %uint %42 None
+%tint_low_inc = OpIAdd %uint %45 %uint_1
+ %48 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %48 %tint_low_inc None
+ %49 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %49 %uint_1 %uint_0
+ %51 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %52 = OpLoad %uint %51 None
+ %53 = OpIAdd %uint %52 %tint_carry
+ %54 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %54 %53 None
+ %55 = OpLoad %int %i None
+ %56 = OpIAdd %int %55 %int_2
+ OpStore %i %56 None
OpBranch %12
%13 = OpLabel
OpReturn
diff --git a/test/tint/loops/nested_loops.wgsl.expected.spvasm b/test/tint/loops/nested_loops.wgsl.expected.spvasm
index 405084f..fbf8de2 100644
--- a/test/tint/loops/nested_loops.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loops.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 49
+; Bound: 93
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -12,6 +12,12 @@
OpName %continue_execution "continue_execution"
OpName %i "i"
OpName %j "j"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_loop_idx_0 "tint_loop_idx"
+ OpName %tint_low_inc_1 "tint_low_inc_1"
+ OpName %tint_carry_1 "tint_carry_1"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%int = OpTypeInt 32 1
%3 = OpTypeFunction %int
@@ -20,77 +26,133 @@
%bool = OpTypeBool
%_ptr_Function_bool = OpTypePointer Function %bool
%true = OpConstantTrue %bool
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %23 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %26 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %v2bool = OpTypeVector %bool 2
%int_1 = OpConstant %int 1
%int_4 = OpConstant %int 4
%false = OpConstantFalse %bool
%int_2 = OpConstant %int 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%void = OpTypeVoid
- %47 = OpTypeFunction %void
+ %91 = OpTypeFunction %void
%f = OpFunction %int None %3
%4 = OpLabel
%return_value = OpVariable %_ptr_Function_int Function %7
%continue_execution = OpVariable %_ptr_Function_bool Function
%i = OpVariable %_ptr_Function_int Function %7
%j = OpVariable %_ptr_Function_int Function %7
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %23
+%tint_loop_idx_0 = OpVariable %_ptr_Function_v2uint Function %23
OpStore %continue_execution %true
- OpBranch %16
- %16 = OpLabel
- OpLoopMerge %17 %15 None
OpBranch %14
%14 = OpLabel
- %18 = OpLoad %int %i None
- %19 = OpIAdd %int %18 %int_1
- OpStore %i %19 None
- %21 = OpLoad %int %i None
- %22 = OpSGreaterThan %bool %21 %int_4
- OpSelectionMerge %24 None
- OpBranchConditional %22 %25 %24
- %25 = OpLabel
- OpStore %continue_execution %false None
- OpStore %return_value %int_1 None
- OpBranch %24
- %24 = OpLabel
- %27 = OpLoad %bool %continue_execution None
- OpSelectionMerge %28 None
- OpBranchConditional %27 %29 %28
- %29 = OpLabel
- OpBranch %32
- %32 = OpLabel
- OpLoopMerge %33 %31 None
- OpBranch %30
+ OpBranch %17
+ %17 = OpLabel
+ OpLoopMerge %18 %16 None
+ OpBranch %15
+ %15 = OpLabel
+ %24 = OpLoad %v2uint %tint_loop_idx None
+ %25 = OpIEqual %v2bool %24 %26
+ %29 = OpAll %bool %25
+ OpSelectionMerge %30 None
+ OpBranchConditional %29 %31 %30
+ %31 = OpLabel
+ OpBranch %18
%30 = OpLabel
- %34 = OpLoad %int %j None
- %35 = OpIAdd %int %34 %int_1
- OpStore %j %35 None
- %36 = OpLoad %int %j None
- %37 = OpSGreaterThan %bool %36 %int_4
+ %32 = OpLoad %int %i None
+ %33 = OpIAdd %int %32 %int_1
+ OpStore %i %33 None
+ %35 = OpLoad %int %i None
+ %36 = OpSGreaterThan %bool %35 %int_4
OpSelectionMerge %38 None
- OpBranchConditional %37 %39 %38
+ OpBranchConditional %36 %39 %38
%39 = OpLabel
OpStore %continue_execution %false None
- OpStore %return_value %int_2 None
+ OpStore %return_value %int_1 None
OpBranch %38
%38 = OpLabel
%41 = OpLoad %bool %continue_execution None
OpSelectionMerge %42 None
OpBranchConditional %41 %43 %42
%43 = OpLabel
- OpBranch %31
- %42 = OpLabel
- OpBranch %33
- %31 = OpLabel
- OpBranch %32
- %33 = OpLabel
- OpBranch %28
- %28 = OpLabel
- OpBranch %17
- %15 = OpLabel
- OpBranch %16
- %17 = OpLabel
- %44 = OpLoad %int %return_value None
- OpReturnValue %44
- OpFunctionEnd
-%unused_entry_point = OpFunction %void None %47
+ OpBranch %44
+ %44 = OpLabel
+ OpBranch %47
+ %47 = OpLabel
+ OpLoopMerge %48 %46 None
+ OpBranch %45
+ %45 = OpLabel
+ %50 = OpLoad %v2uint %tint_loop_idx_0 None
+ %51 = OpIEqual %v2bool %50 %26
+ %52 = OpAll %bool %51
+ OpSelectionMerge %53 None
+ OpBranchConditional %52 %54 %53
+ %54 = OpLabel
+ OpBranch %48
+ %53 = OpLabel
+ %55 = OpLoad %int %j None
+ %56 = OpIAdd %int %55 %int_1
+ OpStore %j %56 None
+ %57 = OpLoad %int %j None
+ %58 = OpSGreaterThan %bool %57 %int_4
+ OpSelectionMerge %59 None
+ OpBranchConditional %58 %60 %59
+ %60 = OpLabel
+ OpStore %continue_execution %false None
+ OpStore %return_value %int_2 None
+ OpBranch %59
+ %59 = OpLabel
+ %62 = OpLoad %bool %continue_execution None
+ OpSelectionMerge %63 None
+ OpBranchConditional %62 %64 %63
+ %64 = OpLabel
+ OpBranch %46
+ %63 = OpLabel
+ OpBranch %48
+ %46 = OpLabel
+ %65 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ %68 = OpLoad %uint %65 None
+%tint_low_inc_1 = OpIAdd %uint %68 %uint_1
+ %71 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ OpStore %71 %tint_low_inc_1 None
+ %72 = OpIEqual %bool %tint_low_inc_1 %uint_0
+%tint_carry_1 = OpSelect %uint %72 %uint_1 %uint_0
+ %74 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ %75 = OpLoad %uint %74 None
+ %76 = OpIAdd %uint %75 %tint_carry_1
+ %77 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ OpStore %77 %76 None
+ OpBranch %47
%48 = OpLabel
+ OpBranch %42
+ %42 = OpLabel
+ OpBranch %18
+ %16 = OpLabel
+ %78 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %79 = OpLoad %uint %78 None
+%tint_low_inc = OpIAdd %uint %79 %uint_1
+ %81 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %81 %tint_low_inc None
+ %82 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %82 %uint_1 %uint_0
+ %84 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %85 = OpLoad %uint %84 None
+ %86 = OpIAdd %uint %85 %tint_carry
+ %87 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %87 %86 None
+ OpBranch %17
+ %18 = OpLabel
+ %88 = OpLoad %int %return_value None
+ OpReturnValue %88
+ OpFunctionEnd
+%unused_entry_point = OpFunction %void None %91
+ %92 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/loops/nested_loops_robustness.wgsl.expected.spvasm b/test/tint/loops/nested_loops_robustness.wgsl.expected.spvasm
index 405084f..fbf8de2 100644
--- a/test/tint/loops/nested_loops_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loops_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 49
+; Bound: 93
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -12,6 +12,12 @@
OpName %continue_execution "continue_execution"
OpName %i "i"
OpName %j "j"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_loop_idx_0 "tint_loop_idx"
+ OpName %tint_low_inc_1 "tint_low_inc_1"
+ OpName %tint_carry_1 "tint_carry_1"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%int = OpTypeInt 32 1
%3 = OpTypeFunction %int
@@ -20,77 +26,133 @@
%bool = OpTypeBool
%_ptr_Function_bool = OpTypePointer Function %bool
%true = OpConstantTrue %bool
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %23 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %26 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %v2bool = OpTypeVector %bool 2
%int_1 = OpConstant %int 1
%int_4 = OpConstant %int 4
%false = OpConstantFalse %bool
%int_2 = OpConstant %int 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%void = OpTypeVoid
- %47 = OpTypeFunction %void
+ %91 = OpTypeFunction %void
%f = OpFunction %int None %3
%4 = OpLabel
%return_value = OpVariable %_ptr_Function_int Function %7
%continue_execution = OpVariable %_ptr_Function_bool Function
%i = OpVariable %_ptr_Function_int Function %7
%j = OpVariable %_ptr_Function_int Function %7
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %23
+%tint_loop_idx_0 = OpVariable %_ptr_Function_v2uint Function %23
OpStore %continue_execution %true
- OpBranch %16
- %16 = OpLabel
- OpLoopMerge %17 %15 None
OpBranch %14
%14 = OpLabel
- %18 = OpLoad %int %i None
- %19 = OpIAdd %int %18 %int_1
- OpStore %i %19 None
- %21 = OpLoad %int %i None
- %22 = OpSGreaterThan %bool %21 %int_4
- OpSelectionMerge %24 None
- OpBranchConditional %22 %25 %24
- %25 = OpLabel
- OpStore %continue_execution %false None
- OpStore %return_value %int_1 None
- OpBranch %24
- %24 = OpLabel
- %27 = OpLoad %bool %continue_execution None
- OpSelectionMerge %28 None
- OpBranchConditional %27 %29 %28
- %29 = OpLabel
- OpBranch %32
- %32 = OpLabel
- OpLoopMerge %33 %31 None
- OpBranch %30
+ OpBranch %17
+ %17 = OpLabel
+ OpLoopMerge %18 %16 None
+ OpBranch %15
+ %15 = OpLabel
+ %24 = OpLoad %v2uint %tint_loop_idx None
+ %25 = OpIEqual %v2bool %24 %26
+ %29 = OpAll %bool %25
+ OpSelectionMerge %30 None
+ OpBranchConditional %29 %31 %30
+ %31 = OpLabel
+ OpBranch %18
%30 = OpLabel
- %34 = OpLoad %int %j None
- %35 = OpIAdd %int %34 %int_1
- OpStore %j %35 None
- %36 = OpLoad %int %j None
- %37 = OpSGreaterThan %bool %36 %int_4
+ %32 = OpLoad %int %i None
+ %33 = OpIAdd %int %32 %int_1
+ OpStore %i %33 None
+ %35 = OpLoad %int %i None
+ %36 = OpSGreaterThan %bool %35 %int_4
OpSelectionMerge %38 None
- OpBranchConditional %37 %39 %38
+ OpBranchConditional %36 %39 %38
%39 = OpLabel
OpStore %continue_execution %false None
- OpStore %return_value %int_2 None
+ OpStore %return_value %int_1 None
OpBranch %38
%38 = OpLabel
%41 = OpLoad %bool %continue_execution None
OpSelectionMerge %42 None
OpBranchConditional %41 %43 %42
%43 = OpLabel
- OpBranch %31
- %42 = OpLabel
- OpBranch %33
- %31 = OpLabel
- OpBranch %32
- %33 = OpLabel
- OpBranch %28
- %28 = OpLabel
- OpBranch %17
- %15 = OpLabel
- OpBranch %16
- %17 = OpLabel
- %44 = OpLoad %int %return_value None
- OpReturnValue %44
- OpFunctionEnd
-%unused_entry_point = OpFunction %void None %47
+ OpBranch %44
+ %44 = OpLabel
+ OpBranch %47
+ %47 = OpLabel
+ OpLoopMerge %48 %46 None
+ OpBranch %45
+ %45 = OpLabel
+ %50 = OpLoad %v2uint %tint_loop_idx_0 None
+ %51 = OpIEqual %v2bool %50 %26
+ %52 = OpAll %bool %51
+ OpSelectionMerge %53 None
+ OpBranchConditional %52 %54 %53
+ %54 = OpLabel
+ OpBranch %48
+ %53 = OpLabel
+ %55 = OpLoad %int %j None
+ %56 = OpIAdd %int %55 %int_1
+ OpStore %j %56 None
+ %57 = OpLoad %int %j None
+ %58 = OpSGreaterThan %bool %57 %int_4
+ OpSelectionMerge %59 None
+ OpBranchConditional %58 %60 %59
+ %60 = OpLabel
+ OpStore %continue_execution %false None
+ OpStore %return_value %int_2 None
+ OpBranch %59
+ %59 = OpLabel
+ %62 = OpLoad %bool %continue_execution None
+ OpSelectionMerge %63 None
+ OpBranchConditional %62 %64 %63
+ %64 = OpLabel
+ OpBranch %46
+ %63 = OpLabel
+ OpBranch %48
+ %46 = OpLabel
+ %65 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ %68 = OpLoad %uint %65 None
+%tint_low_inc_1 = OpIAdd %uint %68 %uint_1
+ %71 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ OpStore %71 %tint_low_inc_1 None
+ %72 = OpIEqual %bool %tint_low_inc_1 %uint_0
+%tint_carry_1 = OpSelect %uint %72 %uint_1 %uint_0
+ %74 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ %75 = OpLoad %uint %74 None
+ %76 = OpIAdd %uint %75 %tint_carry_1
+ %77 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ OpStore %77 %76 None
+ OpBranch %47
%48 = OpLabel
+ OpBranch %42
+ %42 = OpLabel
+ OpBranch %18
+ %16 = OpLabel
+ %78 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %79 = OpLoad %uint %78 None
+%tint_low_inc = OpIAdd %uint %79 %uint_1
+ %81 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %81 %tint_low_inc None
+ %82 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %82 %uint_1 %uint_0
+ %84 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %85 = OpLoad %uint %84 None
+ %86 = OpIAdd %uint %85 %tint_carry
+ %87 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %87 %86 None
+ OpBranch %17
+ %18 = OpLabel
+ %88 = OpLoad %int %return_value None
+ OpReturnValue %88
+ OpFunctionEnd
+%unused_entry_point = OpFunction %void None %91
+ %92 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/loops/nested_loops_with_continuing.wgsl.expected.spvasm b/test/tint/loops/nested_loops_with_continuing.wgsl.expected.spvasm
index 386f344..bda7959 100644
--- a/test/tint/loops/nested_loops_with_continuing.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loops_with_continuing.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 47
+; Bound: 91
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -12,6 +12,12 @@
OpName %continue_execution "continue_execution"
OpName %i "i"
OpName %j "j"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_loop_idx_0 "tint_loop_idx"
+ OpName %tint_low_inc_1 "tint_low_inc_1"
+ OpName %tint_carry_1 "tint_carry_1"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%int = OpTypeInt 32 1
%3 = OpTypeFunction %int
@@ -20,74 +26,130 @@
%bool = OpTypeBool
%_ptr_Function_bool = OpTypePointer Function %bool
%true = OpConstantTrue %bool
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %23 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %26 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %v2bool = OpTypeVector %bool 2
%int_4 = OpConstant %int 4
%false = OpConstantFalse %bool
%int_1 = OpConstant %int 1
%int_2 = OpConstant %int 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%void = OpTypeVoid
- %45 = OpTypeFunction %void
+ %89 = OpTypeFunction %void
%f = OpFunction %int None %3
%4 = OpLabel
%return_value = OpVariable %_ptr_Function_int Function %7
%continue_execution = OpVariable %_ptr_Function_bool Function
%i = OpVariable %_ptr_Function_int Function %7
%j = OpVariable %_ptr_Function_int Function %7
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %23
+%tint_loop_idx_0 = OpVariable %_ptr_Function_v2uint Function %23
OpStore %continue_execution %true
- OpBranch %16
- %16 = OpLabel
- OpLoopMerge %17 %15 None
OpBranch %14
%14 = OpLabel
- %18 = OpLoad %int %i None
- %19 = OpSGreaterThan %bool %18 %int_4
- OpSelectionMerge %21 None
- OpBranchConditional %19 %22 %21
- %22 = OpLabel
+ OpBranch %17
+ %17 = OpLabel
+ OpLoopMerge %18 %16 None
+ OpBranch %15
+ %15 = OpLabel
+ %24 = OpLoad %v2uint %tint_loop_idx None
+ %25 = OpIEqual %v2bool %24 %26
+ %29 = OpAll %bool %25
+ OpSelectionMerge %30 None
+ OpBranchConditional %29 %31 %30
+ %31 = OpLabel
+ OpBranch %18
+ %30 = OpLabel
+ %32 = OpLoad %int %i None
+ %33 = OpSGreaterThan %bool %32 %int_4
+ OpSelectionMerge %35 None
+ OpBranchConditional %33 %36 %35
+ %36 = OpLabel
OpStore %continue_execution %false None
OpStore %return_value %int_1 None
- OpBranch %21
- %21 = OpLabel
- %25 = OpLoad %bool %continue_execution None
- OpSelectionMerge %26 None
- OpBranchConditional %25 %27 %26
- %27 = OpLabel
- OpBranch %30
- %30 = OpLabel
- OpLoopMerge %31 %29 None
- OpBranch %28
- %28 = OpLabel
- %32 = OpLoad %int %j None
- %33 = OpSGreaterThan %bool %32 %int_4
- OpSelectionMerge %34 None
- OpBranchConditional %33 %35 %34
+ OpBranch %35
%35 = OpLabel
+ %39 = OpLoad %bool %continue_execution None
+ OpSelectionMerge %40 None
+ OpBranchConditional %39 %41 %40
+ %41 = OpLabel
+ OpBranch %42
+ %42 = OpLabel
+ OpBranch %45
+ %45 = OpLabel
+ OpLoopMerge %46 %44 None
+ OpBranch %43
+ %43 = OpLabel
+ %48 = OpLoad %v2uint %tint_loop_idx_0 None
+ %49 = OpIEqual %v2bool %48 %26
+ %50 = OpAll %bool %49
+ OpSelectionMerge %51 None
+ OpBranchConditional %50 %52 %51
+ %52 = OpLabel
+ OpBranch %46
+ %51 = OpLabel
+ %53 = OpLoad %int %j None
+ %54 = OpSGreaterThan %bool %53 %int_4
+ OpSelectionMerge %55 None
+ OpBranchConditional %54 %56 %55
+ %56 = OpLabel
OpStore %continue_execution %false None
OpStore %return_value %int_2 None
- OpBranch %34
- %34 = OpLabel
- %37 = OpLoad %bool %continue_execution None
- OpSelectionMerge %38 None
- OpBranchConditional %37 %39 %38
- %39 = OpLabel
- OpBranch %29
- %38 = OpLabel
- OpBranch %31
- %29 = OpLabel
- %40 = OpLoad %int %j None
- %41 = OpIAdd %int %40 %int_1
- OpStore %j %41 None
- OpBranch %30
- %31 = OpLabel
- OpBranch %26
- %26 = OpLabel
- OpBranch %17
- %15 = OpLabel
- OpBranch %16
- %17 = OpLabel
- %42 = OpLoad %int %return_value None
- OpReturnValue %42
- OpFunctionEnd
-%unused_entry_point = OpFunction %void None %45
+ OpBranch %55
+ %55 = OpLabel
+ %58 = OpLoad %bool %continue_execution None
+ OpSelectionMerge %59 None
+ OpBranchConditional %58 %60 %59
+ %60 = OpLabel
+ OpBranch %44
+ %59 = OpLabel
+ OpBranch %46
+ %44 = OpLabel
+ %61 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ %64 = OpLoad %uint %61 None
+%tint_low_inc_1 = OpIAdd %uint %64 %uint_1
+ %67 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ OpStore %67 %tint_low_inc_1 None
+ %68 = OpIEqual %bool %tint_low_inc_1 %uint_0
+%tint_carry_1 = OpSelect %uint %68 %uint_1 %uint_0
+ %70 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ %71 = OpLoad %uint %70 None
+ %72 = OpIAdd %uint %71 %tint_carry_1
+ %73 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ OpStore %73 %72 None
+ %74 = OpLoad %int %j None
+ %75 = OpIAdd %int %74 %int_1
+ OpStore %j %75 None
+ OpBranch %45
%46 = OpLabel
+ OpBranch %40
+ %40 = OpLabel
+ OpBranch %18
+ %16 = OpLabel
+ %76 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %77 = OpLoad %uint %76 None
+%tint_low_inc = OpIAdd %uint %77 %uint_1
+ %79 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %79 %tint_low_inc None
+ %80 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %80 %uint_1 %uint_0
+ %82 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %83 = OpLoad %uint %82 None
+ %84 = OpIAdd %uint %83 %tint_carry
+ %85 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %85 %84 None
+ OpBranch %17
+ %18 = OpLabel
+ %86 = OpLoad %int %return_value None
+ OpReturnValue %86
+ OpFunctionEnd
+%unused_entry_point = OpFunction %void None %89
+ %90 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/loops/nested_loops_with_continuing_robustness.wgsl.expected.spvasm b/test/tint/loops/nested_loops_with_continuing_robustness.wgsl.expected.spvasm
index 386f344..bda7959 100644
--- a/test/tint/loops/nested_loops_with_continuing_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/nested_loops_with_continuing_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 47
+; Bound: 91
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -12,6 +12,12 @@
OpName %continue_execution "continue_execution"
OpName %i "i"
OpName %j "j"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_loop_idx_0 "tint_loop_idx"
+ OpName %tint_low_inc_1 "tint_low_inc_1"
+ OpName %tint_carry_1 "tint_carry_1"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%int = OpTypeInt 32 1
%3 = OpTypeFunction %int
@@ -20,74 +26,130 @@
%bool = OpTypeBool
%_ptr_Function_bool = OpTypePointer Function %bool
%true = OpConstantTrue %bool
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %23 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %26 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %v2bool = OpTypeVector %bool 2
%int_4 = OpConstant %int 4
%false = OpConstantFalse %bool
%int_1 = OpConstant %int 1
%int_2 = OpConstant %int 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%void = OpTypeVoid
- %45 = OpTypeFunction %void
+ %89 = OpTypeFunction %void
%f = OpFunction %int None %3
%4 = OpLabel
%return_value = OpVariable %_ptr_Function_int Function %7
%continue_execution = OpVariable %_ptr_Function_bool Function
%i = OpVariable %_ptr_Function_int Function %7
%j = OpVariable %_ptr_Function_int Function %7
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %23
+%tint_loop_idx_0 = OpVariable %_ptr_Function_v2uint Function %23
OpStore %continue_execution %true
- OpBranch %16
- %16 = OpLabel
- OpLoopMerge %17 %15 None
OpBranch %14
%14 = OpLabel
- %18 = OpLoad %int %i None
- %19 = OpSGreaterThan %bool %18 %int_4
- OpSelectionMerge %21 None
- OpBranchConditional %19 %22 %21
- %22 = OpLabel
+ OpBranch %17
+ %17 = OpLabel
+ OpLoopMerge %18 %16 None
+ OpBranch %15
+ %15 = OpLabel
+ %24 = OpLoad %v2uint %tint_loop_idx None
+ %25 = OpIEqual %v2bool %24 %26
+ %29 = OpAll %bool %25
+ OpSelectionMerge %30 None
+ OpBranchConditional %29 %31 %30
+ %31 = OpLabel
+ OpBranch %18
+ %30 = OpLabel
+ %32 = OpLoad %int %i None
+ %33 = OpSGreaterThan %bool %32 %int_4
+ OpSelectionMerge %35 None
+ OpBranchConditional %33 %36 %35
+ %36 = OpLabel
OpStore %continue_execution %false None
OpStore %return_value %int_1 None
- OpBranch %21
- %21 = OpLabel
- %25 = OpLoad %bool %continue_execution None
- OpSelectionMerge %26 None
- OpBranchConditional %25 %27 %26
- %27 = OpLabel
- OpBranch %30
- %30 = OpLabel
- OpLoopMerge %31 %29 None
- OpBranch %28
- %28 = OpLabel
- %32 = OpLoad %int %j None
- %33 = OpSGreaterThan %bool %32 %int_4
- OpSelectionMerge %34 None
- OpBranchConditional %33 %35 %34
+ OpBranch %35
%35 = OpLabel
+ %39 = OpLoad %bool %continue_execution None
+ OpSelectionMerge %40 None
+ OpBranchConditional %39 %41 %40
+ %41 = OpLabel
+ OpBranch %42
+ %42 = OpLabel
+ OpBranch %45
+ %45 = OpLabel
+ OpLoopMerge %46 %44 None
+ OpBranch %43
+ %43 = OpLabel
+ %48 = OpLoad %v2uint %tint_loop_idx_0 None
+ %49 = OpIEqual %v2bool %48 %26
+ %50 = OpAll %bool %49
+ OpSelectionMerge %51 None
+ OpBranchConditional %50 %52 %51
+ %52 = OpLabel
+ OpBranch %46
+ %51 = OpLabel
+ %53 = OpLoad %int %j None
+ %54 = OpSGreaterThan %bool %53 %int_4
+ OpSelectionMerge %55 None
+ OpBranchConditional %54 %56 %55
+ %56 = OpLabel
OpStore %continue_execution %false None
OpStore %return_value %int_2 None
- OpBranch %34
- %34 = OpLabel
- %37 = OpLoad %bool %continue_execution None
- OpSelectionMerge %38 None
- OpBranchConditional %37 %39 %38
- %39 = OpLabel
- OpBranch %29
- %38 = OpLabel
- OpBranch %31
- %29 = OpLabel
- %40 = OpLoad %int %j None
- %41 = OpIAdd %int %40 %int_1
- OpStore %j %41 None
- OpBranch %30
- %31 = OpLabel
- OpBranch %26
- %26 = OpLabel
- OpBranch %17
- %15 = OpLabel
- OpBranch %16
- %17 = OpLabel
- %42 = OpLoad %int %return_value None
- OpReturnValue %42
- OpFunctionEnd
-%unused_entry_point = OpFunction %void None %45
+ OpBranch %55
+ %55 = OpLabel
+ %58 = OpLoad %bool %continue_execution None
+ OpSelectionMerge %59 None
+ OpBranchConditional %58 %60 %59
+ %60 = OpLabel
+ OpBranch %44
+ %59 = OpLabel
+ OpBranch %46
+ %44 = OpLabel
+ %61 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ %64 = OpLoad %uint %61 None
+%tint_low_inc_1 = OpIAdd %uint %64 %uint_1
+ %67 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_0
+ OpStore %67 %tint_low_inc_1 None
+ %68 = OpIEqual %bool %tint_low_inc_1 %uint_0
+%tint_carry_1 = OpSelect %uint %68 %uint_1 %uint_0
+ %70 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ %71 = OpLoad %uint %70 None
+ %72 = OpIAdd %uint %71 %tint_carry_1
+ %73 = OpAccessChain %_ptr_Function_uint %tint_loop_idx_0 %uint_1
+ OpStore %73 %72 None
+ %74 = OpLoad %int %j None
+ %75 = OpIAdd %int %74 %int_1
+ OpStore %j %75 None
+ OpBranch %45
%46 = OpLabel
+ OpBranch %40
+ %40 = OpLabel
+ OpBranch %18
+ %16 = OpLabel
+ %76 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %77 = OpLoad %uint %76 None
+%tint_low_inc = OpIAdd %uint %77 %uint_1
+ %79 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %79 %tint_low_inc None
+ %80 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %80 %uint_1 %uint_0
+ %82 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %83 = OpLoad %uint %82 None
+ %84 = OpIAdd %uint %83 %tint_carry
+ %85 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %85 %84 None
+ OpBranch %17
+ %18 = OpLabel
+ %86 = OpLoad %int %return_value None
+ OpReturnValue %86
+ OpFunctionEnd
+%unused_entry_point = OpFunction %void None %89
+ %90 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/loops/while.wgsl.expected.spvasm b/test/tint/loops/while.wgsl.expected.spvasm
index 5c8940f..530a8e6 100644
--- a/test/tint/loops/while.wgsl.expected.spvasm
+++ b/test/tint/loops/while.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 26
+; Bound: 53
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -9,42 +9,78 @@
OpExecutionMode %unused_entry_point LocalSize 1 1 1
OpName %f "f"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%int = OpTypeInt 32 1
%3 = OpTypeFunction %int
%_ptr_Function_int = OpTypePointer Function %int
%7 = OpConstantNull %int
- %int_4 = OpConstant %int 4
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %17 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %20 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %int_4 = OpConstant %int 4
%int_1 = OpConstant %int 1
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%void = OpTypeVoid
- %24 = OpTypeFunction %void
+ %51 = OpTypeFunction %void
%f = OpFunction %int None %3
%4 = OpLabel
%i = OpVariable %_ptr_Function_int Function %7
- OpBranch %10
- %10 = OpLabel
- OpLoopMerge %11 %9 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %17
OpBranch %8
%8 = OpLabel
- %12 = OpLoad %int %i None
- %13 = OpSLessThan %bool %12 %int_4
- OpSelectionMerge %16 None
- OpBranchConditional %13 %16 %17
- %17 = OpLabel
OpBranch %11
- %16 = OpLabel
- %18 = OpLoad %int %i None
- %19 = OpIAdd %int %18 %int_1
- OpStore %i %19 None
+ %11 = OpLabel
+ OpLoopMerge %12 %10 None
OpBranch %9
%9 = OpLabel
- OpBranch %10
- %11 = OpLabel
- %21 = OpLoad %int %i None
- OpReturnValue %21
- OpFunctionEnd
-%unused_entry_point = OpFunction %void None %24
+ %18 = OpLoad %v2uint %tint_loop_idx None
+ %19 = OpIEqual %v2bool %18 %20
+ %24 = OpAll %bool %19
+ OpSelectionMerge %25 None
+ OpBranchConditional %24 %26 %25
+ %26 = OpLabel
+ OpBranch %12
%25 = OpLabel
+ %27 = OpLoad %int %i None
+ %28 = OpSLessThan %bool %27 %int_4
+ OpSelectionMerge %30 None
+ OpBranchConditional %28 %30 %31
+ %31 = OpLabel
+ OpBranch %12
+ %30 = OpLabel
+ %32 = OpLoad %int %i None
+ %33 = OpIAdd %int %32 %int_1
+ OpStore %i %33 None
+ OpBranch %10
+ %10 = OpLabel
+ %35 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %38 = OpLoad %uint %35 None
+%tint_low_inc = OpIAdd %uint %38 %uint_1
+ %41 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %41 %tint_low_inc None
+ %42 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %42 %uint_1 %uint_0
+ %44 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %45 = OpLoad %uint %44 None
+ %46 = OpIAdd %uint %45 %tint_carry
+ %47 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %47 %46 None
+ OpBranch %11
+ %12 = OpLabel
+ %48 = OpLoad %int %i None
+ OpReturnValue %48
+ OpFunctionEnd
+%unused_entry_point = OpFunction %void None %51
+ %52 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/loops/while_robustness.wgsl.expected.spvasm b/test/tint/loops/while_robustness.wgsl.expected.spvasm
index 5c8940f..530a8e6 100644
--- a/test/tint/loops/while_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/while_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 26
+; Bound: 53
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -9,42 +9,78 @@
OpExecutionMode %unused_entry_point LocalSize 1 1 1
OpName %f "f"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%int = OpTypeInt 32 1
%3 = OpTypeFunction %int
%_ptr_Function_int = OpTypePointer Function %int
%7 = OpConstantNull %int
- %int_4 = OpConstant %int 4
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %17 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %20 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %int_4 = OpConstant %int 4
%int_1 = OpConstant %int 1
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%void = OpTypeVoid
- %24 = OpTypeFunction %void
+ %51 = OpTypeFunction %void
%f = OpFunction %int None %3
%4 = OpLabel
%i = OpVariable %_ptr_Function_int Function %7
- OpBranch %10
- %10 = OpLabel
- OpLoopMerge %11 %9 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %17
OpBranch %8
%8 = OpLabel
- %12 = OpLoad %int %i None
- %13 = OpSLessThan %bool %12 %int_4
- OpSelectionMerge %16 None
- OpBranchConditional %13 %16 %17
- %17 = OpLabel
OpBranch %11
- %16 = OpLabel
- %18 = OpLoad %int %i None
- %19 = OpIAdd %int %18 %int_1
- OpStore %i %19 None
+ %11 = OpLabel
+ OpLoopMerge %12 %10 None
OpBranch %9
%9 = OpLabel
- OpBranch %10
- %11 = OpLabel
- %21 = OpLoad %int %i None
- OpReturnValue %21
- OpFunctionEnd
-%unused_entry_point = OpFunction %void None %24
+ %18 = OpLoad %v2uint %tint_loop_idx None
+ %19 = OpIEqual %v2bool %18 %20
+ %24 = OpAll %bool %19
+ OpSelectionMerge %25 None
+ OpBranchConditional %24 %26 %25
+ %26 = OpLabel
+ OpBranch %12
%25 = OpLabel
+ %27 = OpLoad %int %i None
+ %28 = OpSLessThan %bool %27 %int_4
+ OpSelectionMerge %30 None
+ OpBranchConditional %28 %30 %31
+ %31 = OpLabel
+ OpBranch %12
+ %30 = OpLabel
+ %32 = OpLoad %int %i None
+ %33 = OpIAdd %int %32 %int_1
+ OpStore %i %33 None
+ OpBranch %10
+ %10 = OpLabel
+ %35 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %38 = OpLoad %uint %35 None
+%tint_low_inc = OpIAdd %uint %38 %uint_1
+ %41 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %41 %tint_low_inc None
+ %42 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %42 %uint_1 %uint_0
+ %44 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %45 = OpLoad %uint %44 None
+ %46 = OpIAdd %uint %45 %tint_carry
+ %47 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %47 %46 None
+ OpBranch %11
+ %12 = OpLabel
+ %48 = OpLoad %int %i None
+ OpReturnValue %48
+ OpFunctionEnd
+%unused_entry_point = OpFunction %void None %51
+ %52 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/loops/while_with_continue.wgsl.expected.spvasm b/test/tint/loops/while_with_continue.wgsl.expected.spvasm
index 5c8940f..530a8e6 100644
--- a/test/tint/loops/while_with_continue.wgsl.expected.spvasm
+++ b/test/tint/loops/while_with_continue.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 26
+; Bound: 53
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -9,42 +9,78 @@
OpExecutionMode %unused_entry_point LocalSize 1 1 1
OpName %f "f"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%int = OpTypeInt 32 1
%3 = OpTypeFunction %int
%_ptr_Function_int = OpTypePointer Function %int
%7 = OpConstantNull %int
- %int_4 = OpConstant %int 4
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %17 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %20 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %int_4 = OpConstant %int 4
%int_1 = OpConstant %int 1
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%void = OpTypeVoid
- %24 = OpTypeFunction %void
+ %51 = OpTypeFunction %void
%f = OpFunction %int None %3
%4 = OpLabel
%i = OpVariable %_ptr_Function_int Function %7
- OpBranch %10
- %10 = OpLabel
- OpLoopMerge %11 %9 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %17
OpBranch %8
%8 = OpLabel
- %12 = OpLoad %int %i None
- %13 = OpSLessThan %bool %12 %int_4
- OpSelectionMerge %16 None
- OpBranchConditional %13 %16 %17
- %17 = OpLabel
OpBranch %11
- %16 = OpLabel
- %18 = OpLoad %int %i None
- %19 = OpIAdd %int %18 %int_1
- OpStore %i %19 None
+ %11 = OpLabel
+ OpLoopMerge %12 %10 None
OpBranch %9
%9 = OpLabel
- OpBranch %10
- %11 = OpLabel
- %21 = OpLoad %int %i None
- OpReturnValue %21
- OpFunctionEnd
-%unused_entry_point = OpFunction %void None %24
+ %18 = OpLoad %v2uint %tint_loop_idx None
+ %19 = OpIEqual %v2bool %18 %20
+ %24 = OpAll %bool %19
+ OpSelectionMerge %25 None
+ OpBranchConditional %24 %26 %25
+ %26 = OpLabel
+ OpBranch %12
%25 = OpLabel
+ %27 = OpLoad %int %i None
+ %28 = OpSLessThan %bool %27 %int_4
+ OpSelectionMerge %30 None
+ OpBranchConditional %28 %30 %31
+ %31 = OpLabel
+ OpBranch %12
+ %30 = OpLabel
+ %32 = OpLoad %int %i None
+ %33 = OpIAdd %int %32 %int_1
+ OpStore %i %33 None
+ OpBranch %10
+ %10 = OpLabel
+ %35 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %38 = OpLoad %uint %35 None
+%tint_low_inc = OpIAdd %uint %38 %uint_1
+ %41 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %41 %tint_low_inc None
+ %42 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %42 %uint_1 %uint_0
+ %44 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %45 = OpLoad %uint %44 None
+ %46 = OpIAdd %uint %45 %tint_carry
+ %47 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %47 %46 None
+ OpBranch %11
+ %12 = OpLabel
+ %48 = OpLoad %int %i None
+ OpReturnValue %48
+ OpFunctionEnd
+%unused_entry_point = OpFunction %void None %51
+ %52 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/loops/while_with_continue_robustness.wgsl.expected.spvasm b/test/tint/loops/while_with_continue_robustness.wgsl.expected.spvasm
index 5c8940f..530a8e6 100644
--- a/test/tint/loops/while_with_continue_robustness.wgsl.expected.spvasm
+++ b/test/tint/loops/while_with_continue_robustness.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 26
+; Bound: 53
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -9,42 +9,78 @@
OpExecutionMode %unused_entry_point LocalSize 1 1 1
OpName %f "f"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%int = OpTypeInt 32 1
%3 = OpTypeFunction %int
%_ptr_Function_int = OpTypePointer Function %int
%7 = OpConstantNull %int
- %int_4 = OpConstant %int 4
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %17 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %20 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %int_4 = OpConstant %int 4
%int_1 = OpConstant %int 1
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%void = OpTypeVoid
- %24 = OpTypeFunction %void
+ %51 = OpTypeFunction %void
%f = OpFunction %int None %3
%4 = OpLabel
%i = OpVariable %_ptr_Function_int Function %7
- OpBranch %10
- %10 = OpLabel
- OpLoopMerge %11 %9 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %17
OpBranch %8
%8 = OpLabel
- %12 = OpLoad %int %i None
- %13 = OpSLessThan %bool %12 %int_4
- OpSelectionMerge %16 None
- OpBranchConditional %13 %16 %17
- %17 = OpLabel
OpBranch %11
- %16 = OpLabel
- %18 = OpLoad %int %i None
- %19 = OpIAdd %int %18 %int_1
- OpStore %i %19 None
+ %11 = OpLabel
+ OpLoopMerge %12 %10 None
OpBranch %9
%9 = OpLabel
- OpBranch %10
- %11 = OpLabel
- %21 = OpLoad %int %i None
- OpReturnValue %21
- OpFunctionEnd
-%unused_entry_point = OpFunction %void None %24
+ %18 = OpLoad %v2uint %tint_loop_idx None
+ %19 = OpIEqual %v2bool %18 %20
+ %24 = OpAll %bool %19
+ OpSelectionMerge %25 None
+ OpBranchConditional %24 %26 %25
+ %26 = OpLabel
+ OpBranch %12
%25 = OpLabel
+ %27 = OpLoad %int %i None
+ %28 = OpSLessThan %bool %27 %int_4
+ OpSelectionMerge %30 None
+ OpBranchConditional %28 %30 %31
+ %31 = OpLabel
+ OpBranch %12
+ %30 = OpLabel
+ %32 = OpLoad %int %i None
+ %33 = OpIAdd %int %32 %int_1
+ OpStore %i %33 None
+ OpBranch %10
+ %10 = OpLabel
+ %35 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %38 = OpLoad %uint %35 None
+%tint_low_inc = OpIAdd %uint %38 %uint_1
+ %41 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %41 %tint_low_inc None
+ %42 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %42 %uint_1 %uint_0
+ %44 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %45 = OpLoad %uint %44 None
+ %46 = OpIAdd %uint %45 %tint_carry
+ %47 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %47 %46 None
+ OpBranch %11
+ %12 = OpLabel
+ %48 = OpLoad %int %i None
+ OpReturnValue %48
+ OpFunctionEnd
+%unused_entry_point = OpFunction %void None %51
+ %52 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/shadowing/loop.wgsl.expected.spvasm b/test/tint/shadowing/loop.wgsl.expected.spvasm
index 55c647d..4f566db 100644
--- a/test/tint/shadowing/loop.wgsl.expected.spvasm
+++ b/test/tint/shadowing/loop.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 44
+; Bound: 69
; Schema: 0
OpCapability Shader
- %22 = OpExtInstImport "GLSL.std.450"
+ %36 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %foo "foo"
OpExecutionMode %foo LocalSize 1 1 1
@@ -12,7 +12,10 @@
OpName %output_block "output_block"
OpName %foo "foo"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %x "x"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %x_0 "x"
OpDecorate %_arr_int_uint_10 ArrayStride 4
OpMemberDecorate %output_block 0 Offset 0
@@ -31,46 +34,77 @@
%10 = OpTypeFunction %void
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %23 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %26 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%uint_9 = OpConstant %uint 9
%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
%uint_0 = OpConstant %uint 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_1 = OpConstant %uint 1
%int_10 = OpConstant %int 10
- %bool = OpTypeBool
%foo = OpFunction %void None %10
%11 = OpLabel
%i = OpVariable %_ptr_Function_int Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %23
%x = OpVariable %_ptr_Function_int Function
%x_0 = OpVariable %_ptr_Function_int Function
OpStore %i %int_0
- OpBranch %17
- %17 = OpLabel
- OpLoopMerge %18 %16 None
OpBranch %15
%15 = OpLabel
- %19 = OpLoad %int %i None
- %20 = OpBitcast %uint %19
- %21 = OpExtInst %uint %22 UMin %20 %uint_9
- %24 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0 %21
- %27 = OpLoad %int %24 None
- OpStore %x %27
+ OpBranch %18
+ %18 = OpLabel
+ OpLoopMerge %19 %17 None
OpBranch %16
%16 = OpLabel
- %29 = OpLoad %int %x None
- %30 = OpBitcast %uint %29
- %31 = OpExtInst %uint %22 UMin %30 %uint_9
- %32 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0 %31
- %33 = OpLoad %int %32 None
- OpStore %x_0 %33
- %35 = OpLoad %int %x_0 None
- %36 = OpLoad %int %i None
- %37 = OpIAdd %int %36 %35
- OpStore %i %37 None
- %38 = OpLoad %int %i None
- %39 = OpSGreaterThan %bool %38 %int_10
- OpBranchConditional %39 %18 %17
- %18 = OpLabel
- %42 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0 %uint_0
- %43 = OpLoad %int %i None
- OpStore %42 %43 None
+ %24 = OpLoad %v2uint %tint_loop_idx None
+ %25 = OpIEqual %v2bool %24 %26
+ %30 = OpAll %bool %25
+ OpSelectionMerge %31 None
+ OpBranchConditional %30 %32 %31
+ %32 = OpLabel
+ OpBranch %19
+ %31 = OpLabel
+ %33 = OpLoad %int %i None
+ %34 = OpBitcast %uint %33
+ %35 = OpExtInst %uint %36 UMin %34 %uint_9
+ %38 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0 %35
+ %41 = OpLoad %int %38 None
+ OpStore %x %41
+ OpBranch %17
+ %17 = OpLabel
+ %43 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %45 = OpLoad %uint %43 None
+%tint_low_inc = OpIAdd %uint %45 %uint_1
+ %48 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %48 %tint_low_inc None
+ %49 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %49 %uint_1 %uint_0
+ %51 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %52 = OpLoad %uint %51 None
+ %53 = OpIAdd %uint %52 %tint_carry
+ %54 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %54 %53 None
+ %55 = OpLoad %int %x None
+ %56 = OpBitcast %uint %55
+ %57 = OpExtInst %uint %36 UMin %56 %uint_9
+ %58 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0 %57
+ %59 = OpLoad %int %58 None
+ OpStore %x_0 %59
+ %61 = OpLoad %int %x_0 None
+ %62 = OpLoad %int %i None
+ %63 = OpIAdd %int %62 %61
+ OpStore %i %63 None
+ %64 = OpLoad %int %i None
+ %65 = OpSGreaterThan %bool %64 %int_10
+ OpBranchConditional %65 %19 %18
+ %19 = OpLabel
+ %67 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0 %uint_0
+ %68 = OpLoad %int %i None
+ OpStore %67 %68 None
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.spvasm b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.spvasm
index 3b76eee..aaf4a6d 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.spvasm
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 47
+; Bound: 71
; Schema: 0
OpCapability Shader
- %43 = OpExtInstImport "GLSL.std.450"
+ %67 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main"
OpExecutionMode %main LocalSize 1 1 1
@@ -19,7 +19,10 @@
OpMemberName %OuterS 0 "a1"
OpName %OuterS "OuterS"
OpName %s1 "s1"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %i "i"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpMemberDecorate %Uniforms 0 Offset 0
OpMemberDecorate %uniforms_block 0 Offset 0
OpDecorate %uniforms_block Block
@@ -45,18 +48,27 @@
%OuterS = OpTypeStruct %_arr_InnerS_uint_8
%_ptr_Function_OuterS = OpTypePointer Function %OuterS
%20 = OpConstantNull %OuterS
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %29 = OpConstantNull %v2uint
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
- %int_4 = OpConstant %int 4
+%uint_4294967295 = OpConstant %uint 4294967295
+ %35 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %int_4 = OpConstant %int 4
%int_1 = OpConstant %int 1
-%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+%_ptr_Function_uint = OpTypePointer Function %uint
%uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%uint_7 = OpConstant %uint 7
%main = OpFunction %void None %8
%9 = OpLabel
%v = OpVariable %_ptr_Function_InnerS Function %14
%s1 = OpVariable %_ptr_Function_OuterS Function %20
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %29
%i = OpVariable %_ptr_Function_int Function
OpBranch %21
%21 = OpLabel
@@ -66,24 +78,44 @@
OpLoopMerge %25 %23 None
OpBranch %22
%22 = OpLabel
- %29 = OpLoad %int %i None
- %30 = OpSLessThan %bool %29 %int_4
- OpSelectionMerge %33 None
- OpBranchConditional %30 %33 %34
- %34 = OpLabel
+ %33 = OpLoad %v2uint %tint_loop_idx None
+ %34 = OpIEqual %v2bool %33 %35
+ %39 = OpAll %bool %34
+ OpSelectionMerge %40 None
+ OpBranchConditional %39 %41 %40
+ %41 = OpLabel
OpBranch %25
- %33 = OpLabel
- %35 = OpLoad %int %i None
- %36 = OpIAdd %int %35 %int_1
- OpStore %i %36 None
+ %40 = OpLabel
+ %42 = OpLoad %int %i None
+ %43 = OpSLessThan %bool %42 %int_4
+ OpSelectionMerge %45 None
+ OpBranchConditional %43 %45 %46
+ %46 = OpLabel
+ OpBranch %25
+ %45 = OpLabel
+ %47 = OpLoad %int %i None
+ %48 = OpIAdd %int %47 %int_1
+ OpStore %i %48 None
OpBranch %23
%23 = OpLabel
- %38 = OpAccessChain %_ptr_Uniform_uint %1 %uint_0 %uint_0
- %41 = OpLoad %uint %38 None
- %42 = OpExtInst %uint %43 UMin %41 %uint_7
- %45 = OpAccessChain %_ptr_Function_InnerS %s1 %uint_0 %42
- %46 = OpLoad %InnerS %v None
- OpStore %45 %46 None
+ %50 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %53 = OpLoad %uint %50 None
+%tint_low_inc = OpIAdd %uint %53 %uint_1
+ %56 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %56 %tint_low_inc None
+ %57 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %57 %uint_1 %uint_0
+ %59 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %60 = OpLoad %uint %59 None
+ %61 = OpIAdd %uint %60 %tint_carry
+ %62 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %62 %61 None
+ %63 = OpAccessChain %_ptr_Uniform_uint %1 %uint_0 %uint_0
+ %65 = OpLoad %uint %63 None
+ %66 = OpExtInst %uint %67 UMin %65 %uint_7
+ %69 = OpAccessChain %_ptr_Function_InnerS %s1 %uint_0 %66
+ %70 = OpLoad %InnerS %v None
+ OpStore %69 %70 None
OpBranch %24
%25 = OpLabel
OpReturn
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.spvasm b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.spvasm
index e57e6ce..d4a23be 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.spvasm
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 47
+; Bound: 71
; Schema: 0
OpCapability Shader
- %34 = OpExtInstImport "GLSL.std.450"
+ %38 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main"
OpExecutionMode %main LocalSize 1 1 1
@@ -20,6 +20,9 @@
OpName %OuterS "OuterS"
OpName %s1 "s1"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpMemberDecorate %Uniforms 0 Offset 0
OpMemberDecorate %uniforms_block 0 Offset 0
OpDecorate %uniforms_block Block
@@ -47,43 +50,72 @@
%20 = OpConstantNull %OuterS
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %32 = OpConstantNull %v2uint
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%uint_0 = OpConstant %uint 0
%uint_7 = OpConstant %uint 7
- %int_4 = OpConstant %int 4
+%uint_4294967295 = OpConstant %uint 4294967295
+ %44 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %int_4 = OpConstant %int 4
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_1 = OpConstant %uint 1
%int_1 = OpConstant %int 1
%main = OpFunction %void None %8
%9 = OpLabel
%v = OpVariable %_ptr_Function_InnerS Function %14
%s1 = OpVariable %_ptr_Function_OuterS Function %20
%i = OpVariable %_ptr_Function_int Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %32
OpStore %i %int_0
OpBranch %24
%24 = OpLabel
- %29 = OpAccessChain %_ptr_Uniform_uint %1 %uint_0 %uint_0
- %32 = OpLoad %uint %29 None
- %33 = OpExtInst %uint %34 UMin %32 %uint_7
- %36 = OpAccessChain %_ptr_Function_InnerS %s1 %uint_0 %33
- %37 = OpLoad %InnerS %v None
- OpStore %36 %37 None
+ %33 = OpAccessChain %_ptr_Uniform_uint %1 %uint_0 %uint_0
+ %36 = OpLoad %uint %33 None
+ %37 = OpExtInst %uint %38 UMin %36 %uint_7
+ %40 = OpAccessChain %_ptr_Function_InnerS %s1 %uint_0 %37
+ %41 = OpLoad %InnerS %v None
+ OpStore %40 %41 None
OpBranch %27
%27 = OpLabel
OpLoopMerge %28 %26 None
OpBranch %25
%25 = OpLabel
- %38 = OpLoad %int %i None
- %39 = OpSLessThan %bool %38 %int_4
- OpSelectionMerge %42 None
- OpBranchConditional %39 %42 %43
- %43 = OpLabel
+ %42 = OpLoad %v2uint %tint_loop_idx None
+ %43 = OpIEqual %v2bool %42 %44
+ %48 = OpAll %bool %43
+ OpSelectionMerge %49 None
+ OpBranchConditional %48 %50 %49
+ %50 = OpLabel
OpBranch %28
- %42 = OpLabel
+ %49 = OpLabel
+ %51 = OpLoad %int %i None
+ %52 = OpSLessThan %bool %51 %int_4
+ OpSelectionMerge %54 None
+ OpBranchConditional %52 %54 %55
+ %55 = OpLabel
+ OpBranch %28
+ %54 = OpLabel
OpBranch %26
%26 = OpLabel
- %44 = OpLoad %int %i None
- %45 = OpIAdd %int %44 %int_1
- OpStore %i %45 None
+ %56 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %58 = OpLoad %uint %56 None
+%tint_low_inc = OpIAdd %uint %58 %uint_1
+ %61 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %61 %tint_low_inc None
+ %62 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %62 %uint_1 %uint_0
+ %64 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %65 = OpLoad %uint %64 None
+ %66 = OpIAdd %uint %65 %tint_carry
+ %67 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %67 %66 None
+ %68 = OpLoad %int %i None
+ %69 = OpIAdd %int %68 %int_1
+ OpStore %i %69 None
OpBranch %27
%28 = OpLabel
OpReturn
diff --git a/test/tint/statements/compound_assign/for_loop.wgsl.expected.spvasm b/test/tint/statements/compound_assign/for_loop.wgsl.expected.spvasm
index b9b896e..925529d 100644
--- a/test/tint/statements/compound_assign/for_loop.wgsl.expected.spvasm
+++ b/test/tint/statements/compound_assign/for_loop.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 73
+; Bound: 97
; Schema: 0
OpCapability Shader
- %48 = OpExtInstImport "GLSL.std.450"
+ %52 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
OpExecutionMode %unused_entry_point LocalSize 1 1 1
@@ -20,6 +20,9 @@
OpName %idx3 "idx3"
OpName %foo "foo"
OpName %a "a"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
OpMemberDecorate %S 0 Offset 0
OpMemberDecorate %S 1 Offset 16
@@ -56,10 +59,18 @@
%_arr_float_uint_4 = OpTypeArray %float %uint_4
%_ptr_Function__arr_float_uint_4 = OpTypePointer Function %_arr_float_uint_4
%39 = OpConstantNull %_arr_float_uint_4
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %48 = OpConstantNull %v2uint
%_ptr_Function_float = OpTypePointer Function %float
%float_2 = OpConstant %float 2
- %float_10 = OpConstant %float 10
+%uint_4294967295 = OpConstant %uint 4294967295
+ %60 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %float_10 = OpConstant %float 10
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
%float_1 = OpConstant %float 1
%idx1 = OpFunction %int None %15
%16 = OpLabel
@@ -85,46 +96,67 @@
%foo = OpFunction %void None %33
%34 = OpLabel
%a = OpVariable %_ptr_Function__arr_float_uint_4 Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %48
OpStore %a %39
OpBranch %40
%40 = OpLabel
- %45 = OpFunctionCall %int %idx1
- %46 = OpBitcast %uint %45
- %47 = OpExtInst %uint %48 UMin %46 %uint_3
- %49 = OpAccessChain %_ptr_Function_float %a %47
- %51 = OpLoad %float %49 None
- %52 = OpFMul %float %51 %float_2
- OpStore %49 %52 None
+ %49 = OpFunctionCall %int %idx1
+ %50 = OpBitcast %uint %49
+ %51 = OpExtInst %uint %52 UMin %50 %uint_3
+ %53 = OpAccessChain %_ptr_Function_float %a %51
+ %55 = OpLoad %float %53 None
+ %56 = OpFMul %float %55 %float_2
+ OpStore %53 %56 None
OpBranch %43
%43 = OpLabel
OpLoopMerge %44 %42 None
OpBranch %41
%41 = OpLabel
- %54 = OpFunctionCall %int %idx2
- %55 = OpBitcast %uint %54
- %56 = OpExtInst %uint %48 UMin %55 %uint_3
- %57 = OpAccessChain %_ptr_Function_float %a %56
- %58 = OpLoad %float %57 None
- %59 = OpFOrdLessThan %bool %58 %float_10
- OpSelectionMerge %62 None
- OpBranchConditional %59 %62 %63
- %63 = OpLabel
+ %58 = OpLoad %v2uint %tint_loop_idx None
+ %59 = OpIEqual %v2bool %58 %60
+ %64 = OpAll %bool %59
+ OpSelectionMerge %65 None
+ OpBranchConditional %64 %66 %65
+ %66 = OpLabel
OpBranch %44
- %62 = OpLabel
+ %65 = OpLabel
+ %67 = OpFunctionCall %int %idx2
+ %68 = OpBitcast %uint %67
+ %69 = OpExtInst %uint %52 UMin %68 %uint_3
+ %70 = OpAccessChain %_ptr_Function_float %a %69
+ %71 = OpLoad %float %70 None
+ %72 = OpFOrdLessThan %bool %71 %float_10
+ OpSelectionMerge %74 None
+ OpBranchConditional %72 %74 %75
+ %75 = OpLabel
+ OpBranch %44
+ %74 = OpLabel
OpBranch %42
%42 = OpLabel
- %64 = OpFunctionCall %int %idx3
- %65 = OpBitcast %uint %64
- %66 = OpExtInst %uint %48 UMin %65 %uint_3
- %67 = OpAccessChain %_ptr_Function_float %a %66
- %68 = OpLoad %float %67 None
- %69 = OpFAdd %float %68 %float_1
- OpStore %67 %69 None
+ %76 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %79 = OpLoad %uint %76 None
+%tint_low_inc = OpIAdd %uint %79 %uint_1
+ %81 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %81 %tint_low_inc None
+ %82 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %82 %uint_1 %uint_0
+ %84 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %85 = OpLoad %uint %84 None
+ %86 = OpIAdd %uint %85 %tint_carry
+ %87 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %87 %86 None
+ %88 = OpFunctionCall %int %idx3
+ %89 = OpBitcast %uint %88
+ %90 = OpExtInst %uint %52 UMin %89 %uint_3
+ %91 = OpAccessChain %_ptr_Function_float %a %90
+ %92 = OpLoad %float %91 None
+ %93 = OpFAdd %float %92 %float_1
+ OpStore %91 %93 None
OpBranch %43
%44 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %33
- %72 = OpLabel
+ %96 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/decrement/complex.wgsl.expected.spvasm b/test/tint/statements/decrement/complex.wgsl.expected.spvasm
index 882bc5e..5646103 100644
--- a/test/tint/statements/decrement/complex.wgsl.expected.spvasm
+++ b/test/tint/statements/decrement/complex.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 106
+; Bound: 129
; Schema: 0
OpCapability Shader
- %63 = OpExtInstImport "GLSL.std.450"
+ %67 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
OpExecutionMode %unused_entry_point LocalSize 1 1 1
@@ -20,6 +20,9 @@
OpName %idx5 "idx5"
OpName %idx6 "idx6"
OpName %main "main"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
OpDecorate %_arr_v4int_uint_4 ArrayStride 16
OpMemberDecorate %S 0 Offset 0
@@ -51,13 +54,20 @@
%int_0 = OpConstant %int 0
%void = OpTypeVoid
%47 = OpTypeFunction %void
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %57 = OpConstantNull %v2uint
%_ptr_StorageBuffer__runtimearr_S = OpTypePointer StorageBuffer %_runtimearr_S
%uint_0 = OpConstant %uint 0
%uint_3 = OpConstant %uint 3
%_ptr_StorageBuffer_v4int = OpTypePointer StorageBuffer %v4int
%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
- %uint_10 = OpConstant %uint 10
+%uint_4294967295 = OpConstant %uint 4294967295
+ %85 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %uint_10 = OpConstant %uint 10
+%_ptr_Function_uint = OpTypePointer Function %uint
%idx1 = OpFunction %int None %15
%16 = OpLabel
%17 = OpLoad %uint %v None
@@ -102,67 +112,88 @@
OpFunctionEnd
%main = OpFunction %void None %47
%48 = OpLabel
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %57
OpBranch %49
%49 = OpLabel
- %54 = OpFunctionCall %int %idx1
- %55 = OpFunctionCall %int %idx2
- %56 = OpAccessChain %_ptr_StorageBuffer__runtimearr_S %1 %uint_0
- %59 = OpArrayLength %uint %1 0
- %60 = OpISub %uint %59 %uint_1
- %61 = OpBitcast %uint %54
- %62 = OpExtInst %uint %63 UMin %61 %60
- %64 = OpBitcast %uint %55
- %65 = OpExtInst %uint %63 UMin %64 %uint_3
- %67 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0 %62 %uint_0 %65
- %69 = OpFunctionCall %int %idx3
- %70 = OpBitcast %uint %69
- %71 = OpExtInst %uint %63 UMin %70 %uint_3
- %72 = OpAccessChain %_ptr_StorageBuffer_int %67 %71
- %74 = OpLoad %int %72 None
- %75 = OpISub %int %74 %int_1
- %76 = OpBitcast %uint %69
- %77 = OpExtInst %uint %63 UMin %76 %uint_3
- %78 = OpAccessChain %_ptr_StorageBuffer_int %67 %77
- OpStore %78 %75 None
+ %58 = OpFunctionCall %int %idx1
+ %59 = OpFunctionCall %int %idx2
+ %60 = OpAccessChain %_ptr_StorageBuffer__runtimearr_S %1 %uint_0
+ %63 = OpArrayLength %uint %1 0
+ %64 = OpISub %uint %63 %uint_1
+ %65 = OpBitcast %uint %58
+ %66 = OpExtInst %uint %67 UMin %65 %64
+ %68 = OpBitcast %uint %59
+ %69 = OpExtInst %uint %67 UMin %68 %uint_3
+ %71 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0 %66 %uint_0 %69
+ %73 = OpFunctionCall %int %idx3
+ %74 = OpBitcast %uint %73
+ %75 = OpExtInst %uint %67 UMin %74 %uint_3
+ %76 = OpAccessChain %_ptr_StorageBuffer_int %71 %75
+ %78 = OpLoad %int %76 None
+ %79 = OpISub %int %78 %int_1
+ %80 = OpBitcast %uint %73
+ %81 = OpExtInst %uint %67 UMin %80 %uint_3
+ %82 = OpAccessChain %_ptr_StorageBuffer_int %71 %81
+ OpStore %82 %79 None
OpBranch %52
%52 = OpLabel
OpLoopMerge %53 %51 None
OpBranch %50
%50 = OpLabel
- %79 = OpLoad %uint %v None
- %80 = OpULessThan %bool %79 %uint_10
- OpSelectionMerge %83 None
- OpBranchConditional %80 %83 %84
- %84 = OpLabel
+ %83 = OpLoad %v2uint %tint_loop_idx None
+ %84 = OpIEqual %v2bool %83 %85
+ %89 = OpAll %bool %84
+ OpSelectionMerge %90 None
+ OpBranchConditional %89 %91 %90
+ %91 = OpLabel
OpBranch %53
- %83 = OpLabel
+ %90 = OpLabel
+ %92 = OpLoad %uint %v None
+ %93 = OpULessThan %bool %92 %uint_10
+ OpSelectionMerge %95 None
+ OpBranchConditional %93 %95 %96
+ %96 = OpLabel
+ OpBranch %53
+ %95 = OpLabel
OpBranch %51
%51 = OpLabel
- %85 = OpFunctionCall %int %idx4
- %86 = OpFunctionCall %int %idx5
- %87 = OpAccessChain %_ptr_StorageBuffer__runtimearr_S %1 %uint_0
- %88 = OpArrayLength %uint %1 0
- %89 = OpISub %uint %88 %uint_1
- %90 = OpBitcast %uint %85
- %91 = OpExtInst %uint %63 UMin %90 %89
- %92 = OpBitcast %uint %86
- %93 = OpExtInst %uint %63 UMin %92 %uint_3
- %94 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0 %91 %uint_0 %93
- %95 = OpFunctionCall %int %idx6
- %96 = OpBitcast %uint %95
- %97 = OpExtInst %uint %63 UMin %96 %uint_3
- %98 = OpAccessChain %_ptr_StorageBuffer_int %94 %97
- %99 = OpLoad %int %98 None
- %100 = OpISub %int %99 %int_1
- %101 = OpBitcast %uint %95
- %102 = OpExtInst %uint %63 UMin %101 %uint_3
- %103 = OpAccessChain %_ptr_StorageBuffer_int %94 %102
- OpStore %103 %100 None
+ %97 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %99 = OpLoad %uint %97 None
+%tint_low_inc = OpIAdd %uint %99 %uint_1
+ %101 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %101 %tint_low_inc None
+ %102 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %102 %uint_1 %uint_0
+ %104 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %105 = OpLoad %uint %104 None
+ %106 = OpIAdd %uint %105 %tint_carry
+ %107 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %107 %106 None
+ %108 = OpFunctionCall %int %idx4
+ %109 = OpFunctionCall %int %idx5
+ %110 = OpAccessChain %_ptr_StorageBuffer__runtimearr_S %1 %uint_0
+ %111 = OpArrayLength %uint %1 0
+ %112 = OpISub %uint %111 %uint_1
+ %113 = OpBitcast %uint %108
+ %114 = OpExtInst %uint %67 UMin %113 %112
+ %115 = OpBitcast %uint %109
+ %116 = OpExtInst %uint %67 UMin %115 %uint_3
+ %117 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0 %114 %uint_0 %116
+ %118 = OpFunctionCall %int %idx6
+ %119 = OpBitcast %uint %118
+ %120 = OpExtInst %uint %67 UMin %119 %uint_3
+ %121 = OpAccessChain %_ptr_StorageBuffer_int %117 %120
+ %122 = OpLoad %int %121 None
+ %123 = OpISub %int %122 %int_1
+ %124 = OpBitcast %uint %118
+ %125 = OpExtInst %uint %67 UMin %124 %uint_3
+ %126 = OpAccessChain %_ptr_StorageBuffer_int %117 %125
+ OpStore %126 %123 None
OpBranch %52
%53 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %47
- %105 = OpLabel
+ %128 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/decrement/for_loop_continuing.wgsl.expected.spvasm b/test/tint/statements/decrement/for_loop_continuing.wgsl.expected.spvasm
index 2c291c8..818b3ee 100644
--- a/test/tint/statements/decrement/for_loop_continuing.wgsl.expected.spvasm
+++ b/test/tint/statements/decrement/for_loop_continuing.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 29
+; Bound: 53
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -10,6 +10,9 @@
OpMemberName %i_block 0 "inner"
OpName %i_block "i_block"
OpName %main "main"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
OpMemberDecorate %i_block 0 Offset 0
OpDecorate %i_block Block
@@ -22,38 +25,68 @@
%1 = OpVariable %_ptr_StorageBuffer_i_block StorageBuffer
%void = OpTypeVoid
%7 = OpTypeFunction %void
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %17 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %20 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
%uint_0 = OpConstant %uint 0
%uint_10 = OpConstant %uint 10
- %bool = OpTypeBool
+%_ptr_Function_uint = OpTypePointer Function %uint
%uint_1 = OpConstant %uint 1
%main = OpFunction %void None %7
%8 = OpLabel
- OpBranch %11
- %11 = OpLabel
- OpLoopMerge %12 %10 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %17
OpBranch %9
%9 = OpLabel
- %13 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
- %16 = OpLoad %uint %13 None
- %17 = OpULessThan %bool %16 %uint_10
- OpSelectionMerge %20 None
- OpBranchConditional %17 %20 %21
- %21 = OpLabel
OpBranch %12
- %20 = OpLabel
+ %12 = OpLabel
+ OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
- %22 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
- %23 = OpLoad %uint %22 None
- %24 = OpISub %uint %23 %uint_1
- %26 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
- OpStore %26 %24 None
+ %18 = OpLoad %v2uint %tint_loop_idx None
+ %19 = OpIEqual %v2bool %18 %20
+ %24 = OpAll %bool %19
+ OpSelectionMerge %25 None
+ OpBranchConditional %24 %26 %25
+ %26 = OpLabel
+ OpBranch %13
+ %25 = OpLabel
+ %27 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+ %30 = OpLoad %uint %27 None
+ %31 = OpULessThan %bool %30 %uint_10
+ OpSelectionMerge %33 None
+ OpBranchConditional %31 %33 %34
+ %34 = OpLabel
+ OpBranch %13
+ %33 = OpLabel
OpBranch %11
- %12 = OpLabel
+ %11 = OpLabel
+ %35 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %37 = OpLoad %uint %35 None
+%tint_low_inc = OpIAdd %uint %37 %uint_1
+ %40 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %40 %tint_low_inc None
+ %41 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %41 %uint_1 %uint_0
+ %43 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %44 = OpLoad %uint %43 None
+ %45 = OpIAdd %uint %44 %tint_carry
+ %46 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %46 %45 None
+ %47 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+ %48 = OpLoad %uint %47 None
+ %49 = OpISub %uint %48 %uint_1
+ %50 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+ OpStore %50 %49 None
+ OpBranch %12
+ %13 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %7
- %28 = OpLabel
+ %52 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/decrement/for_loop_initializer.wgsl.expected.spvasm b/test/tint/statements/decrement/for_loop_initializer.wgsl.expected.spvasm
index 8211d58..cd57de5 100644
--- a/test/tint/statements/decrement/for_loop_initializer.wgsl.expected.spvasm
+++ b/test/tint/statements/decrement/for_loop_initializer.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 30
+; Bound: 53
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -10,6 +10,9 @@
OpMemberName %i_block 0 "inner"
OpName %i_block "i_block"
OpName %main "main"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
OpMemberDecorate %i_block 0 Offset 0
OpDecorate %i_block Block
@@ -22,40 +25,68 @@
%1 = OpVariable %_ptr_StorageBuffer_i_block StorageBuffer
%void = OpTypeVoid
%7 = OpTypeFunction %void
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %17 = OpConstantNull %v2uint
%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
- %uint_10 = OpConstant %uint 10
+%uint_4294967295 = OpConstant %uint 4294967295
+ %27 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %uint_10 = OpConstant %uint 10
+%_ptr_Function_uint = OpTypePointer Function %uint
%main = OpFunction %void None %7
%8 = OpLabel
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %17
OpBranch %9
%9 = OpLabel
- %14 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
- %17 = OpLoad %uint %14 None
- %18 = OpISub %uint %17 %uint_1
- %20 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
- OpStore %20 %18 None
+ %18 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+ %21 = OpLoad %uint %18 None
+ %22 = OpISub %uint %21 %uint_1
+ %24 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+ OpStore %24 %22 None
OpBranch %12
%12 = OpLabel
OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
- %21 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
- %22 = OpLoad %uint %21 None
- %23 = OpULessThan %bool %22 %uint_10
- OpSelectionMerge %26 None
- OpBranchConditional %23 %26 %27
- %27 = OpLabel
+ %25 = OpLoad %v2uint %tint_loop_idx None
+ %26 = OpIEqual %v2bool %25 %27
+ %31 = OpAll %bool %26
+ OpSelectionMerge %32 None
+ OpBranchConditional %31 %33 %32
+ %33 = OpLabel
OpBranch %13
- %26 = OpLabel
+ %32 = OpLabel
+ %34 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+ %35 = OpLoad %uint %34 None
+ %36 = OpULessThan %bool %35 %uint_10
+ OpSelectionMerge %38 None
+ OpBranchConditional %36 %38 %39
+ %39 = OpLabel
+ OpBranch %13
+ %38 = OpLabel
OpBranch %11
%11 = OpLabel
+ %40 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %42 = OpLoad %uint %40 None
+%tint_low_inc = OpIAdd %uint %42 %uint_1
+ %44 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %44 %tint_low_inc None
+ %45 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %45 %uint_1 %uint_0
+ %47 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %48 = OpLoad %uint %47 None
+ %49 = OpIAdd %uint %48 %tint_carry
+ %50 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %50 %49 None
OpBranch %12
%13 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %7
- %29 = OpLabel
+ %52 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/discard/atomic_in_for_loop_continuing.wgsl.expected.spvasm b/test/tint/statements/discard/atomic_in_for_loop_continuing.wgsl.expected.spvasm
index b5a3436..c9e13e1 100644
--- a/test/tint/statements/discard/atomic_in_for_loop_continuing.wgsl.expected.spvasm
+++ b/test/tint/statements/discard/atomic_in_for_loop_continuing.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 96
+; Bound: 119
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -19,7 +19,10 @@
OpName %in "in"
OpName %coord "coord"
OpName %result "result"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %i "i"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %tint_f32_to_i32 "tint_f32_to_i32"
OpName %value "value"
OpName %foo "foo"
@@ -63,26 +66,34 @@
%36 = OpTypeSampledImage %3
%v4float = OpTypeVector %float 4
%_ptr_Function_int = OpTypePointer Function %int
- %int_0 = OpConstant %int 0
- %int_10 = OpConstant %int 10
-%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
%uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %53 = OpConstantNull %v2uint
+ %int_0 = OpConstant %int 0
+%uint_4294967295 = OpConstant %uint 4294967295
+ %58 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %v2bool = OpTypeVector %bool 2
+ %int_10 = OpConstant %int 10
+%_ptr_Function_uint = OpTypePointer Function %uint
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
%int_1 = OpConstant %int 1
- %71 = OpUndef %int
- %78 = OpTypeFunction %int %float
+ %94 = OpUndef %int
+ %101 = OpTypeFunction %int %float
%float_n2_14748365e_09 = OpConstant %float -2.14748365e+09
%int_n2147483648 = OpConstant %int -2147483648
%float_2_14748352e_09 = OpConstant %float 2.14748352e+09
%int_2147483647 = OpConstant %int 2147483647
%void = OpTypeVoid
- %91 = OpTypeFunction %void
+ %114 = OpTypeFunction %void
%foo_inner = OpFunction %int None %26
%in = OpFunctionParameter %float
%coord = OpFunctionParameter %v2float
%27 = OpLabel
%result = OpVariable %_ptr_Function_int Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %53
%i = OpVariable %_ptr_Function_int Function
%28 = OpFOrdEqual %bool %in %float_0
OpSelectionMerge %30 None
@@ -106,58 +117,78 @@
OpLoopMerge %48 %46 None
OpBranch %45
%45 = OpLabel
- %51 = OpLoad %int %i None
- %52 = OpSLessThan %bool %51 %int_10
- OpSelectionMerge %54 None
- OpBranchConditional %52 %54 %55
- %55 = OpLabel
+ %56 = OpLoad %v2uint %tint_loop_idx None
+ %57 = OpIEqual %v2bool %56 %58
+ %61 = OpAll %bool %57
+ OpSelectionMerge %62 None
+ OpBranchConditional %61 %63 %62
+ %63 = OpLabel
OpBranch %48
- %54 = OpLabel
- %56 = OpLoad %int %i None
- %57 = OpLoad %int %result None
- %58 = OpIAdd %int %57 %56
- OpStore %result %58 None
+ %62 = OpLabel
+ %64 = OpLoad %int %i None
+ %65 = OpSLessThan %bool %64 %int_10
+ OpSelectionMerge %67 None
+ OpBranchConditional %65 %67 %68
+ %68 = OpLabel
+ OpBranch %48
+ %67 = OpLabel
+ %69 = OpLoad %int %i None
+ %70 = OpLoad %int %result None
+ %71 = OpIAdd %int %70 %69
+ OpStore %result %71 None
OpBranch %46
%46 = OpLabel
- %59 = OpAccessChain %_ptr_StorageBuffer_int %8 %uint_0
- %63 = OpLoad %bool %continue_execution None
- OpSelectionMerge %64 None
- OpBranchConditional %63 %65 %66
- %65 = OpLabel
- %67 = OpAtomicIAdd %int %59 %uint_1 %uint_0 %int_1
- OpBranch %64
- %66 = OpLabel
- OpBranch %64
- %64 = OpLabel
- %70 = OpPhi %int %67 %65 %71 %66
- OpStore %i %70 None
+ %72 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %75 = OpLoad %uint %72 None
+%tint_low_inc = OpIAdd %uint %75 %uint_1
+ %78 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %78 %tint_low_inc None
+ %79 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %79 %uint_1 %uint_0
+ %81 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %82 = OpLoad %uint %81 None
+ %83 = OpIAdd %uint %82 %tint_carry
+ %84 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %84 %83 None
+ %85 = OpAccessChain %_ptr_StorageBuffer_int %8 %uint_0
+ %87 = OpLoad %bool %continue_execution None
+ OpSelectionMerge %88 None
+ OpBranchConditional %87 %89 %90
+ %89 = OpLabel
+ %91 = OpAtomicIAdd %int %85 %uint_1 %uint_0 %int_1
+ OpBranch %88
+ %90 = OpLabel
+ OpBranch %88
+ %88 = OpLabel
+ %93 = OpPhi %int %91 %89 %94 %90
+ OpStore %i %93 None
OpBranch %47
%48 = OpLabel
- %72 = OpLoad %int %result None
- %73 = OpLoad %bool %continue_execution None
- %74 = OpLogicalNot %bool %73
- OpSelectionMerge %75 None
- OpBranchConditional %74 %76 %75
- %76 = OpLabel
+ %95 = OpLoad %int %result None
+ %96 = OpLoad %bool %continue_execution None
+ %97 = OpLogicalNot %bool %96
+ OpSelectionMerge %98 None
+ OpBranchConditional %97 %99 %98
+ %99 = OpLabel
OpKill
- %75 = OpLabel
- OpReturnValue %72
+ %98 = OpLabel
+ OpReturnValue %95
OpFunctionEnd
-%tint_f32_to_i32 = OpFunction %int None %78
+%tint_f32_to_i32 = OpFunction %int None %101
%value = OpFunctionParameter %float
- %79 = OpLabel
- %80 = OpConvertFToS %int %value
- %81 = OpFOrdGreaterThanEqual %bool %value %float_n2_14748365e_09
- %83 = OpSelect %int %81 %80 %int_n2147483648
- %85 = OpFOrdLessThanEqual %bool %value %float_2_14748352e_09
- %87 = OpSelect %int %85 %83 %int_2147483647
- OpReturnValue %87
+ %102 = OpLabel
+ %103 = OpConvertFToS %int %value
+ %104 = OpFOrdGreaterThanEqual %bool %value %float_n2_14748365e_09
+ %106 = OpSelect %int %104 %103 %int_n2147483648
+ %108 = OpFOrdLessThanEqual %bool %value %float_2_14748352e_09
+ %110 = OpSelect %int %108 %106 %int_2147483647
+ OpReturnValue %110
OpFunctionEnd
- %foo = OpFunction %void None %91
- %92 = OpLabel
- %93 = OpLoad %float %foo_loc0_Input None
- %94 = OpLoad %v2float %foo_loc1_Input None
- %95 = OpFunctionCall %int %foo_inner %93 %94
- OpStore %foo_loc0_Output %95 None
+ %foo = OpFunction %void None %114
+ %115 = OpLabel
+ %116 = OpLoad %float %foo_loc0_Input None
+ %117 = OpLoad %v2float %foo_loc1_Input None
+ %118 = OpFunctionCall %int %foo_inner %116 %117
+ OpStore %foo_loc0_Output %118 None
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/discard/loop_discard_return.wgsl.expected.spvasm b/test/tint/statements/discard/loop_discard_return.wgsl.expected.spvasm
index 27c795a..555c8e4 100644
--- a/test/tint/statements/discard/loop_discard_return.wgsl.expected.spvasm
+++ b/test/tint/statements/discard/loop_discard_return.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 16
+; Bound: 43
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -9,6 +9,9 @@
OpExecutionMode %unused_entry_point LocalSize 1 1 1
OpName %continue_execution "continue_execution"
OpName %f "f"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%bool = OpTypeBool
%_ptr_Private_bool = OpTypePointer Private %bool
@@ -16,22 +19,55 @@
%continue_execution = OpVariable %_ptr_Private_bool Private %true
%void = OpTypeVoid
%7 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %18 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %v2bool = OpTypeVector %bool 2
%false = OpConstantFalse %bool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%f = OpFunction %void None %7
%8 = OpLabel
- OpBranch %11
- %11 = OpLabel
- OpLoopMerge %12 %10 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %18
OpBranch %9
%9 = OpLabel
- OpStore %continue_execution %false None
OpBranch %12
- %10 = OpLabel
- OpBranch %11
%12 = OpLabel
+ OpLoopMerge %13 %11 None
+ OpBranch %10
+ %10 = OpLabel
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %24 = OpAll %bool %20
+ OpSelectionMerge %25 None
+ OpBranchConditional %24 %26 %25
+ %26 = OpLabel
+ OpBranch %13
+ %25 = OpLabel
+ OpStore %continue_execution %false None
+ OpBranch %13
+ %11 = OpLabel
+ %28 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %31 = OpLoad %uint %28 None
+%tint_low_inc = OpIAdd %uint %31 %uint_1
+ %34 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %34 %tint_low_inc None
+ %35 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %35 %uint_1 %uint_0
+ %37 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %38 = OpLoad %uint %37 None
+ %39 = OpIAdd %uint %38 %tint_carry
+ %40 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %40 %39 None
+ OpBranch %12
+ %13 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %7
- %15 = OpLabel
+ %42 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/discard/multiple_returns.wgsl.expected.spvasm b/test/tint/statements/discard/multiple_returns.wgsl.expected.spvasm
index 67ea05b..1a76ffc 100644
--- a/test/tint/statements/discard/multiple_returns.wgsl.expected.spvasm
+++ b/test/tint/statements/discard/multiple_returns.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 77
+; Bound: 102
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -14,6 +14,9 @@
OpName %continue_execution "continue_execution"
OpName %main "main"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpMemberDecorate %non_uniform_global_block 0 Offset 0
OpDecorate %non_uniform_global_block Block
OpDecorate %1 DescriptorSet 0
@@ -47,11 +50,20 @@
%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
%float_0 = OpConstant %float 0
%_ptr_Function_int = OpTypePointer Function %int
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %50 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %53 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %v2bool = OpTypeVector %bool 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_1 = OpConstant %uint 1
%int_1 = OpConstant %int 1
%int_5 = OpConstant %int 5
%main = OpFunction %void None %15
%16 = OpLabel
%i = OpVariable %_ptr_Function_int Function
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %50
%17 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
%21 = OpLoad %int %17 None
%22 = OpSLessThan %bool %21 %int_0
@@ -77,62 +89,84 @@
OpBranchConditional %36 %39 %38
%39 = OpLabel
OpStore %i %int_0
- OpBranch %44
- %44 = OpLabel
- OpLoopMerge %45 %43 None
OpBranch %42
%42 = OpLabel
- %46 = OpAccessChain %_ptr_StorageBuffer_float %5 %uint_0
- %47 = OpLoad %float %46 None
- %48 = OpLoad %int %i None
- %49 = OpConvertSToF %float %48
- %50 = OpFOrdGreaterThan %bool %47 %49
- OpSelectionMerge %51 None
- OpBranchConditional %50 %52 %51
- %52 = OpLabel
- %53 = OpLoad %int %i None
- %54 = OpConvertSToF %float %53
- %55 = OpAccessChain %_ptr_StorageBuffer_float %5 %uint_0
- %56 = OpLoad %bool %continue_execution None
+ OpBranch %45
+ %45 = OpLabel
+ OpLoopMerge %46 %44 None
+ OpBranch %43
+ %43 = OpLabel
+ %51 = OpLoad %v2uint %tint_loop_idx None
+ %52 = OpIEqual %v2bool %51 %53
+ %56 = OpAll %bool %52
OpSelectionMerge %57 None
OpBranchConditional %56 %58 %57
%58 = OpLabel
- OpStore %55 %54 None
- OpBranch %57
+ OpBranch %46
%57 = OpLabel
- %59 = OpLoad %bool %continue_execution None
- %60 = OpLogicalNot %bool %59
- OpSelectionMerge %61 None
- OpBranchConditional %60 %62 %61
- %62 = OpLabel
- OpKill
- %61 = OpLabel
- OpReturn
- %51 = OpLabel
- OpBranch %43
- %43 = OpLabel
- %63 = OpLoad %int %i None
- %64 = OpIAdd %int %63 %int_1
- OpStore %i %64 None
+ %59 = OpAccessChain %_ptr_StorageBuffer_float %5 %uint_0
+ %60 = OpLoad %float %59 None
+ %61 = OpLoad %int %i None
+ %62 = OpConvertSToF %float %61
+ %63 = OpFOrdGreaterThan %bool %60 %62
+ OpSelectionMerge %64 None
+ OpBranchConditional %63 %65 %64
+ %65 = OpLabel
%66 = OpLoad %int %i None
- %67 = OpIEqual %bool %66 %int_5
- OpBranchConditional %67 %45 %44
- %45 = OpLabel
+ %67 = OpConvertSToF %float %66
+ %68 = OpAccessChain %_ptr_StorageBuffer_float %5 %uint_0
%69 = OpLoad %bool %continue_execution None
- %70 = OpLogicalNot %bool %69
- OpSelectionMerge %71 None
- OpBranchConditional %70 %72 %71
- %72 = OpLabel
- OpKill
+ OpSelectionMerge %70 None
+ OpBranchConditional %69 %71 %70
%71 = OpLabel
+ OpStore %68 %67 None
+ OpBranch %70
+ %70 = OpLabel
+ %72 = OpLoad %bool %continue_execution None
+ %73 = OpLogicalNot %bool %72
+ OpSelectionMerge %74 None
+ OpBranchConditional %73 %75 %74
+ %75 = OpLabel
+ OpKill
+ %74 = OpLabel
+ OpReturn
+ %64 = OpLabel
+ OpBranch %44
+ %44 = OpLabel
+ %76 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %78 = OpLoad %uint %76 None
+%tint_low_inc = OpIAdd %uint %78 %uint_1
+ %81 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %81 %tint_low_inc None
+ %82 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %82 %uint_1 %uint_0
+ %84 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %85 = OpLoad %uint %84 None
+ %86 = OpIAdd %uint %85 %tint_carry
+ %87 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %87 %86 None
+ %88 = OpLoad %int %i None
+ %89 = OpIAdd %int %88 %int_1
+ OpStore %i %89 None
+ %91 = OpLoad %int %i None
+ %92 = OpIEqual %bool %91 %int_5
+ OpBranchConditional %92 %46 %45
+ %46 = OpLabel
+ %94 = OpLoad %bool %continue_execution None
+ %95 = OpLogicalNot %bool %94
+ OpSelectionMerge %96 None
+ OpBranchConditional %95 %97 %96
+ %97 = OpLabel
+ OpKill
+ %96 = OpLabel
OpReturn
%38 = OpLabel
- %73 = OpLoad %bool %continue_execution None
- %74 = OpLogicalNot %bool %73
- OpSelectionMerge %75 None
- OpBranchConditional %74 %76 %75
- %76 = OpLabel
+ %98 = OpLoad %bool %continue_execution None
+ %99 = OpLogicalNot %bool %98
+ OpSelectionMerge %100 None
+ OpBranchConditional %99 %101 %100
+ %101 = OpLabel
OpKill
- %75 = OpLabel
+ %100 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/for/complex.wgsl.expected.spvasm b/test/tint/statements/for/complex.wgsl.expected.spvasm
index 66833bc..d464e59 100644
--- a/test/tint/statements/for/complex.wgsl.expected.spvasm
+++ b/test/tint/statements/for/complex.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 41
+; Bound: 67
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -10,19 +10,32 @@
OpName %some_loop_body "some_loop_body"
OpName %f "f"
OpName %j "j"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %i "i"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%void = OpTypeVoid
%3 = OpTypeFunction %void
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%10 = OpConstantNull %int
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %20 = OpConstantNull %v2uint
%int_0 = OpConstant %int 0
- %int_5 = OpConstant %int 5
+%uint_4294967295 = OpConstant %uint 4294967295
+ %25 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %int_5 = OpConstant %int 5
%int_10 = OpConstant %int 10
%false = OpConstantFalse %bool
%int_30 = OpConstant %int 30
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%int_1 = OpConstant %int 1
%some_loop_body = OpFunction %void None %3
%4 = OpLabel
@@ -31,6 +44,7 @@
%f = OpFunction %void None %3
%6 = OpLabel
%j = OpVariable %_ptr_Function_int Function %10
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %20
%i = OpVariable %_ptr_Function_int Function
OpBranch %11
%11 = OpLabel
@@ -40,37 +54,57 @@
OpLoopMerge %15 %13 None
OpBranch %12
%12 = OpLabel
- %18 = OpLoad %int %i None
- %19 = OpSLessThan %bool %18 %int_5
- OpSelectionMerge %22 None
- OpBranchConditional %19 %23 %24
- %23 = OpLabel
- %25 = OpLoad %int %j None
- %26 = OpSLessThan %bool %25 %int_10
- OpBranch %22
- %24 = OpLabel
- OpBranch %22
- %22 = OpLabel
- %28 = OpPhi %bool %26 %23 %false %24
+ %23 = OpLoad %v2uint %tint_loop_idx None
+ %24 = OpIEqual %v2bool %23 %25
+ %29 = OpAll %bool %24
OpSelectionMerge %30 None
- OpBranchConditional %28 %30 %31
+ OpBranchConditional %29 %31 %30
%31 = OpLabel
OpBranch %15
%30 = OpLabel
- %32 = OpFunctionCall %void %some_loop_body
- %33 = OpLoad %int %i None
- %34 = OpIMul %int %33 %int_30
- OpStore %j %34 None
+ %32 = OpLoad %int %i None
+ %33 = OpSLessThan %bool %32 %int_5
+ OpSelectionMerge %35 None
+ OpBranchConditional %33 %36 %37
+ %36 = OpLabel
+ %38 = OpLoad %int %j None
+ %39 = OpSLessThan %bool %38 %int_10
+ OpBranch %35
+ %37 = OpLabel
+ OpBranch %35
+ %35 = OpLabel
+ %41 = OpPhi %bool %39 %36 %false %37
+ OpSelectionMerge %43 None
+ OpBranchConditional %41 %43 %44
+ %44 = OpLabel
+ OpBranch %15
+ %43 = OpLabel
+ %45 = OpFunctionCall %void %some_loop_body
+ %46 = OpLoad %int %i None
+ %47 = OpIMul %int %46 %int_30
+ OpStore %j %47 None
OpBranch %13
%13 = OpLabel
- %36 = OpLoad %int %i None
- %37 = OpIAdd %int %36 %int_1
- OpStore %i %37 None
+ %49 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %52 = OpLoad %uint %49 None
+%tint_low_inc = OpIAdd %uint %52 %uint_1
+ %55 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %55 %tint_low_inc None
+ %56 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %56 %uint_1 %uint_0
+ %58 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %59 = OpLoad %uint %58 None
+ %60 = OpIAdd %uint %59 %tint_carry
+ %61 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %61 %60 None
+ %62 = OpLoad %int %i None
+ %63 = OpIAdd %int %62 %int_1
+ OpStore %i %63 None
OpBranch %14
%15 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %3
- %40 = OpLabel
+ %66 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/for/condition/array_ctor.wgsl.expected.spvasm b/test/tint/statements/for/condition/array_ctor.wgsl.expected.spvasm
index 501208d..d6dc0c4 100644
--- a/test/tint/statements/for/condition/array_ctor.wgsl.expected.spvasm
+++ b/test/tint/statements/for/condition/array_ctor.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 21
+; Bound: 48
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -9,36 +9,72 @@
OpExecutionMode %unused_entry_point LocalSize 1 1 1
OpName %f "f"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%void = OpTypeVoid
%3 = OpTypeFunction %void
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%8 = OpConstantNull %int
- %int_1 = OpConstant %int 1
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %18 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %int_1 = OpConstant %int 1
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%f = OpFunction %void None %3
%4 = OpLabel
%i = OpVariable %_ptr_Function_int Function %8
- OpBranch %11
- %11 = OpLabel
- OpLoopMerge %12 %10 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %18
OpBranch %9
%9 = OpLabel
- %13 = OpLoad %int %i None
- %14 = OpSLessThan %bool %13 %int_1
- OpSelectionMerge %17 None
- OpBranchConditional %14 %17 %18
- %18 = OpLabel
OpBranch %12
- %17 = OpLabel
+ %12 = OpLabel
+ OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
+ %27 = OpLabel
+ OpBranch %13
+ %26 = OpLabel
+ %28 = OpLoad %int %i None
+ %29 = OpSLessThan %bool %28 %int_1
+ OpSelectionMerge %31 None
+ OpBranchConditional %29 %31 %32
+ %32 = OpLabel
+ OpBranch %13
+ %31 = OpLabel
OpBranch %11
- %12 = OpLabel
+ %11 = OpLabel
+ %33 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %36 = OpLoad %uint %33 None
+%tint_low_inc = OpIAdd %uint %36 %uint_1
+ %39 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %39 %tint_low_inc None
+ %40 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %40 %uint_1 %uint_0
+ %42 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %43 = OpLoad %uint %42 None
+ %44 = OpIAdd %uint %43 %tint_carry
+ %45 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %45 %44 None
+ OpBranch %12
+ %13 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %3
- %20 = OpLabel
+ %47 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/for/condition/basic.wgsl.expected.spvasm b/test/tint/statements/for/condition/basic.wgsl.expected.spvasm
index 021dd68..df98fd5 100644
--- a/test/tint/statements/for/condition/basic.wgsl.expected.spvasm
+++ b/test/tint/statements/for/condition/basic.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 21
+; Bound: 48
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -9,36 +9,72 @@
OpExecutionMode %unused_entry_point LocalSize 1 1 1
OpName %f "f"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%void = OpTypeVoid
%3 = OpTypeFunction %void
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%8 = OpConstantNull %int
- %int_4 = OpConstant %int 4
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %18 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %int_4 = OpConstant %int 4
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%f = OpFunction %void None %3
%4 = OpLabel
%i = OpVariable %_ptr_Function_int Function %8
- OpBranch %11
- %11 = OpLabel
- OpLoopMerge %12 %10 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %18
OpBranch %9
%9 = OpLabel
- %13 = OpLoad %int %i None
- %14 = OpSLessThan %bool %13 %int_4
- OpSelectionMerge %17 None
- OpBranchConditional %14 %17 %18
- %18 = OpLabel
OpBranch %12
- %17 = OpLabel
+ %12 = OpLabel
+ OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
+ %27 = OpLabel
+ OpBranch %13
+ %26 = OpLabel
+ %28 = OpLoad %int %i None
+ %29 = OpSLessThan %bool %28 %int_4
+ OpSelectionMerge %31 None
+ OpBranchConditional %29 %31 %32
+ %32 = OpLabel
+ OpBranch %13
+ %31 = OpLabel
OpBranch %11
- %12 = OpLabel
+ %11 = OpLabel
+ %33 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %36 = OpLoad %uint %33 None
+%tint_low_inc = OpIAdd %uint %36 %uint_1
+ %39 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %39 %tint_low_inc None
+ %40 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %40 %uint_1 %uint_0
+ %42 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %43 = OpLoad %uint %42 None
+ %44 = OpIAdd %uint %43 %tint_carry
+ %45 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %45 %44 None
+ OpBranch %12
+ %13 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %3
- %20 = OpLabel
+ %47 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/for/condition/struct_ctor.wgsl.expected.spvasm b/test/tint/statements/for/condition/struct_ctor.wgsl.expected.spvasm
index 501208d..d6dc0c4 100644
--- a/test/tint/statements/for/condition/struct_ctor.wgsl.expected.spvasm
+++ b/test/tint/statements/for/condition/struct_ctor.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 21
+; Bound: 48
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -9,36 +9,72 @@
OpExecutionMode %unused_entry_point LocalSize 1 1 1
OpName %f "f"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%void = OpTypeVoid
%3 = OpTypeFunction %void
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%8 = OpConstantNull %int
- %int_1 = OpConstant %int 1
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %18 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %int_1 = OpConstant %int 1
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%f = OpFunction %void None %3
%4 = OpLabel
%i = OpVariable %_ptr_Function_int Function %8
- OpBranch %11
- %11 = OpLabel
- OpLoopMerge %12 %10 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %18
OpBranch %9
%9 = OpLabel
- %13 = OpLoad %int %i None
- %14 = OpSLessThan %bool %13 %int_1
- OpSelectionMerge %17 None
- OpBranchConditional %14 %17 %18
- %18 = OpLabel
OpBranch %12
- %17 = OpLabel
+ %12 = OpLabel
+ OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
+ %27 = OpLabel
+ OpBranch %13
+ %26 = OpLabel
+ %28 = OpLoad %int %i None
+ %29 = OpSLessThan %bool %28 %int_1
+ OpSelectionMerge %31 None
+ OpBranchConditional %29 %31 %32
+ %32 = OpLabel
+ OpBranch %13
+ %31 = OpLabel
OpBranch %11
- %12 = OpLabel
+ %11 = OpLabel
+ %33 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %36 = OpLoad %uint %33 None
+%tint_low_inc = OpIAdd %uint %36 %uint_1
+ %39 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %39 %tint_low_inc None
+ %40 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %40 %uint_1 %uint_0
+ %42 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %43 = OpLoad %uint %42 None
+ %44 = OpIAdd %uint %43 %tint_carry
+ %45 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %45 %44 None
+ OpBranch %12
+ %13 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %3
- %20 = OpLabel
+ %47 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/for/continuing/array_ctor.wgsl.expected.spvasm b/test/tint/statements/for/continuing/array_ctor.wgsl.expected.spvasm
index f5c7171..b0fbf0d 100644
--- a/test/tint/statements/for/continuing/array_ctor.wgsl.expected.spvasm
+++ b/test/tint/statements/for/continuing/array_ctor.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 22
+; Bound: 49
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -9,38 +9,74 @@
OpExecutionMode %unused_entry_point LocalSize 1 1 1
OpName %f "f"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%void = OpTypeVoid
%3 = OpTypeFunction %void
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%8 = OpConstantNull %int
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %18 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%false = OpConstantFalse %bool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%int_1 = OpConstant %int 1
%f = OpFunction %void None %3
%4 = OpLabel
%i = OpVariable %_ptr_Function_int Function %8
- OpBranch %11
- %11 = OpLabel
- OpLoopMerge %12 %10 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %18
OpBranch %9
%9 = OpLabel
- OpSelectionMerge %13 None
- OpBranchConditional %false %13 %14
- %14 = OpLabel
OpBranch %12
- %13 = OpLabel
+ %12 = OpLabel
+ OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
- %17 = OpLoad %int %i None
- %18 = OpIAdd %int %17 %int_1
- OpStore %i %18 None
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
+ %27 = OpLabel
+ OpBranch %13
+ %26 = OpLabel
+ OpSelectionMerge %28 None
+ OpBranchConditional %false %28 %29
+ %29 = OpLabel
+ OpBranch %13
+ %28 = OpLabel
OpBranch %11
- %12 = OpLabel
+ %11 = OpLabel
+ %31 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %34 = OpLoad %uint %31 None
+%tint_low_inc = OpIAdd %uint %34 %uint_1
+ %37 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %37 %tint_low_inc None
+ %38 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %38 %uint_1 %uint_0
+ %40 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %41 = OpLoad %uint %40 None
+ %42 = OpIAdd %uint %41 %tint_carry
+ %43 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %43 %42 None
+ %44 = OpLoad %int %i None
+ %45 = OpIAdd %int %44 %int_1
+ OpStore %i %45 None
+ OpBranch %12
+ %13 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %3
- %21 = OpLabel
+ %48 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/for/continuing/basic.wgsl.expected.spvasm b/test/tint/statements/for/continuing/basic.wgsl.expected.spvasm
index f5c7171..b0fbf0d 100644
--- a/test/tint/statements/for/continuing/basic.wgsl.expected.spvasm
+++ b/test/tint/statements/for/continuing/basic.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 22
+; Bound: 49
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -9,38 +9,74 @@
OpExecutionMode %unused_entry_point LocalSize 1 1 1
OpName %f "f"
OpName %i "i"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%void = OpTypeVoid
%3 = OpTypeFunction %void
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%8 = OpConstantNull %int
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %18 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%false = OpConstantFalse %bool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%int_1 = OpConstant %int 1
%f = OpFunction %void None %3
%4 = OpLabel
%i = OpVariable %_ptr_Function_int Function %8
- OpBranch %11
- %11 = OpLabel
- OpLoopMerge %12 %10 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %18
OpBranch %9
%9 = OpLabel
- OpSelectionMerge %13 None
- OpBranchConditional %false %13 %14
- %14 = OpLabel
OpBranch %12
- %13 = OpLabel
+ %12 = OpLabel
+ OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
- %17 = OpLoad %int %i None
- %18 = OpIAdd %int %17 %int_1
- OpStore %i %18 None
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
+ %27 = OpLabel
+ OpBranch %13
+ %26 = OpLabel
+ OpSelectionMerge %28 None
+ OpBranchConditional %false %28 %29
+ %29 = OpLabel
+ OpBranch %13
+ %28 = OpLabel
OpBranch %11
- %12 = OpLabel
+ %11 = OpLabel
+ %31 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %34 = OpLoad %uint %31 None
+%tint_low_inc = OpIAdd %uint %34 %uint_1
+ %37 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %37 %tint_low_inc None
+ %38 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %38 %uint_1 %uint_0
+ %40 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %41 = OpLoad %uint %40 None
+ %42 = OpIAdd %uint %41 %tint_carry
+ %43 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %43 %42 None
+ %44 = OpLoad %int %i None
+ %45 = OpIAdd %int %44 %int_1
+ OpStore %i %45 None
+ OpBranch %12
+ %13 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %3
- %21 = OpLabel
+ %48 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/for/continuing/struct_ctor.wgsl.expected.spvasm b/test/tint/statements/for/continuing/struct_ctor.wgsl.expected.spvasm
index 99e57a7..6021105 100644
--- a/test/tint/statements/for/continuing/struct_ctor.wgsl.expected.spvasm
+++ b/test/tint/statements/for/continuing/struct_ctor.wgsl.expected.spvasm
@@ -1,25 +1,39 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 23
+; Bound: 49
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
OpExecutionMode %unused_entry_point LocalSize 1 1 1
OpName %f "f"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %i "i"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%void = OpTypeVoid
%3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %14 = OpConstantNull %v2uint
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%false = OpConstantFalse %bool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%int_1 = OpConstant %int 1
%f = OpFunction %void None %3
%4 = OpLabel
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %14
%i = OpVariable %_ptr_Function_int Function
OpBranch %5
%5 = OpLabel
@@ -29,21 +43,41 @@
OpLoopMerge %9 %7 None
OpBranch %6
%6 = OpLabel
- OpSelectionMerge %14 None
- OpBranchConditional %false %14 %15
- %15 = OpLabel
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
+ %27 = OpLabel
OpBranch %9
- %14 = OpLabel
+ %26 = OpLabel
+ OpSelectionMerge %28 None
+ OpBranchConditional %false %28 %29
+ %29 = OpLabel
+ OpBranch %9
+ %28 = OpLabel
OpBranch %7
%7 = OpLabel
- %18 = OpLoad %int %i None
- %19 = OpIAdd %int %18 %int_1
- OpStore %i %19 None
+ %31 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %34 = OpLoad %uint %31 None
+%tint_low_inc = OpIAdd %uint %34 %uint_1
+ %37 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %37 %tint_low_inc None
+ %38 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %38 %uint_1 %uint_0
+ %40 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %41 = OpLoad %uint %40 None
+ %42 = OpIAdd %uint %41 %tint_carry
+ %43 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %43 %42 None
+ %44 = OpLoad %int %i None
+ %45 = OpIAdd %int %44 %int_1
+ OpStore %i %45 None
OpBranch %8
%9 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %3
- %22 = OpLabel
+ %48 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/for/empty.wgsl.expected.spvasm b/test/tint/statements/for/empty.wgsl.expected.spvasm
index 887bc35..42f3b83 100644
--- a/test/tint/statements/for/empty.wgsl.expected.spvasm
+++ b/test/tint/statements/for/empty.wgsl.expected.spvasm
@@ -1,37 +1,73 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 15
+; Bound: 42
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
OpExecutionMode %unused_entry_point LocalSize 1 1 1
OpName %f "f"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%void = OpTypeVoid
%3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %14 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %17 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%false = OpConstantFalse %bool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%f = OpFunction %void None %3
%4 = OpLabel
- OpBranch %7
- %7 = OpLabel
- OpLoopMerge %8 %6 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %14
OpBranch %5
%5 = OpLabel
- OpSelectionMerge %9 None
- OpBranchConditional %false %9 %10
- %10 = OpLabel
OpBranch %8
- %9 = OpLabel
+ %8 = OpLabel
+ OpLoopMerge %9 %7 None
OpBranch %6
%6 = OpLabel
+ %15 = OpLoad %v2uint %tint_loop_idx None
+ %16 = OpIEqual %v2bool %15 %17
+ %21 = OpAll %bool %16
+ OpSelectionMerge %22 None
+ OpBranchConditional %21 %23 %22
+ %23 = OpLabel
+ OpBranch %9
+ %22 = OpLabel
+ OpSelectionMerge %24 None
+ OpBranchConditional %false %24 %25
+ %25 = OpLabel
+ OpBranch %9
+ %24 = OpLabel
OpBranch %7
- %8 = OpLabel
+ %7 = OpLabel
+ %27 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %30 = OpLoad %uint %27 None
+%tint_low_inc = OpIAdd %uint %30 %uint_1
+ %33 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %33 %tint_low_inc None
+ %34 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %34 %uint_1 %uint_0
+ %36 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %37 = OpLoad %uint %36 None
+ %38 = OpIAdd %uint %37 %tint_carry
+ %39 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %39 %38 None
+ OpBranch %8
+ %9 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %3
- %14 = OpLabel
+ %41 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/for/initializer/array_ctor.wgsl.expected.spvasm b/test/tint/statements/for/initializer/array_ctor.wgsl.expected.spvasm
index 28bb955..62d5dda 100644
--- a/test/tint/statements/for/initializer/array_ctor.wgsl.expected.spvasm
+++ b/test/tint/statements/for/initializer/array_ctor.wgsl.expected.spvasm
@@ -1,24 +1,38 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 20
+; Bound: 46
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
OpExecutionMode %unused_entry_point LocalSize 1 1 1
OpName %f "f"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %i "i"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%void = OpTypeVoid
%3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %14 = OpConstantNull %v2uint
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%int_1 = OpConstant %int 1
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%false = OpConstantFalse %bool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%f = OpFunction %void None %3
%4 = OpLabel
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %14
%i = OpVariable %_ptr_Function_int Function
OpBranch %5
%5 = OpLabel
@@ -28,18 +42,38 @@
OpLoopMerge %9 %7 None
OpBranch %6
%6 = OpLabel
- OpSelectionMerge %14 None
- OpBranchConditional %false %14 %15
- %15 = OpLabel
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
+ %27 = OpLabel
OpBranch %9
- %14 = OpLabel
+ %26 = OpLabel
+ OpSelectionMerge %28 None
+ OpBranchConditional %false %28 %29
+ %29 = OpLabel
+ OpBranch %9
+ %28 = OpLabel
OpBranch %7
%7 = OpLabel
+ %31 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %34 = OpLoad %uint %31 None
+%tint_low_inc = OpIAdd %uint %34 %uint_1
+ %37 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %37 %tint_low_inc None
+ %38 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %38 %uint_1 %uint_0
+ %40 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %41 = OpLoad %uint %40 None
+ %42 = OpIAdd %uint %41 %tint_carry
+ %43 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %43 %42 None
OpBranch %8
%9 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %3
- %19 = OpLabel
+ %45 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/for/initializer/basic.wgsl.expected.spvasm b/test/tint/statements/for/initializer/basic.wgsl.expected.spvasm
index 8ecc331..cb45685 100644
--- a/test/tint/statements/for/initializer/basic.wgsl.expected.spvasm
+++ b/test/tint/statements/for/initializer/basic.wgsl.expected.spvasm
@@ -1,24 +1,38 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 20
+; Bound: 46
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
OpExecutionMode %unused_entry_point LocalSize 1 1 1
OpName %f "f"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %i "i"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%void = OpTypeVoid
%3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %14 = OpConstantNull %v2uint
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%false = OpConstantFalse %bool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%f = OpFunction %void None %3
%4 = OpLabel
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %14
%i = OpVariable %_ptr_Function_int Function
OpBranch %5
%5 = OpLabel
@@ -28,18 +42,38 @@
OpLoopMerge %9 %7 None
OpBranch %6
%6 = OpLabel
- OpSelectionMerge %14 None
- OpBranchConditional %false %14 %15
- %15 = OpLabel
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
+ %27 = OpLabel
OpBranch %9
- %14 = OpLabel
+ %26 = OpLabel
+ OpSelectionMerge %28 None
+ OpBranchConditional %false %28 %29
+ %29 = OpLabel
+ OpBranch %9
+ %28 = OpLabel
OpBranch %7
%7 = OpLabel
+ %31 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %34 = OpLoad %uint %31 None
+%tint_low_inc = OpIAdd %uint %34 %uint_1
+ %37 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %37 %tint_low_inc None
+ %38 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %38 %uint_1 %uint_0
+ %40 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %41 = OpLoad %uint %40 None
+ %42 = OpIAdd %uint %41 %tint_carry
+ %43 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %43 %42 None
OpBranch %8
%9 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %3
- %19 = OpLabel
+ %45 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/for/initializer/struct_ctor.wgsl.expected.spvasm b/test/tint/statements/for/initializer/struct_ctor.wgsl.expected.spvasm
index 28bb955..62d5dda 100644
--- a/test/tint/statements/for/initializer/struct_ctor.wgsl.expected.spvasm
+++ b/test/tint/statements/for/initializer/struct_ctor.wgsl.expected.spvasm
@@ -1,24 +1,38 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 20
+; Bound: 46
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
OpExecutionMode %unused_entry_point LocalSize 1 1 1
OpName %f "f"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %i "i"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
%void = OpTypeVoid
%3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %14 = OpConstantNull %v2uint
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%int_1 = OpConstant %int 1
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%false = OpConstantFalse %bool
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
%f = OpFunction %void None %3
%4 = OpLabel
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %14
%i = OpVariable %_ptr_Function_int Function
OpBranch %5
%5 = OpLabel
@@ -28,18 +42,38 @@
OpLoopMerge %9 %7 None
OpBranch %6
%6 = OpLabel
- OpSelectionMerge %14 None
- OpBranchConditional %false %14 %15
- %15 = OpLabel
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
+ %27 = OpLabel
OpBranch %9
- %14 = OpLabel
+ %26 = OpLabel
+ OpSelectionMerge %28 None
+ OpBranchConditional %false %28 %29
+ %29 = OpLabel
+ OpBranch %9
+ %28 = OpLabel
OpBranch %7
%7 = OpLabel
+ %31 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %34 = OpLoad %uint %31 None
+%tint_low_inc = OpIAdd %uint %34 %uint_1
+ %37 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %37 %tint_low_inc None
+ %38 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %38 %uint_1 %uint_0
+ %40 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %41 = OpLoad %uint %40 None
+ %42 = OpIAdd %uint %41 %tint_carry
+ %43 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %43 %42 None
OpBranch %8
%9 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %3
- %19 = OpLabel
+ %45 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/for/scoping.wgsl.expected.spvasm b/test/tint/statements/for/scoping.wgsl.expected.spvasm
index d56a413..226ad40 100644
--- a/test/tint/statements/for/scoping.wgsl.expected.spvasm
+++ b/test/tint/statements/for/scoping.wgsl.expected.spvasm
@@ -1,26 +1,41 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 18
+; Bound: 45
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
OpExecutionMode %unused_entry_point LocalSize 1 1 1
OpName %f "f"
+ OpName %tint_loop_idx "tint_loop_idx"
OpName %must_not_collide "must_not_collide"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %must_not_collide_0 "must_not_collide"
OpName %unused_entry_point "unused_entry_point"
%void = OpTypeVoid
%3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %14 = OpConstantNull %v2uint
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
- %15 = OpConstantNull %int
+%uint_4294967295 = OpConstant %uint 4294967295
+ %21 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1 = OpConstant %uint 1
+ %42 = OpConstantNull %int
%f = OpFunction %void None %3
%4 = OpLabel
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %14
%must_not_collide = OpVariable %_ptr_Function_int Function
-%must_not_collide_0 = OpVariable %_ptr_Function_int Function %15
+%must_not_collide_0 = OpVariable %_ptr_Function_int Function %42
OpBranch %5
%5 = OpLabel
OpStore %must_not_collide %int_0
@@ -29,13 +44,33 @@
OpLoopMerge %9 %7 None
OpBranch %6
%6 = OpLabel
+ %19 = OpLoad %v2uint %tint_loop_idx None
+ %20 = OpIEqual %v2bool %19 %21
+ %25 = OpAll %bool %20
+ OpSelectionMerge %26 None
+ OpBranchConditional %25 %27 %26
+ %27 = OpLabel
+ OpBranch %9
+ %26 = OpLabel
OpBranch %9
%7 = OpLabel
+ %28 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %31 = OpLoad %uint %28 None
+%tint_low_inc = OpIAdd %uint %31 %uint_1
+ %34 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %34 %tint_low_inc None
+ %35 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %35 %uint_1 %uint_0
+ %37 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %38 = OpLoad %uint %37 None
+ %39 = OpIAdd %uint %38 %tint_carry
+ %40 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %40 %39 None
OpBranch %8
%9 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %3
- %17 = OpLabel
+ %44 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/increment/complex.wgsl.expected.spvasm b/test/tint/statements/increment/complex.wgsl.expected.spvasm
index ed32919..4b26d7e 100644
--- a/test/tint/statements/increment/complex.wgsl.expected.spvasm
+++ b/test/tint/statements/increment/complex.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 106
+; Bound: 129
; Schema: 0
OpCapability Shader
- %63 = OpExtInstImport "GLSL.std.450"
+ %67 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
OpExecutionMode %unused_entry_point LocalSize 1 1 1
@@ -20,6 +20,9 @@
OpName %idx5 "idx5"
OpName %idx6 "idx6"
OpName %main "main"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
OpDecorate %_arr_v4int_uint_4 ArrayStride 16
OpMemberDecorate %S 0 Offset 0
@@ -51,13 +54,20 @@
%int_0 = OpConstant %int 0
%void = OpTypeVoid
%47 = OpTypeFunction %void
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %57 = OpConstantNull %v2uint
%_ptr_StorageBuffer__runtimearr_S = OpTypePointer StorageBuffer %_runtimearr_S
%uint_0 = OpConstant %uint 0
%uint_3 = OpConstant %uint 3
%_ptr_StorageBuffer_v4int = OpTypePointer StorageBuffer %v4int
%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
- %uint_10 = OpConstant %uint 10
+%uint_4294967295 = OpConstant %uint 4294967295
+ %85 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %uint_10 = OpConstant %uint 10
+%_ptr_Function_uint = OpTypePointer Function %uint
%idx1 = OpFunction %int None %15
%16 = OpLabel
%17 = OpLoad %uint %v None
@@ -102,67 +112,88 @@
OpFunctionEnd
%main = OpFunction %void None %47
%48 = OpLabel
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %57
OpBranch %49
%49 = OpLabel
- %54 = OpFunctionCall %int %idx1
- %55 = OpFunctionCall %int %idx2
- %56 = OpAccessChain %_ptr_StorageBuffer__runtimearr_S %1 %uint_0
- %59 = OpArrayLength %uint %1 0
- %60 = OpISub %uint %59 %uint_1
- %61 = OpBitcast %uint %54
- %62 = OpExtInst %uint %63 UMin %61 %60
- %64 = OpBitcast %uint %55
- %65 = OpExtInst %uint %63 UMin %64 %uint_3
- %67 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0 %62 %uint_0 %65
- %69 = OpFunctionCall %int %idx3
- %70 = OpBitcast %uint %69
- %71 = OpExtInst %uint %63 UMin %70 %uint_3
- %72 = OpAccessChain %_ptr_StorageBuffer_int %67 %71
- %74 = OpLoad %int %72 None
- %75 = OpIAdd %int %74 %int_1
- %76 = OpBitcast %uint %69
- %77 = OpExtInst %uint %63 UMin %76 %uint_3
- %78 = OpAccessChain %_ptr_StorageBuffer_int %67 %77
- OpStore %78 %75 None
+ %58 = OpFunctionCall %int %idx1
+ %59 = OpFunctionCall %int %idx2
+ %60 = OpAccessChain %_ptr_StorageBuffer__runtimearr_S %1 %uint_0
+ %63 = OpArrayLength %uint %1 0
+ %64 = OpISub %uint %63 %uint_1
+ %65 = OpBitcast %uint %58
+ %66 = OpExtInst %uint %67 UMin %65 %64
+ %68 = OpBitcast %uint %59
+ %69 = OpExtInst %uint %67 UMin %68 %uint_3
+ %71 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0 %66 %uint_0 %69
+ %73 = OpFunctionCall %int %idx3
+ %74 = OpBitcast %uint %73
+ %75 = OpExtInst %uint %67 UMin %74 %uint_3
+ %76 = OpAccessChain %_ptr_StorageBuffer_int %71 %75
+ %78 = OpLoad %int %76 None
+ %79 = OpIAdd %int %78 %int_1
+ %80 = OpBitcast %uint %73
+ %81 = OpExtInst %uint %67 UMin %80 %uint_3
+ %82 = OpAccessChain %_ptr_StorageBuffer_int %71 %81
+ OpStore %82 %79 None
OpBranch %52
%52 = OpLabel
OpLoopMerge %53 %51 None
OpBranch %50
%50 = OpLabel
- %79 = OpLoad %uint %v None
- %80 = OpULessThan %bool %79 %uint_10
- OpSelectionMerge %83 None
- OpBranchConditional %80 %83 %84
- %84 = OpLabel
+ %83 = OpLoad %v2uint %tint_loop_idx None
+ %84 = OpIEqual %v2bool %83 %85
+ %89 = OpAll %bool %84
+ OpSelectionMerge %90 None
+ OpBranchConditional %89 %91 %90
+ %91 = OpLabel
OpBranch %53
- %83 = OpLabel
+ %90 = OpLabel
+ %92 = OpLoad %uint %v None
+ %93 = OpULessThan %bool %92 %uint_10
+ OpSelectionMerge %95 None
+ OpBranchConditional %93 %95 %96
+ %96 = OpLabel
+ OpBranch %53
+ %95 = OpLabel
OpBranch %51
%51 = OpLabel
- %85 = OpFunctionCall %int %idx4
- %86 = OpFunctionCall %int %idx5
- %87 = OpAccessChain %_ptr_StorageBuffer__runtimearr_S %1 %uint_0
- %88 = OpArrayLength %uint %1 0
- %89 = OpISub %uint %88 %uint_1
- %90 = OpBitcast %uint %85
- %91 = OpExtInst %uint %63 UMin %90 %89
- %92 = OpBitcast %uint %86
- %93 = OpExtInst %uint %63 UMin %92 %uint_3
- %94 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0 %91 %uint_0 %93
- %95 = OpFunctionCall %int %idx6
- %96 = OpBitcast %uint %95
- %97 = OpExtInst %uint %63 UMin %96 %uint_3
- %98 = OpAccessChain %_ptr_StorageBuffer_int %94 %97
- %99 = OpLoad %int %98 None
- %100 = OpIAdd %int %99 %int_1
- %101 = OpBitcast %uint %95
- %102 = OpExtInst %uint %63 UMin %101 %uint_3
- %103 = OpAccessChain %_ptr_StorageBuffer_int %94 %102
- OpStore %103 %100 None
+ %97 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %99 = OpLoad %uint %97 None
+%tint_low_inc = OpIAdd %uint %99 %uint_1
+ %101 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %101 %tint_low_inc None
+ %102 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %102 %uint_1 %uint_0
+ %104 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %105 = OpLoad %uint %104 None
+ %106 = OpIAdd %uint %105 %tint_carry
+ %107 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %107 %106 None
+ %108 = OpFunctionCall %int %idx4
+ %109 = OpFunctionCall %int %idx5
+ %110 = OpAccessChain %_ptr_StorageBuffer__runtimearr_S %1 %uint_0
+ %111 = OpArrayLength %uint %1 0
+ %112 = OpISub %uint %111 %uint_1
+ %113 = OpBitcast %uint %108
+ %114 = OpExtInst %uint %67 UMin %113 %112
+ %115 = OpBitcast %uint %109
+ %116 = OpExtInst %uint %67 UMin %115 %uint_3
+ %117 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0 %114 %uint_0 %116
+ %118 = OpFunctionCall %int %idx6
+ %119 = OpBitcast %uint %118
+ %120 = OpExtInst %uint %67 UMin %119 %uint_3
+ %121 = OpAccessChain %_ptr_StorageBuffer_int %117 %120
+ %122 = OpLoad %int %121 None
+ %123 = OpIAdd %int %122 %int_1
+ %124 = OpBitcast %uint %118
+ %125 = OpExtInst %uint %67 UMin %124 %uint_3
+ %126 = OpAccessChain %_ptr_StorageBuffer_int %117 %125
+ OpStore %126 %123 None
OpBranch %52
%53 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %47
- %105 = OpLabel
+ %128 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/increment/for_loop_continuing.wgsl.expected.spvasm b/test/tint/statements/increment/for_loop_continuing.wgsl.expected.spvasm
index 9faf96c..f3bed56 100644
--- a/test/tint/statements/increment/for_loop_continuing.wgsl.expected.spvasm
+++ b/test/tint/statements/increment/for_loop_continuing.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 29
+; Bound: 53
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -10,6 +10,9 @@
OpMemberName %i_block 0 "inner"
OpName %i_block "i_block"
OpName %main "main"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
OpMemberDecorate %i_block 0 Offset 0
OpDecorate %i_block Block
@@ -22,38 +25,68 @@
%1 = OpVariable %_ptr_StorageBuffer_i_block StorageBuffer
%void = OpTypeVoid
%7 = OpTypeFunction %void
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %17 = OpConstantNull %v2uint
+%uint_4294967295 = OpConstant %uint 4294967295
+ %20 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
+ %bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
%uint_0 = OpConstant %uint 0
%uint_10 = OpConstant %uint 10
- %bool = OpTypeBool
+%_ptr_Function_uint = OpTypePointer Function %uint
%uint_1 = OpConstant %uint 1
%main = OpFunction %void None %7
%8 = OpLabel
- OpBranch %11
- %11 = OpLabel
- OpLoopMerge %12 %10 None
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %17
OpBranch %9
%9 = OpLabel
- %13 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
- %16 = OpLoad %uint %13 None
- %17 = OpULessThan %bool %16 %uint_10
- OpSelectionMerge %20 None
- OpBranchConditional %17 %20 %21
- %21 = OpLabel
OpBranch %12
- %20 = OpLabel
+ %12 = OpLabel
+ OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
- %22 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
- %23 = OpLoad %uint %22 None
- %24 = OpIAdd %uint %23 %uint_1
- %26 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
- OpStore %26 %24 None
+ %18 = OpLoad %v2uint %tint_loop_idx None
+ %19 = OpIEqual %v2bool %18 %20
+ %24 = OpAll %bool %19
+ OpSelectionMerge %25 None
+ OpBranchConditional %24 %26 %25
+ %26 = OpLabel
+ OpBranch %13
+ %25 = OpLabel
+ %27 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+ %30 = OpLoad %uint %27 None
+ %31 = OpULessThan %bool %30 %uint_10
+ OpSelectionMerge %33 None
+ OpBranchConditional %31 %33 %34
+ %34 = OpLabel
+ OpBranch %13
+ %33 = OpLabel
OpBranch %11
- %12 = OpLabel
+ %11 = OpLabel
+ %35 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %37 = OpLoad %uint %35 None
+%tint_low_inc = OpIAdd %uint %37 %uint_1
+ %40 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %40 %tint_low_inc None
+ %41 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %41 %uint_1 %uint_0
+ %43 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %44 = OpLoad %uint %43 None
+ %45 = OpIAdd %uint %44 %tint_carry
+ %46 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %46 %45 None
+ %47 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+ %48 = OpLoad %uint %47 None
+ %49 = OpIAdd %uint %48 %uint_1
+ %50 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+ OpStore %50 %49 None
+ OpBranch %12
+ %13 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %7
- %28 = OpLabel
+ %52 = OpLabel
OpReturn
OpFunctionEnd
diff --git a/test/tint/statements/increment/for_loop_initializer.wgsl.expected.spvasm b/test/tint/statements/increment/for_loop_initializer.wgsl.expected.spvasm
index 2ae958e..e100e2f 100644
--- a/test/tint/statements/increment/for_loop_initializer.wgsl.expected.spvasm
+++ b/test/tint/statements/increment/for_loop_initializer.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 1
-; Bound: 30
+; Bound: 53
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -10,6 +10,9 @@
OpMemberName %i_block 0 "inner"
OpName %i_block "i_block"
OpName %main "main"
+ OpName %tint_loop_idx "tint_loop_idx"
+ OpName %tint_low_inc "tint_low_inc"
+ OpName %tint_carry "tint_carry"
OpName %unused_entry_point "unused_entry_point"
OpMemberDecorate %i_block 0 Offset 0
OpDecorate %i_block Block
@@ -22,40 +25,68 @@
%1 = OpVariable %_ptr_StorageBuffer_i_block StorageBuffer
%void = OpTypeVoid
%7 = OpTypeFunction %void
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %17 = OpConstantNull %v2uint
%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
- %uint_10 = OpConstant %uint 10
+%uint_4294967295 = OpConstant %uint 4294967295
+ %27 = OpConstantComposite %v2uint %uint_4294967295 %uint_4294967295
%bool = OpTypeBool
+ %v2bool = OpTypeVector %bool 2
+ %uint_10 = OpConstant %uint 10
+%_ptr_Function_uint = OpTypePointer Function %uint
%main = OpFunction %void None %7
%8 = OpLabel
+%tint_loop_idx = OpVariable %_ptr_Function_v2uint Function %17
OpBranch %9
%9 = OpLabel
- %14 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
- %17 = OpLoad %uint %14 None
- %18 = OpIAdd %uint %17 %uint_1
- %20 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
- OpStore %20 %18 None
+ %18 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+ %21 = OpLoad %uint %18 None
+ %22 = OpIAdd %uint %21 %uint_1
+ %24 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+ OpStore %24 %22 None
OpBranch %12
%12 = OpLabel
OpLoopMerge %13 %11 None
OpBranch %10
%10 = OpLabel
- %21 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
- %22 = OpLoad %uint %21 None
- %23 = OpULessThan %bool %22 %uint_10
- OpSelectionMerge %26 None
- OpBranchConditional %23 %26 %27
- %27 = OpLabel
+ %25 = OpLoad %v2uint %tint_loop_idx None
+ %26 = OpIEqual %v2bool %25 %27
+ %31 = OpAll %bool %26
+ OpSelectionMerge %32 None
+ OpBranchConditional %31 %33 %32
+ %33 = OpLabel
OpBranch %13
- %26 = OpLabel
+ %32 = OpLabel
+ %34 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+ %35 = OpLoad %uint %34 None
+ %36 = OpULessThan %bool %35 %uint_10
+ OpSelectionMerge %38 None
+ OpBranchConditional %36 %38 %39
+ %39 = OpLabel
+ OpBranch %13
+ %38 = OpLabel
OpBranch %11
%11 = OpLabel
+ %40 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ %42 = OpLoad %uint %40 None
+%tint_low_inc = OpIAdd %uint %42 %uint_1
+ %44 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_0
+ OpStore %44 %tint_low_inc None
+ %45 = OpIEqual %bool %tint_low_inc %uint_0
+ %tint_carry = OpSelect %uint %45 %uint_1 %uint_0
+ %47 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ %48 = OpLoad %uint %47 None
+ %49 = OpIAdd %uint %48 %tint_carry
+ %50 = OpAccessChain %_ptr_Function_uint %tint_loop_idx %uint_1
+ OpStore %50 %49 None
OpBranch %12
%13 = OpLabel
OpReturn
OpFunctionEnd
%unused_entry_point = OpFunction %void None %7
- %29 = OpLabel
+ %52 = OpLabel
OpReturn
OpFunctionEnd