[tint][ast] Fix DemoteToHelper with atomicCompareExchangeWeak()
Since the resolver was able to parse 'untypable' builtin structures with https://dawn-review.googlesource.com/c/dawn/+/129482, some transforms (like PromoteInitializersToLet) are able to create lets of these 'untypeable' builtin types.
The DemoteToHelper transform had its own workaround for the 'untypeable' atomicCompareExchangeWeak() result type, by creating a user-declared structure with the same shape. This workaround can fail if a previous transform builds a variable with the 'untypeable' result type, as the user-declared type cannot be assigned to it.
Fortunately the fix here is simple - we can just remove the workaround in DemoteToHelper, which makes the transform emit the 'untypeable' result type, and so the assignment matches types.
Bug: chromium:324439761
Fixed: tint:2147
Change-Id: I89ca496c60ce140bfb7c5d6de54f4931afc85fbf
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/173180
Auto-Submit: Ben Clayton <bclayton@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
(cherry picked from commit f83de0f6583483d76b647ad716702723ec276a42)
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/174024
Reviewed-by: David Neto <dneto@google.com>
Kokoro: Ben Clayton <bclayton@google.com>
diff --git a/src/tint/lang/wgsl/ast/transform/demote_to_helper.cc b/src/tint/lang/wgsl/ast/transform/demote_to_helper.cc
index 93a539c..1b88f20 100644
--- a/src/tint/lang/wgsl/ast/transform/demote_to_helper.cc
+++ b/src/tint/lang/wgsl/ast/transform/demote_to_helper.cc
@@ -191,50 +191,10 @@
// }
// let y = x + tmp;
auto result = b.Sym();
- Type result_ty;
- const Statement* masked_call = nullptr;
- if (builtin->Fn() == wgsl::BuiltinFn::kAtomicCompareExchangeWeak) {
- // Special case for atomicCompareExchangeWeak as we cannot name its
- // result type. We have to declare an equivalent struct and copy the
- // original member values over to it.
-
- // Declare a struct to hold the result values.
- auto* result_struct = sem_call->Type()->As<core::type::Struct>();
- auto* atomic_ty = result_struct->Members()[0]->Type();
- result_ty =
- b.ty(tint::GetOrCreate(atomic_cmpxchg_result_types, atomic_ty, [&] {
- auto name = b.Sym();
- b.Structure(
- name,
- tint::Vector{
- b.Member("old_value", CreateASTTypeFor(ctx, atomic_ty)),
- b.Member("exchanged", b.ty.bool_()),
- });
- return name;
- }));
-
- // Generate the masked call and member-wise copy:
- // if (!tint_discarded) {
- // let tmp_result = atomicCompareExchangeWeak(&p, 1, 2);
- // result.exchanged = tmp_result.exchanged;
- // result.old_value = tmp_result.old_value;
- // }
- auto tmp_result = b.Sym();
- masked_call =
- b.If(b.Not(flag),
- b.Block(tint::Vector{
- b.Decl(b.Let(tmp_result, ctx.CloneWithoutTransform(call))),
- b.Assign(b.MemberAccessor(result, "old_value"),
- b.MemberAccessor(tmp_result, "old_value")),
- b.Assign(b.MemberAccessor(result, "exchanged"),
- b.MemberAccessor(tmp_result, "exchanged")),
- }));
- } else {
- result_ty = CreateASTTypeFor(ctx, sem_call->Type());
- masked_call =
- b.If(b.Not(flag),
- b.Block(b.Assign(result, ctx.CloneWithoutTransform(call))));
- }
+ auto result_ty = CreateASTTypeFor(ctx, sem_call->Type());
+ auto* masked_call =
+ b.If(b.Not(flag),
+ b.Block(b.Assign(result, ctx.CloneWithoutTransform(call))));
auto* result_decl = b.Decl(b.Var(result, result_ty));
hoist_to_decl_before.Prepare(sem_call);
hoist_to_decl_before.InsertBefore(stmt, result_decl);
diff --git a/src/tint/lang/wgsl/ast/transform/demote_to_helper_test.cc b/src/tint/lang/wgsl/ast/transform/demote_to_helper_test.cc
index de590a4..0af6dd1 100644
--- a/src/tint/lang/wgsl/ast/transform/demote_to_helper_test.cc
+++ b/src/tint/lang/wgsl/ast/transform/demote_to_helper_test.cc
@@ -1187,11 +1187,6 @@
auto* expect = R"(
var<private> tint_discarded = false;
-struct tint_symbol_1 {
- old_value : i32,
- exchanged : bool,
-}
-
@group(0) @binding(0) var t : texture_2d<f32>;
@group(0) @binding(1) var s : sampler;
@@ -1204,20 +1199,16 @@
tint_discarded = true;
}
var result = 0;
- var tint_symbol : tint_symbol_1;
+ var tint_symbol : __atomic_compare_exchange_result_i32;
if (!(tint_discarded)) {
- let tint_symbol_2 = atomicCompareExchangeWeak(&(a), i32(in), 42);
- tint_symbol.old_value = tint_symbol_2.old_value;
- tint_symbol.exchanged = tint_symbol_2.exchanged;
+ tint_symbol = atomicCompareExchangeWeak(&(a), i32(in), 42);
}
if (!(tint_symbol.exchanged)) {
- var tint_symbol_3 : tint_symbol_1;
+ var tint_symbol_1 : __atomic_compare_exchange_result_i32;
if (!(tint_discarded)) {
- let tint_symbol_4 = atomicCompareExchangeWeak(&(a), i32(in), 42);
- tint_symbol_3.old_value = tint_symbol_4.old_value;
- tint_symbol_3.exchanged = tint_symbol_4.exchanged;
+ tint_symbol_1 = atomicCompareExchangeWeak(&(a), i32(in), 42);
}
- let xchg = tint_symbol_3;
+ let xchg = tint_symbol_1;
result = xchg.old_value;
}
result += i32(textureSample(t, s, coord).x);
diff --git a/test/tint/bug/tint/2147.wgsl b/test/tint/bug/tint/2147.wgsl
new file mode 100644
index 0000000..97c0f58
--- /dev/null
+++ b/test/tint/bug/tint/2147.wgsl
@@ -0,0 +1,11 @@
+
+@group(0) @binding(0) var<storage, read_write> S : atomic<i32>;
+
+@fragment
+fn main() -> @location(0) vec4f {
+ if (false) {
+ discard;
+ }
+ let old_value = atomicCompareExchangeWeak(&S, 0i, 1i).old_value;
+ return vec4f(f32(old_value));
+}
diff --git a/test/tint/bug/tint/2147.wgsl.expected.dxc.hlsl b/test/tint/bug/tint/2147.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..c2ed537
--- /dev/null
+++ b/test/tint/bug/tint/2147.wgsl.expected.dxc.hlsl
@@ -0,0 +1,41 @@
+struct atomic_compare_exchange_result_i32 {
+ int old_value;
+ bool exchanged;
+};
+static bool tint_discarded = false;
+RWByteAddressBuffer S : register(u0);
+
+struct tint_symbol_1 {
+ float4 value : SV_Target0;
+};
+
+atomic_compare_exchange_result_i32 SatomicCompareExchangeWeak(uint offset, int compare, int value) {
+ atomic_compare_exchange_result_i32 result=(atomic_compare_exchange_result_i32)0;
+ S.InterlockedCompareExchange(offset, compare, value, result.old_value);
+ result.exchanged = result.old_value == compare;
+ return result;
+}
+
+
+float4 main_inner() {
+ if (false) {
+ tint_discarded = true;
+ }
+ atomic_compare_exchange_result_i32 tint_symbol_2 = (atomic_compare_exchange_result_i32)0;
+ if (!(tint_discarded)) {
+ tint_symbol_2 = SatomicCompareExchangeWeak(0u, 0, 1);
+ }
+ const atomic_compare_exchange_result_i32 tint_symbol = tint_symbol_2;
+ const int old_value = tint_symbol.old_value;
+ return float4((float(old_value)).xxxx);
+}
+
+tint_symbol_1 main() {
+ const float4 inner_result = main_inner();
+ tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+ wrapper_result.value = inner_result;
+ if (tint_discarded) {
+ discard;
+ }
+ return wrapper_result;
+}
diff --git a/test/tint/bug/tint/2147.wgsl.expected.fxc.hlsl b/test/tint/bug/tint/2147.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..c2ed537
--- /dev/null
+++ b/test/tint/bug/tint/2147.wgsl.expected.fxc.hlsl
@@ -0,0 +1,41 @@
+struct atomic_compare_exchange_result_i32 {
+ int old_value;
+ bool exchanged;
+};
+static bool tint_discarded = false;
+RWByteAddressBuffer S : register(u0);
+
+struct tint_symbol_1 {
+ float4 value : SV_Target0;
+};
+
+atomic_compare_exchange_result_i32 SatomicCompareExchangeWeak(uint offset, int compare, int value) {
+ atomic_compare_exchange_result_i32 result=(atomic_compare_exchange_result_i32)0;
+ S.InterlockedCompareExchange(offset, compare, value, result.old_value);
+ result.exchanged = result.old_value == compare;
+ return result;
+}
+
+
+float4 main_inner() {
+ if (false) {
+ tint_discarded = true;
+ }
+ atomic_compare_exchange_result_i32 tint_symbol_2 = (atomic_compare_exchange_result_i32)0;
+ if (!(tint_discarded)) {
+ tint_symbol_2 = SatomicCompareExchangeWeak(0u, 0, 1);
+ }
+ const atomic_compare_exchange_result_i32 tint_symbol = tint_symbol_2;
+ const int old_value = tint_symbol.old_value;
+ return float4((float(old_value)).xxxx);
+}
+
+tint_symbol_1 main() {
+ const float4 inner_result = main_inner();
+ tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+ wrapper_result.value = inner_result;
+ if (tint_discarded) {
+ discard;
+ }
+ return wrapper_result;
+}
diff --git a/test/tint/bug/tint/2147.wgsl.expected.glsl b/test/tint/bug/tint/2147.wgsl.expected.glsl
new file mode 100644
index 0000000..62cd623
--- /dev/null
+++ b/test/tint/bug/tint/2147.wgsl.expected.glsl
@@ -0,0 +1,39 @@
+#version 310 es
+precision highp float;
+
+struct atomic_compare_exchange_result_i32 {
+ int old_value;
+ bool exchanged;
+};
+
+
+bool tint_discarded = false;
+layout(location = 0) out vec4 value;
+layout(binding = 0, std430) buffer S_block_ssbo {
+ int inner;
+} S;
+
+vec4 tint_symbol() {
+ if (false) {
+ tint_discarded = true;
+ }
+ atomic_compare_exchange_result_i32 tint_symbol_2 = atomic_compare_exchange_result_i32(0, false);
+ if (!(tint_discarded)) {
+ atomic_compare_exchange_result_i32 atomic_compare_result;
+ atomic_compare_result.old_value = atomicCompSwap(S.inner, 0, 1);
+ atomic_compare_result.exchanged = atomic_compare_result.old_value == 0;
+ tint_symbol_2 = atomic_compare_result;
+ }
+ atomic_compare_exchange_result_i32 tint_symbol_1 = tint_symbol_2;
+ int old_value = tint_symbol_1.old_value;
+ return vec4(float(old_value));
+}
+
+void main() {
+ vec4 inner_result = tint_symbol();
+ value = inner_result;
+ if (tint_discarded) {
+ discard;
+ }
+ return;
+}
diff --git a/test/tint/bug/tint/2147.wgsl.expected.msl b/test/tint/bug/tint/2147.wgsl.expected.msl
new file mode 100644
index 0000000..7b22eef
--- /dev/null
+++ b/test/tint/bug/tint/2147.wgsl.expected.msl
@@ -0,0 +1,47 @@
+#include <metal_stdlib>
+
+using namespace metal;
+
+struct atomic_compare_exchange_result_i32 {
+ int old_value;
+ bool exchanged;
+};
+atomic_compare_exchange_result_i32 atomicCompareExchangeWeak_1(device atomic_int* atomic, int compare, int value) {
+ int old_value = compare;
+ bool exchanged = atomic_compare_exchange_weak_explicit(atomic, &old_value, value, memory_order_relaxed, memory_order_relaxed);
+ return {old_value, exchanged};
+}
+
+struct tint_private_vars_struct {
+ bool tint_discarded;
+};
+
+struct tint_symbol_2 {
+ float4 value [[color(0)]];
+};
+
+float4 tint_symbol_inner(thread tint_private_vars_struct* const tint_private_vars, device atomic_int* const tint_symbol_4) {
+ if (false) {
+ (*(tint_private_vars)).tint_discarded = true;
+ }
+ atomic_compare_exchange_result_i32 tint_symbol_3 = {};
+ if (!((*(tint_private_vars)).tint_discarded)) {
+ tint_symbol_3 = atomicCompareExchangeWeak_1(tint_symbol_4, 0, 1);
+ }
+ atomic_compare_exchange_result_i32 const tint_symbol_1 = tint_symbol_3;
+ int const old_value = tint_symbol_1.old_value;
+ return float4(float(old_value));
+}
+
+fragment tint_symbol_2 tint_symbol(device atomic_int* tint_symbol_5 [[buffer(0)]]) {
+ thread tint_private_vars_struct tint_private_vars = {};
+ tint_private_vars.tint_discarded = false;
+ float4 const inner_result = tint_symbol_inner(&(tint_private_vars), tint_symbol_5);
+ tint_symbol_2 wrapper_result = {};
+ wrapper_result.value = inner_result;
+ if (tint_private_vars.tint_discarded) {
+ discard_fragment();
+ }
+ return wrapper_result;
+}
+
diff --git a/test/tint/bug/tint/2147.wgsl.expected.spvasm b/test/tint/bug/tint/2147.wgsl.expected.spvasm
new file mode 100644
index 0000000..6db60b7
--- /dev/null
+++ b/test/tint/bug/tint/2147.wgsl.expected.spvasm
@@ -0,0 +1,92 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 51
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %value
+ OpExecutionMode %main OriginUpperLeft
+ OpName %tint_discarded "tint_discarded"
+ OpName %value "value"
+ OpName %S_block "S_block"
+ OpMemberName %S_block 0 "inner"
+ OpName %S "S"
+ OpName %main_inner "main_inner"
+ OpName %__atomic_compare_exchange_result_i32 "__atomic_compare_exchange_result_i32"
+ OpMemberName %__atomic_compare_exchange_result_i32 0 "old_value"
+ OpMemberName %__atomic_compare_exchange_result_i32 1 "exchanged"
+ OpName %tint_symbol_1 "tint_symbol_1"
+ OpName %main "main"
+ OpDecorate %value Location 0
+ OpDecorate %S_block Block
+ OpMemberDecorate %S_block 0 Offset 0
+ OpDecorate %S DescriptorSet 0
+ OpDecorate %S Binding 0
+ OpMemberDecorate %__atomic_compare_exchange_result_i32 0 Offset 0
+ OpMemberDecorate %__atomic_compare_exchange_result_i32 1 Offset 4
+ %bool = OpTypeBool
+ %2 = OpConstantNull %bool
+%_ptr_Private_bool = OpTypePointer Private %bool
+%tint_discarded = OpVariable %_ptr_Private_bool Private %2
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %9 = OpConstantNull %v4float
+ %value = OpVariable %_ptr_Output_v4float Output %9
+ %int = OpTypeInt 32 1
+ %S_block = OpTypeStruct %int
+%_ptr_StorageBuffer_S_block = OpTypePointer StorageBuffer %S_block
+ %S = OpVariable %_ptr_StorageBuffer_S_block StorageBuffer
+ %14 = OpTypeFunction %v4float
+ %true = OpConstantTrue %bool
+%__atomic_compare_exchange_result_i32 = OpTypeStruct %int %bool
+%_ptr_Function___atomic_compare_exchange_result_i32 = OpTypePointer Function %__atomic_compare_exchange_result_i32
+ %23 = OpConstantNull %__atomic_compare_exchange_result_i32
+ %uint = OpTypeInt 32 0
+ %uint_1 = OpConstant %uint 1
+ %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+ %int_1 = OpConstant %int 1
+ %36 = OpConstantNull %int
+ %void = OpTypeVoid
+ %43 = OpTypeFunction %void
+ %main_inner = OpFunction %v4float None %14
+ %16 = OpLabel
+%tint_symbol_1 = OpVariable %_ptr_Function___atomic_compare_exchange_result_i32 Function %23
+ OpSelectionMerge %17 None
+ OpBranchConditional %2 %18 %17
+ %18 = OpLabel
+ OpStore %tint_discarded %true
+ OpBranch %17
+ %17 = OpLabel
+ %25 = OpLoad %bool %tint_discarded
+ %24 = OpLogicalNot %bool %25
+ OpSelectionMerge %26 None
+ OpBranchConditional %24 %27 %26
+ %27 = OpLabel
+ %34 = OpAccessChain %_ptr_StorageBuffer_int %S %uint_0
+ %37 = OpAtomicCompareExchange %int %34 %uint_1 %uint_0 %uint_0 %int_1 %36
+ %38 = OpIEqual %bool %37 %36
+ %28 = OpCompositeConstruct %__atomic_compare_exchange_result_i32 %37 %38
+ OpStore %tint_symbol_1 %28
+ OpBranch %26
+ %26 = OpLabel
+ %39 = OpLoad %__atomic_compare_exchange_result_i32 %tint_symbol_1
+ %40 = OpCompositeExtract %int %39 0
+ %41 = OpConvertSToF %float %40
+ %42 = OpCompositeConstruct %v4float %41 %41 %41 %41
+ OpReturnValue %42
+ OpFunctionEnd
+ %main = OpFunction %void None %43
+ %46 = OpLabel
+ %47 = OpFunctionCall %v4float %main_inner
+ OpStore %value %47
+ %48 = OpLoad %bool %tint_discarded
+ OpSelectionMerge %49 None
+ OpBranchConditional %48 %50 %49
+ %50 = OpLabel
+ OpKill
+ %49 = OpLabel
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/bug/tint/2147.wgsl.expected.wgsl b/test/tint/bug/tint/2147.wgsl.expected.wgsl
new file mode 100644
index 0000000..dfb1f4d
--- /dev/null
+++ b/test/tint/bug/tint/2147.wgsl.expected.wgsl
@@ -0,0 +1,10 @@
+@group(0) @binding(0) var<storage, read_write> S : atomic<i32>;
+
+@fragment
+fn main() -> @location(0) vec4f {
+ if (false) {
+ discard;
+ }
+ let old_value = atomicCompareExchangeWeak(&(S), 0i, 1i).old_value;
+ return vec4f(f32(old_value));
+}
diff --git a/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.dxc.hlsl b/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.dxc.hlsl
index 2f5f807..a8418d6 100644
--- a/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.dxc.hlsl
+++ b/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.dxc.hlsl
@@ -3,12 +3,6 @@
bool exchanged;
};
static bool tint_discarded = false;
-
-struct tint_symbol_2 {
- int old_value;
- bool exchanged;
-};
-
RWByteAddressBuffer a : register(u0);
struct tint_symbol {
@@ -26,13 +20,11 @@
int foo_inner() {
tint_discarded = true;
int x = 0;
- tint_symbol_2 tint_symbol_1 = (tint_symbol_2)0;
+ atomic_compare_exchange_result_i32 tint_symbol_1 = (atomic_compare_exchange_result_i32)0;
if (!(tint_discarded)) {
- const atomic_compare_exchange_result_i32 tint_symbol_3 = aatomicCompareExchangeWeak(0u, 0, 1);
- tint_symbol_1.old_value = tint_symbol_3.old_value;
- tint_symbol_1.exchanged = tint_symbol_3.exchanged;
+ tint_symbol_1 = aatomicCompareExchangeWeak(0u, 0, 1);
}
- const tint_symbol_2 result = tint_symbol_1;
+ const atomic_compare_exchange_result_i32 result = tint_symbol_1;
if (result.exchanged) {
x = result.old_value;
}
diff --git a/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.fxc.hlsl b/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.fxc.hlsl
index 2f5f807..a8418d6 100644
--- a/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.fxc.hlsl
+++ b/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.fxc.hlsl
@@ -3,12 +3,6 @@
bool exchanged;
};
static bool tint_discarded = false;
-
-struct tint_symbol_2 {
- int old_value;
- bool exchanged;
-};
-
RWByteAddressBuffer a : register(u0);
struct tint_symbol {
@@ -26,13 +20,11 @@
int foo_inner() {
tint_discarded = true;
int x = 0;
- tint_symbol_2 tint_symbol_1 = (tint_symbol_2)0;
+ atomic_compare_exchange_result_i32 tint_symbol_1 = (atomic_compare_exchange_result_i32)0;
if (!(tint_discarded)) {
- const atomic_compare_exchange_result_i32 tint_symbol_3 = aatomicCompareExchangeWeak(0u, 0, 1);
- tint_symbol_1.old_value = tint_symbol_3.old_value;
- tint_symbol_1.exchanged = tint_symbol_3.exchanged;
+ tint_symbol_1 = aatomicCompareExchangeWeak(0u, 0, 1);
}
- const tint_symbol_2 result = tint_symbol_1;
+ const atomic_compare_exchange_result_i32 result = tint_symbol_1;
if (result.exchanged) {
x = result.old_value;
}
diff --git a/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.glsl b/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.glsl
index 6e53b76..a0bff77 100644
--- a/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.glsl
+++ b/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.glsl
@@ -8,11 +8,6 @@
bool tint_discarded = false;
-struct tint_symbol_1 {
- int old_value;
- bool exchanged;
-};
-
layout(location = 0) out int value;
layout(binding = 0, std430) buffer a_block_ssbo {
int inner;
@@ -21,16 +16,14 @@
int foo() {
tint_discarded = true;
int x = 0;
- tint_symbol_1 tint_symbol = tint_symbol_1(0, false);
+ atomic_compare_exchange_result_i32 tint_symbol = atomic_compare_exchange_result_i32(0, false);
if (!(tint_discarded)) {
atomic_compare_exchange_result_i32 atomic_compare_result;
atomic_compare_result.old_value = atomicCompSwap(a.inner, 0, 1);
atomic_compare_result.exchanged = atomic_compare_result.old_value == 0;
- atomic_compare_exchange_result_i32 tint_symbol_2 = atomic_compare_result;
- tint_symbol.old_value = tint_symbol_2.old_value;
- tint_symbol.exchanged = tint_symbol_2.exchanged;
+ tint_symbol = atomic_compare_result;
}
- tint_symbol_1 result = tint_symbol;
+ atomic_compare_exchange_result_i32 result = tint_symbol;
if (result.exchanged) {
x = result.old_value;
}
diff --git a/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.msl b/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.msl
index 5164349..0818c09 100644
--- a/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.msl
+++ b/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.msl
@@ -16,35 +16,28 @@
bool tint_discarded;
};
-struct tint_symbol_2 {
- int old_value;
- bool exchanged;
-};
-
struct tint_symbol {
int value [[color(0)]];
};
-int foo_inner(thread tint_private_vars_struct* const tint_private_vars, device atomic_int* const tint_symbol_4) {
+int foo_inner(thread tint_private_vars_struct* const tint_private_vars, device atomic_int* const tint_symbol_2) {
(*(tint_private_vars)).tint_discarded = true;
int x = 0;
- tint_symbol_2 tint_symbol_1 = {};
+ atomic_compare_exchange_result_i32 tint_symbol_1 = {};
if (!((*(tint_private_vars)).tint_discarded)) {
- atomic_compare_exchange_result_i32 const tint_symbol_3 = atomicCompareExchangeWeak_1(tint_symbol_4, 0, 1);
- tint_symbol_1.old_value = tint_symbol_3.old_value;
- tint_symbol_1.exchanged = tint_symbol_3.exchanged;
+ tint_symbol_1 = atomicCompareExchangeWeak_1(tint_symbol_2, 0, 1);
}
- tint_symbol_2 const result = tint_symbol_1;
+ atomic_compare_exchange_result_i32 const result = tint_symbol_1;
if (result.exchanged) {
x = result.old_value;
}
return x;
}
-fragment tint_symbol foo(device atomic_int* tint_symbol_5 [[buffer(0)]]) {
+fragment tint_symbol foo(device atomic_int* tint_symbol_3 [[buffer(0)]]) {
thread tint_private_vars_struct tint_private_vars = {};
tint_private_vars.tint_discarded = false;
- int const inner_result = foo_inner(&(tint_private_vars), tint_symbol_5);
+ int const inner_result = foo_inner(&(tint_private_vars), tint_symbol_3);
tint_symbol wrapper_result = {};
wrapper_result.value = inner_result;
if (tint_private_vars.tint_discarded) {
diff --git a/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.spvasm b/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.spvasm
index fd658dc..2c0e942 100644
--- a/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.spvasm
+++ b/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
-; Bound: 56
+; Bound: 50
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@@ -14,21 +14,16 @@
OpName %a "a"
OpName %foo_inner "foo_inner"
OpName %x "x"
- OpName %tint_symbol_1 "tint_symbol_1"
- OpMemberName %tint_symbol_1 0 "old_value"
- OpMemberName %tint_symbol_1 1 "exchanged"
- OpName %tint_symbol "tint_symbol"
OpName %__atomic_compare_exchange_result_i32 "__atomic_compare_exchange_result_i32"
OpMemberName %__atomic_compare_exchange_result_i32 0 "old_value"
OpMemberName %__atomic_compare_exchange_result_i32 1 "exchanged"
+ OpName %tint_symbol "tint_symbol"
OpName %foo "foo"
OpDecorate %value Location 0
OpDecorate %a_block Block
OpMemberDecorate %a_block 0 Offset 0
OpDecorate %a DescriptorSet 0
OpDecorate %a Binding 0
- OpMemberDecorate %tint_symbol_1 0 Offset 0
- OpMemberDecorate %tint_symbol_1 1 Offset 4
OpMemberDecorate %__atomic_compare_exchange_result_i32 0 Offset 0
OpMemberDecorate %__atomic_compare_exchange_result_i32 1 Offset 4
%bool = OpTypeBool
@@ -45,22 +40,20 @@
%12 = OpTypeFunction %int
%true = OpConstantTrue %bool
%_ptr_Function_int = OpTypePointer Function %int
-%tint_symbol_1 = OpTypeStruct %int %bool
-%_ptr_Function_tint_symbol_1 = OpTypePointer Function %tint_symbol_1
- %21 = OpConstantNull %tint_symbol_1
%__atomic_compare_exchange_result_i32 = OpTypeStruct %int %bool
+%_ptr_Function___atomic_compare_exchange_result_i32 = OpTypePointer Function %__atomic_compare_exchange_result_i32
+ %21 = OpConstantNull %__atomic_compare_exchange_result_i32
%uint = OpTypeInt 32 0
%uint_1 = OpConstant %uint 1
%uint_0 = OpConstant %uint 0
%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
%int_1 = OpConstant %int 1
-%_ptr_Function_bool = OpTypePointer Function %bool
%void = OpTypeVoid
- %48 = OpTypeFunction %void
+ %42 = OpTypeFunction %void
%foo_inner = OpFunction %int None %12
%14 = OpLabel
%x = OpVariable %_ptr_Function_int Function %8
-%tint_symbol = OpVariable %_ptr_Function_tint_symbol_1 Function %21
+%tint_symbol = OpVariable %_ptr_Function___atomic_compare_exchange_result_i32 Function %21
OpStore %tint_discarded %true
OpStore %x %8
%23 = OpLoad %bool %tint_discarded
@@ -68,39 +61,34 @@
OpSelectionMerge %24 None
OpBranchConditional %22 %25 %24
%25 = OpLabel
- %33 = OpAccessChain %_ptr_StorageBuffer_int %a %uint_0
- %35 = OpAtomicCompareExchange %int %33 %uint_1 %uint_0 %uint_0 %int_1 %8
- %36 = OpIEqual %bool %35 %8
- %26 = OpCompositeConstruct %__atomic_compare_exchange_result_i32 %35 %36
- %37 = OpAccessChain %_ptr_Function_int %tint_symbol %uint_0
- %38 = OpCompositeExtract %int %26 0
- OpStore %37 %38
- %40 = OpAccessChain %_ptr_Function_bool %tint_symbol %uint_1
- %41 = OpCompositeExtract %bool %26 1
- OpStore %40 %41
+ %32 = OpAccessChain %_ptr_StorageBuffer_int %a %uint_0
+ %34 = OpAtomicCompareExchange %int %32 %uint_1 %uint_0 %uint_0 %int_1 %8
+ %35 = OpIEqual %bool %34 %8
+ %26 = OpCompositeConstruct %__atomic_compare_exchange_result_i32 %34 %35
+ OpStore %tint_symbol %26
OpBranch %24
%24 = OpLabel
- %42 = OpLoad %tint_symbol_1 %tint_symbol
- %43 = OpCompositeExtract %bool %42 1
- OpSelectionMerge %44 None
- OpBranchConditional %43 %45 %44
- %45 = OpLabel
- %46 = OpCompositeExtract %int %42 0
- OpStore %x %46
- OpBranch %44
- %44 = OpLabel
- %47 = OpLoad %int %x
- OpReturnValue %47
+ %36 = OpLoad %__atomic_compare_exchange_result_i32 %tint_symbol
+ %37 = OpCompositeExtract %bool %36 1
+ OpSelectionMerge %38 None
+ OpBranchConditional %37 %39 %38
+ %39 = OpLabel
+ %40 = OpCompositeExtract %int %36 0
+ OpStore %x %40
+ OpBranch %38
+ %38 = OpLabel
+ %41 = OpLoad %int %x
+ OpReturnValue %41
OpFunctionEnd
- %foo = OpFunction %void None %48
- %51 = OpLabel
- %52 = OpFunctionCall %int %foo_inner
- OpStore %value %52
- %53 = OpLoad %bool %tint_discarded
- OpSelectionMerge %54 None
- OpBranchConditional %53 %55 %54
- %55 = OpLabel
+ %foo = OpFunction %void None %42
+ %45 = OpLabel
+ %46 = OpFunctionCall %int %foo_inner
+ OpStore %value %46
+ %47 = OpLoad %bool %tint_discarded
+ OpSelectionMerge %48 None
+ OpBranchConditional %47 %49 %48
+ %49 = OpLabel
OpKill
- %54 = OpLabel
+ %48 = OpLabel
OpReturn
OpFunctionEnd