blob: fa1f274e834b045555c9b227d92236d43f547e4b [file] [log] [blame]
Ben Clayton015b9aa2021-04-09 10:28:48 +00001// Copyright 2021 The Tint Authors.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#include "src/transform/calculate_array_length.h"
16
Ben Claytonb05e1852021-11-23 20:45:51 +000017#include "src/transform/simplify_pointers.h"
Ben Clayton015b9aa2021-04-09 10:28:48 +000018#include "src/transform/test_helper.h"
Ben Claytonb05e1852021-11-23 20:45:51 +000019#include "src/transform/unshadow.h"
Ben Clayton015b9aa2021-04-09 10:28:48 +000020
21namespace tint {
22namespace transform {
23namespace {
24
25using CalculateArrayLengthTest = TransformTest;
26
Ben Clayton800b8e32022-01-25 21:36:04 +000027TEST_F(CalculateArrayLengthTest, ShouldRunEmptyModule) {
28 auto* src = R"()";
Ben Claytonb05e1852021-11-23 20:45:51 +000029
Ben Clayton800b8e32022-01-25 21:36:04 +000030 EXPECT_FALSE(ShouldRun<CalculateArrayLength>(src));
31}
Ben Claytonb05e1852021-11-23 20:45:51 +000032
Ben Clayton800b8e32022-01-25 21:36:04 +000033TEST_F(CalculateArrayLengthTest, ShouldRunNoArrayLength) {
34 auto* src = R"(
35struct SB {
36 x : i32;
37 arr : array<i32>;
38};
Ben Claytonb05e1852021-11-23 20:45:51 +000039
Ben Clayton800b8e32022-01-25 21:36:04 +000040[[group(0), binding(0)]] var<storage, read> sb : SB;
41
42[[stage(compute), workgroup_size(1)]]
43fn main() {
44}
45)";
46
47 EXPECT_FALSE(ShouldRun<CalculateArrayLength>(src));
48}
49
50TEST_F(CalculateArrayLengthTest, ShouldRunWithArrayLength) {
51 auto* src = R"(
52struct SB {
53 x : i32;
54 arr : array<i32>;
55};
56
57[[group(0), binding(0)]] var<storage, read> sb : SB;
58
59[[stage(compute), workgroup_size(1)]]
60fn main() {
61 var len : u32 = arrayLength(&sb.arr);
62}
63)";
64
65 EXPECT_TRUE(ShouldRun<CalculateArrayLength>(src));
Ben Claytonb05e1852021-11-23 20:45:51 +000066}
67
Ben Clayton3fe1bd32022-01-28 16:49:46 +000068TEST_F(CalculateArrayLengthTest, BasicArray) {
Ben Claytonaba42ed2021-06-10 18:43:04 +000069 auto* src = R"(
Ben Clayton01e4b6f2022-01-19 22:46:57 +000070@group(0) @binding(0) var<storage, read> sb : array<i32>;
James Price51e55b22022-01-19 15:55:56 +000071
Ben Clayton01e4b6f2022-01-19 22:46:57 +000072@stage(compute) @workgroup_size(1)
James Price51e55b22022-01-19 15:55:56 +000073fn main() {
74 var len : u32 = arrayLength(&sb);
75}
76)";
77
78 auto* expect = R"(
Ben Clayton01e4b6f2022-01-19 22:46:57 +000079@internal(intrinsic_buffer_size)
80fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : array<i32>, result : ptr<function, u32>)
James Price51e55b22022-01-19 15:55:56 +000081
Ben Clayton01e4b6f2022-01-19 22:46:57 +000082@group(0) @binding(0) var<storage, read> sb : array<i32>;
James Price51e55b22022-01-19 15:55:56 +000083
Ben Clayton01e4b6f2022-01-19 22:46:57 +000084@stage(compute) @workgroup_size(1)
James Price51e55b22022-01-19 15:55:56 +000085fn main() {
86 var tint_symbol_1 : u32 = 0u;
87 tint_symbol(sb, &(tint_symbol_1));
88 let tint_symbol_2 : u32 = (tint_symbol_1 / 4u);
89 var len : u32 = tint_symbol_2;
90}
91)";
92
93 auto got = Run<Unshadow, SimplifyPointers, CalculateArrayLength>(src);
94
95 EXPECT_EQ(expect, str(got));
96}
97
98TEST_F(CalculateArrayLengthTest, BasicInStruct) {
99 auto* src = R"(
Ben Claytonaba42ed2021-06-10 18:43:04 +0000100struct SB {
101 x : i32;
102 arr : array<i32>;
103};
104
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000105@group(0) @binding(0) var<storage, read> sb : SB;
Ben Claytonaba42ed2021-06-10 18:43:04 +0000106
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000107@stage(compute) @workgroup_size(1)
Ben Claytonaba42ed2021-06-10 18:43:04 +0000108fn main() {
109 var len : u32 = arrayLength(&sb.arr);
110}
111)";
112
113 auto* expect = R"(
Ben Clayton6688b0a2022-02-11 12:59:08 +0000114@internal(intrinsic_buffer_size)
115fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, result : ptr<function, u32>)
116
Ben Claytonaba42ed2021-06-10 18:43:04 +0000117struct SB {
118 x : i32;
119 arr : array<i32>;
James Price6b1e5f52022-01-19 18:11:17 +0000120}
Ben Claytonaba42ed2021-06-10 18:43:04 +0000121
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000122@group(0) @binding(0) var<storage, read> sb : SB;
Ben Claytonaba42ed2021-06-10 18:43:04 +0000123
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000124@stage(compute) @workgroup_size(1)
Ben Claytonaba42ed2021-06-10 18:43:04 +0000125fn main() {
126 var tint_symbol_1 : u32 = 0u;
127 tint_symbol(sb, &(tint_symbol_1));
128 let tint_symbol_2 : u32 = ((tint_symbol_1 - 4u) / 4u);
129 var len : u32 = tint_symbol_2;
130}
131)";
132
Ben Claytonb05e1852021-11-23 20:45:51 +0000133 auto got = Run<Unshadow, SimplifyPointers, CalculateArrayLength>(src);
Ben Claytonaba42ed2021-06-10 18:43:04 +0000134
135 EXPECT_EQ(expect, str(got));
136}
137
Ben Clayton3fe1bd32022-01-28 16:49:46 +0000138TEST_F(CalculateArrayLengthTest, ArrayOfStruct) {
139 auto* src = R"(
140struct S {
141 f : f32;
142}
143
144@group(0) @binding(0) var<storage, read> arr : array<S>;
145
146@stage(compute) @workgroup_size(1)
147fn main() {
148 let len = arrayLength(&arr);
149}
150)";
151 auto* expect = R"(
Ben Clayton6688b0a2022-02-11 12:59:08 +0000152@internal(intrinsic_buffer_size)
153fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : array<S>, result : ptr<function, u32>)
154
Ben Clayton3fe1bd32022-01-28 16:49:46 +0000155struct S {
156 f : f32;
157}
158
Ben Clayton3fe1bd32022-01-28 16:49:46 +0000159@group(0) @binding(0) var<storage, read> arr : array<S>;
160
161@stage(compute) @workgroup_size(1)
162fn main() {
163 var tint_symbol_1 : u32 = 0u;
164 tint_symbol(arr, &(tint_symbol_1));
165 let tint_symbol_2 : u32 = (tint_symbol_1 / 4u);
166 let len = tint_symbol_2;
167}
168)";
169
170 auto got = Run<Unshadow, SimplifyPointers, CalculateArrayLength>(src);
171
172 EXPECT_EQ(expect, str(got));
173}
174
175TEST_F(CalculateArrayLengthTest, ArrayOfArrayOfStruct) {
176 auto* src = R"(
177struct S {
178 f : f32;
179}
180
181@group(0) @binding(0) var<storage, read> arr : array<array<S, 4>>;
182
183@stage(compute) @workgroup_size(1)
184fn main() {
185 let len = arrayLength(&arr);
186}
187)";
188 auto* expect = R"(
Ben Clayton6688b0a2022-02-11 12:59:08 +0000189@internal(intrinsic_buffer_size)
190fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : array<array<S, 4u>>, result : ptr<function, u32>)
191
Ben Clayton3fe1bd32022-01-28 16:49:46 +0000192struct S {
193 f : f32;
194}
195
Ben Clayton3fe1bd32022-01-28 16:49:46 +0000196@group(0) @binding(0) var<storage, read> arr : array<array<S, 4>>;
197
198@stage(compute) @workgroup_size(1)
199fn main() {
200 var tint_symbol_1 : u32 = 0u;
201 tint_symbol(arr, &(tint_symbol_1));
202 let tint_symbol_2 : u32 = (tint_symbol_1 / 16u);
203 let len = tint_symbol_2;
204}
205)";
206
207 auto got = Run<Unshadow, SimplifyPointers, CalculateArrayLength>(src);
208
209 EXPECT_EQ(expect, str(got));
210}
211
Ben Claytonaba42ed2021-06-10 18:43:04 +0000212TEST_F(CalculateArrayLengthTest, InSameBlock) {
213 auto* src = R"(
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000214@group(0) @binding(0) var<storage, read> sb : array<i32>;;
James Price51e55b22022-01-19 15:55:56 +0000215
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000216@stage(compute) @workgroup_size(1)
James Price51e55b22022-01-19 15:55:56 +0000217fn main() {
218 var a : u32 = arrayLength(&sb);
219 var b : u32 = arrayLength(&sb);
220 var c : u32 = arrayLength(&sb);
221}
222)";
223
224 auto* expect = R"(
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000225@internal(intrinsic_buffer_size)
226fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : array<i32>, result : ptr<function, u32>)
James Price51e55b22022-01-19 15:55:56 +0000227
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000228@group(0) @binding(0) var<storage, read> sb : array<i32>;
James Price51e55b22022-01-19 15:55:56 +0000229
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000230@stage(compute) @workgroup_size(1)
James Price51e55b22022-01-19 15:55:56 +0000231fn main() {
232 var tint_symbol_1 : u32 = 0u;
233 tint_symbol(sb, &(tint_symbol_1));
234 let tint_symbol_2 : u32 = (tint_symbol_1 / 4u);
235 var a : u32 = tint_symbol_2;
236 var b : u32 = tint_symbol_2;
237 var c : u32 = tint_symbol_2;
238}
239)";
240
241 auto got = Run<Unshadow, SimplifyPointers, CalculateArrayLength>(src);
242
243 EXPECT_EQ(expect, str(got));
244}
245
246TEST_F(CalculateArrayLengthTest, InSameBlock_Struct) {
247 auto* src = R"(
Ben Claytonaba42ed2021-06-10 18:43:04 +0000248struct SB {
249 x : i32;
250 arr : array<i32>;
251};
252
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000253@group(0) @binding(0) var<storage, read> sb : SB;
Ben Claytonaba42ed2021-06-10 18:43:04 +0000254
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000255@stage(compute) @workgroup_size(1)
Ben Claytonaba42ed2021-06-10 18:43:04 +0000256fn main() {
257 var a : u32 = arrayLength(&sb.arr);
258 var b : u32 = arrayLength(&sb.arr);
259 var c : u32 = arrayLength(&sb.arr);
260}
261)";
262
263 auto* expect = R"(
Ben Clayton6688b0a2022-02-11 12:59:08 +0000264@internal(intrinsic_buffer_size)
265fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, result : ptr<function, u32>)
266
Ben Claytonaba42ed2021-06-10 18:43:04 +0000267struct SB {
268 x : i32;
269 arr : array<i32>;
James Price6b1e5f52022-01-19 18:11:17 +0000270}
Ben Claytonaba42ed2021-06-10 18:43:04 +0000271
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000272@group(0) @binding(0) var<storage, read> sb : SB;
Ben Claytonaba42ed2021-06-10 18:43:04 +0000273
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000274@stage(compute) @workgroup_size(1)
Ben Claytonaba42ed2021-06-10 18:43:04 +0000275fn main() {
276 var tint_symbol_1 : u32 = 0u;
277 tint_symbol(sb, &(tint_symbol_1));
278 let tint_symbol_2 : u32 = ((tint_symbol_1 - 4u) / 4u);
279 var a : u32 = tint_symbol_2;
280 var b : u32 = tint_symbol_2;
281 var c : u32 = tint_symbol_2;
282}
283)";
284
Ben Claytonb05e1852021-11-23 20:45:51 +0000285 auto got = Run<Unshadow, SimplifyPointers, CalculateArrayLength>(src);
Ben Claytonaba42ed2021-06-10 18:43:04 +0000286
287 EXPECT_EQ(expect, str(got));
288}
289
290TEST_F(CalculateArrayLengthTest, WithStride) {
291 auto* src = R"(
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000292@group(0) @binding(0) var<storage, read> sb : @stride(64) array<i32>;
James Price51e55b22022-01-19 15:55:56 +0000293
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000294@stage(compute) @workgroup_size(1)
James Price51e55b22022-01-19 15:55:56 +0000295fn main() {
296 var len : u32 = arrayLength(&sb);
297}
298)";
299
300 auto* expect = R"(
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000301@internal(intrinsic_buffer_size)
302fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : @stride(64) array<i32>, result : ptr<function, u32>)
James Price51e55b22022-01-19 15:55:56 +0000303
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000304@group(0) @binding(0) var<storage, read> sb : @stride(64) array<i32>;
James Price51e55b22022-01-19 15:55:56 +0000305
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000306@stage(compute) @workgroup_size(1)
James Price51e55b22022-01-19 15:55:56 +0000307fn main() {
308 var tint_symbol_1 : u32 = 0u;
309 tint_symbol(sb, &(tint_symbol_1));
310 let tint_symbol_2 : u32 = (tint_symbol_1 / 64u);
311 var len : u32 = tint_symbol_2;
312}
313)";
314
315 auto got = Run<Unshadow, SimplifyPointers, CalculateArrayLength>(src);
316
317 EXPECT_EQ(expect, str(got));
318}
319
320TEST_F(CalculateArrayLengthTest, WithStride_InStruct) {
321 auto* src = R"(
Ben Claytonaba42ed2021-06-10 18:43:04 +0000322struct SB {
323 x : i32;
324 y : f32;
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000325 arr : @stride(64) array<i32>;
Ben Claytonaba42ed2021-06-10 18:43:04 +0000326};
327
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000328@group(0) @binding(0) var<storage, read> sb : SB;
Ben Claytonaba42ed2021-06-10 18:43:04 +0000329
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000330@stage(compute) @workgroup_size(1)
Ben Claytonaba42ed2021-06-10 18:43:04 +0000331fn main() {
332 var len : u32 = arrayLength(&sb.arr);
333}
334)";
335
336 auto* expect = R"(
Ben Clayton6688b0a2022-02-11 12:59:08 +0000337@internal(intrinsic_buffer_size)
338fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, result : ptr<function, u32>)
339
Ben Claytonaba42ed2021-06-10 18:43:04 +0000340struct SB {
341 x : i32;
342 y : f32;
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000343 arr : @stride(64) array<i32>;
James Price6b1e5f52022-01-19 18:11:17 +0000344}
Ben Claytonaba42ed2021-06-10 18:43:04 +0000345
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000346@group(0) @binding(0) var<storage, read> sb : SB;
Ben Claytonaba42ed2021-06-10 18:43:04 +0000347
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000348@stage(compute) @workgroup_size(1)
Ben Claytonaba42ed2021-06-10 18:43:04 +0000349fn main() {
350 var tint_symbol_1 : u32 = 0u;
351 tint_symbol(sb, &(tint_symbol_1));
352 let tint_symbol_2 : u32 = ((tint_symbol_1 - 8u) / 64u);
353 var len : u32 = tint_symbol_2;
354}
355)";
356
Ben Claytonb05e1852021-11-23 20:45:51 +0000357 auto got = Run<Unshadow, SimplifyPointers, CalculateArrayLength>(src);
Ben Claytonaba42ed2021-06-10 18:43:04 +0000358
359 EXPECT_EQ(expect, str(got));
360}
361
362TEST_F(CalculateArrayLengthTest, Nested) {
363 auto* src = R"(
Ben Claytonaba42ed2021-06-10 18:43:04 +0000364struct SB {
365 x : i32;
366 arr : array<i32>;
367};
368
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000369@group(0) @binding(0) var<storage, read> sb : SB;
Ben Claytonaba42ed2021-06-10 18:43:04 +0000370
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000371@stage(compute) @workgroup_size(1)
Ben Claytonaba42ed2021-06-10 18:43:04 +0000372fn main() {
373 if (true) {
374 var len : u32 = arrayLength(&sb.arr);
375 } else {
376 if (true) {
377 var len : u32 = arrayLength(&sb.arr);
378 }
379 }
380}
381)";
382
383 auto* expect = R"(
Ben Clayton6688b0a2022-02-11 12:59:08 +0000384@internal(intrinsic_buffer_size)
385fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, result : ptr<function, u32>)
386
Ben Claytonaba42ed2021-06-10 18:43:04 +0000387struct SB {
388 x : i32;
389 arr : array<i32>;
James Price6b1e5f52022-01-19 18:11:17 +0000390}
Ben Claytonaba42ed2021-06-10 18:43:04 +0000391
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000392@group(0) @binding(0) var<storage, read> sb : SB;
Ben Claytonaba42ed2021-06-10 18:43:04 +0000393
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000394@stage(compute) @workgroup_size(1)
Ben Claytonaba42ed2021-06-10 18:43:04 +0000395fn main() {
396 if (true) {
397 var tint_symbol_1 : u32 = 0u;
398 tint_symbol(sb, &(tint_symbol_1));
399 let tint_symbol_2 : u32 = ((tint_symbol_1 - 4u) / 4u);
400 var len : u32 = tint_symbol_2;
401 } else {
402 if (true) {
403 var tint_symbol_3 : u32 = 0u;
404 tint_symbol(sb, &(tint_symbol_3));
405 let tint_symbol_4 : u32 = ((tint_symbol_3 - 4u) / 4u);
406 var len : u32 = tint_symbol_4;
407 }
408 }
409}
410)";
411
Ben Claytonb05e1852021-11-23 20:45:51 +0000412 auto got = Run<Unshadow, SimplifyPointers, CalculateArrayLength>(src);
Ben Claytonaba42ed2021-06-10 18:43:04 +0000413
414 EXPECT_EQ(expect, str(got));
415}
416
Ben Clayton015b9aa2021-04-09 10:28:48 +0000417TEST_F(CalculateArrayLengthTest, MultipleStorageBuffers) {
418 auto* src = R"(
Ben Clayton015b9aa2021-04-09 10:28:48 +0000419struct SB1 {
420 x : i32;
421 arr1 : array<i32>;
422};
423
Ben Clayton015b9aa2021-04-09 10:28:48 +0000424struct SB2 {
425 x : i32;
426 arr2 : array<vec4<f32>>;
427};
428
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000429@group(0) @binding(0) var<storage, read> sb1 : SB1;
Ben Clayton015b9aa2021-04-09 10:28:48 +0000430
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000431@group(0) @binding(1) var<storage, read> sb2 : SB2;
Ben Clayton015b9aa2021-04-09 10:28:48 +0000432
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000433@group(0) @binding(2) var<storage, read> sb3 : array<i32>;
James Price51e55b22022-01-19 15:55:56 +0000434
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000435@stage(compute) @workgroup_size(1)
Ben Clayton015b9aa2021-04-09 10:28:48 +0000436fn main() {
Ben Claytonaba42ed2021-06-10 18:43:04 +0000437 var len1 : u32 = arrayLength(&(sb1.arr1));
438 var len2 : u32 = arrayLength(&(sb2.arr2));
James Price51e55b22022-01-19 15:55:56 +0000439 var len3 : u32 = arrayLength(&sb3);
440 var x : u32 = (len1 + len2 + len3);
Ben Clayton015b9aa2021-04-09 10:28:48 +0000441}
442)";
443
444 auto* expect = R"(
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000445@internal(intrinsic_buffer_size)
Ben Clayton6688b0a2022-02-11 12:59:08 +0000446fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB1, result : ptr<function, u32>)
447
448@internal(intrinsic_buffer_size)
449fn tint_symbol_3(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB2, result : ptr<function, u32>)
450
451@internal(intrinsic_buffer_size)
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000452fn tint_symbol_6(@internal(disable_validation__ignore_constructible_function_parameter) buffer : array<i32>, result : ptr<function, u32>)
James Price51e55b22022-01-19 15:55:56 +0000453
Ben Clayton015b9aa2021-04-09 10:28:48 +0000454struct SB1 {
455 x : i32;
456 arr1 : array<i32>;
James Price6b1e5f52022-01-19 18:11:17 +0000457}
Ben Clayton015b9aa2021-04-09 10:28:48 +0000458
Ben Clayton015b9aa2021-04-09 10:28:48 +0000459struct SB2 {
460 x : i32;
461 arr2 : array<vec4<f32>>;
James Price6b1e5f52022-01-19 18:11:17 +0000462}
Ben Clayton015b9aa2021-04-09 10:28:48 +0000463
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000464@group(0) @binding(0) var<storage, read> sb1 : SB1;
Ben Clayton015b9aa2021-04-09 10:28:48 +0000465
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000466@group(0) @binding(1) var<storage, read> sb2 : SB2;
Ben Clayton015b9aa2021-04-09 10:28:48 +0000467
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000468@group(0) @binding(2) var<storage, read> sb3 : array<i32>;
James Price51e55b22022-01-19 15:55:56 +0000469
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000470@stage(compute) @workgroup_size(1)
Ben Clayton015b9aa2021-04-09 10:28:48 +0000471fn main() {
Ben Clayton363a2e22021-04-13 20:07:57 +0000472 var tint_symbol_1 : u32 = 0u;
Antonio Maiorano14b34032021-06-09 20:17:59 +0000473 tint_symbol(sb1, &(tint_symbol_1));
Ben Clayton363a2e22021-04-13 20:07:57 +0000474 let tint_symbol_2 : u32 = ((tint_symbol_1 - 4u) / 4u);
475 var tint_symbol_4 : u32 = 0u;
Antonio Maiorano14b34032021-06-09 20:17:59 +0000476 tint_symbol_3(sb2, &(tint_symbol_4));
Ben Clayton363a2e22021-04-13 20:07:57 +0000477 let tint_symbol_5 : u32 = ((tint_symbol_4 - 16u) / 16u);
James Price51e55b22022-01-19 15:55:56 +0000478 var tint_symbol_7 : u32 = 0u;
479 tint_symbol_6(sb3, &(tint_symbol_7));
480 let tint_symbol_8 : u32 = (tint_symbol_7 / 4u);
Ben Clayton363a2e22021-04-13 20:07:57 +0000481 var len1 : u32 = tint_symbol_2;
482 var len2 : u32 = tint_symbol_5;
James Price51e55b22022-01-19 15:55:56 +0000483 var len3 : u32 = tint_symbol_8;
484 var x : u32 = ((len1 + len2) + len3);
Ben Clayton015b9aa2021-04-09 10:28:48 +0000485}
486)";
487
Ben Claytonb05e1852021-11-23 20:45:51 +0000488 auto got = Run<Unshadow, SimplifyPointers, CalculateArrayLength>(src);
489
490 EXPECT_EQ(expect, str(got));
491}
492
493TEST_F(CalculateArrayLengthTest, Shadowing) {
494 auto* src = R"(
Ben Claytonb05e1852021-11-23 20:45:51 +0000495struct SB {
496 x : i32;
497 arr : array<i32>;
498};
499
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000500@group(0) @binding(0) var<storage, read> a : SB;
501@group(0) @binding(1) var<storage, read> b : SB;
Ben Claytonb05e1852021-11-23 20:45:51 +0000502
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000503@stage(compute) @workgroup_size(1)
Ben Claytonb05e1852021-11-23 20:45:51 +0000504fn main() {
505 let x = &a;
506 var a : u32 = arrayLength(&a.arr);
507 {
508 var b : u32 = arrayLength(&((*x).arr));
509 }
510}
511)";
512
513 auto* expect =
514 R"(
Ben Clayton6688b0a2022-02-11 12:59:08 +0000515@internal(intrinsic_buffer_size)
516fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, result : ptr<function, u32>)
517
Ben Claytonb05e1852021-11-23 20:45:51 +0000518struct SB {
519 x : i32;
520 arr : array<i32>;
James Price6b1e5f52022-01-19 18:11:17 +0000521}
Ben Claytonb05e1852021-11-23 20:45:51 +0000522
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000523@group(0) @binding(0) var<storage, read> a : SB;
Ben Claytonb05e1852021-11-23 20:45:51 +0000524
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000525@group(0) @binding(1) var<storage, read> b : SB;
Ben Claytonb05e1852021-11-23 20:45:51 +0000526
Ben Clayton01e4b6f2022-01-19 22:46:57 +0000527@stage(compute) @workgroup_size(1)
Ben Claytonb05e1852021-11-23 20:45:51 +0000528fn main() {
529 var tint_symbol_1 : u32 = 0u;
530 tint_symbol(a, &(tint_symbol_1));
531 let tint_symbol_2 : u32 = ((tint_symbol_1 - 4u) / 4u);
532 var a_1 : u32 = tint_symbol_2;
533 {
534 var tint_symbol_3 : u32 = 0u;
535 tint_symbol(a, &(tint_symbol_3));
536 let tint_symbol_4 : u32 = ((tint_symbol_3 - 4u) / 4u);
537 var b_1 : u32 = tint_symbol_4;
538 }
539}
540)";
541
542 auto got = Run<Unshadow, SimplifyPointers, CalculateArrayLength>(src);
Ben Clayton015b9aa2021-04-09 10:28:48 +0000543
544 EXPECT_EQ(expect, str(got));
545}
546
Ben Clayton6688b0a2022-02-11 12:59:08 +0000547TEST_F(CalculateArrayLengthTest, OutOfOrder) {
548 auto* src = R"(
549@stage(compute) @workgroup_size(1)
550fn main() {
551 var len1 : u32 = arrayLength(&(sb1.arr1));
552 var len2 : u32 = arrayLength(&(sb2.arr2));
553 var len3 : u32 = arrayLength(&sb3);
554 var x : u32 = (len1 + len2 + len3);
555}
556
557@group(0) @binding(0) var<storage, read> sb1 : SB1;
558
559struct SB1 {
560 x : i32;
561 arr1 : array<i32>;
562};
563
564@group(0) @binding(1) var<storage, read> sb2 : SB2;
565
566struct SB2 {
567 x : i32;
568 arr2 : array<vec4<f32>>;
569};
570
571@group(0) @binding(2) var<storage, read> sb3 : array<i32>;
572)";
573
574 auto* expect = R"(
575@internal(intrinsic_buffer_size)
576fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB1, result : ptr<function, u32>)
577
578@internal(intrinsic_buffer_size)
579fn tint_symbol_3(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB2, result : ptr<function, u32>)
580
581@internal(intrinsic_buffer_size)
582fn tint_symbol_6(@internal(disable_validation__ignore_constructible_function_parameter) buffer : array<i32>, result : ptr<function, u32>)
583
584@stage(compute) @workgroup_size(1)
585fn main() {
586 var tint_symbol_1 : u32 = 0u;
587 tint_symbol(sb1, &(tint_symbol_1));
588 let tint_symbol_2 : u32 = ((tint_symbol_1 - 4u) / 4u);
589 var tint_symbol_4 : u32 = 0u;
590 tint_symbol_3(sb2, &(tint_symbol_4));
591 let tint_symbol_5 : u32 = ((tint_symbol_4 - 16u) / 16u);
592 var tint_symbol_7 : u32 = 0u;
593 tint_symbol_6(sb3, &(tint_symbol_7));
594 let tint_symbol_8 : u32 = (tint_symbol_7 / 4u);
595 var len1 : u32 = tint_symbol_2;
596 var len2 : u32 = tint_symbol_5;
597 var len3 : u32 = tint_symbol_8;
598 var x : u32 = ((len1 + len2) + len3);
599}
600
601@group(0) @binding(0) var<storage, read> sb1 : SB1;
602
603struct SB1 {
604 x : i32;
605 arr1 : array<i32>;
606}
607
608@group(0) @binding(1) var<storage, read> sb2 : SB2;
609
610struct SB2 {
611 x : i32;
612 arr2 : array<vec4<f32>>;
613}
614
615@group(0) @binding(2) var<storage, read> sb3 : array<i32>;
616)";
617
618 auto got = Run<Unshadow, SimplifyPointers, CalculateArrayLength>(src);
619
620 EXPECT_EQ(expect, str(got));
621}
622
Ben Clayton015b9aa2021-04-09 10:28:48 +0000623} // namespace
624} // namespace transform
625} // namespace tint