transform: Fixes for DecomposeMemoryAccess

CloneContext::Replace(T* what, T* with) is bug-prone, as complex transforms may want to clone `what` multiple times, or not at all. In both cases, this will likely result in an ICE as either the replacement will be reachable multiple times, or not at all.

The CTS test: webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read_write";access="read";atomic=true;baseType="i32"
Was triggering this brokenness with DecomposeMemoryAccess's use of CloneContext::Replace(T*, T*).

Switch the usage of CloneContext::Replace(T*, T*) to the new function form.

As std::function is copyable, it cannot hold a captured std::unique_ptr.
This prevented the Replace() lambdas from capturing the necessary `BufferAccess` data, as this held a `std::unique_ptr<Offset>`.
To fix this, use a `BlockAllocator` for Offsets, and use raw pointers instead.

Because the function passed to Replace() is called just before the node is cloned, insertion of new functions will occur just before the currently evaluated module-scope entity.
This allows us to remove the "insert_after" arguments to LoadFunc(), StoreFunc(), and AtomicFunc().
We can also kill the icky InsertGlobal() and TypeDeclOf() helpers.

Bug: tint:993
Change-Id: I60972bc13a2fa819a163ee2671f61e82d0e68d2a
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/58222
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
This commit is contained in:
Ben Clayton
2021-07-15 20:29:09 +00:00
committed by Ben Clayton
parent 4511a2ebb6
commit 8a96c78931
23 changed files with 573 additions and 428 deletions

View File

@@ -1,9 +1,3 @@
float2x3 tint_symbol_9(uint4 buffer[96], uint offset) {
const uint scalar_offset = ((offset + 0u)) / 4;
const uint scalar_offset_1 = ((offset + 16u)) / 4;
return float2x3(asfloat(buffer[scalar_offset / 4].xyz), asfloat(buffer[scalar_offset_1 / 4].xyz));
}
cbuffer cbuffer_s : register(b0, space0) {
uint4 s[96];
};
@@ -12,6 +6,12 @@ struct tint_symbol_1 {
uint idx : SV_GroupIndex;
};
float2x3 tint_symbol_9(uint4 buffer[96], uint offset) {
const uint scalar_offset = ((offset + 0u)) / 4;
const uint scalar_offset_1 = ((offset + 16u)) / 4;
return float2x3(asfloat(buffer[scalar_offset / 4].xyz), asfloat(buffer[scalar_offset_1 / 4].xyz));
}
[numthreads(1, 1, 1)]
void main(tint_symbol_1 tint_symbol) {
const uint idx = tint_symbol.idx;

View File

@@ -5,6 +5,10 @@ struct tint_padded_array_element {
Inner el;
};
cbuffer cbuffer_s : register(b0, space0) {
uint4 s[13];
};
float2x3 tint_symbol_7(uint4 buffer[13], uint offset) {
const uint scalar_offset = ((offset + 0u)) / 4;
const uint scalar_offset_1 = ((offset + 16u)) / 4;
@@ -33,10 +37,6 @@ tint_symbol_11_ret tint_symbol_11(uint4 buffer[13], uint offset) {
return tint_symbol_13;
}
cbuffer cbuffer_s : register(b0, space0) {
uint4 s[13];
};
[numthreads(1, 1, 1)]
void main() {
const int3 a = asint(s[0].xyz);