blob: 9d9115fe19e294abd2936ab8121545a5e5978396 [file] [log] [blame]
Antonio Maioranoc25ddf42022-03-15 15:03:03 +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/tint/transform/promote_side_effects_to_decl.h"
16
17#include "src/tint/transform/test_helper.h"
18
dan sinclairb5599d32022-04-07 16:55:14 +000019namespace tint::transform {
Antonio Maioranoc25ddf42022-03-15 15:03:03 +000020namespace {
21
22using PromoteSideEffectsToDeclTest = TransformTest;
23
24TEST_F(PromoteSideEffectsToDeclTest, EmptyModule) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000025 auto* src = "";
26 auto* expect = "";
Antonio Maioranoc25ddf42022-03-15 15:03:03 +000027
dan sinclair41e4d9a2022-05-01 14:40:55 +000028 DataMap data;
29 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +000030
dan sinclair41e4d9a2022-05-01 14:40:55 +000031 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +000032}
33
34TEST_F(PromoteSideEffectsToDeclTest, Unary_Arith_SE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000035 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +000036fn a(i : i32) -> i32 {
37 return 1;
38}
39
40fn f() {
41 let r = -(a(0));
42}
43)";
44
dan sinclair41e4d9a2022-05-01 14:40:55 +000045 auto* expect = src;
Antonio Maioranoc25ddf42022-03-15 15:03:03 +000046
dan sinclair41e4d9a2022-05-01 14:40:55 +000047 DataMap data;
48 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +000049
dan sinclair41e4d9a2022-05-01 14:40:55 +000050 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +000051}
52
53TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_BothSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000054 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +000055fn a() -> i32 {
56 return 1;
57}
58
59fn b() -> i32 {
60 return 1;
61}
62
63fn f() {
64 let r = a() + b();
65}
66)";
67
dan sinclair41e4d9a2022-05-01 14:40:55 +000068 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +000069fn a() -> i32 {
70 return 1;
71}
72
73fn b() -> i32 {
74 return 1;
75}
76
77fn f() {
78 let tint_symbol = a();
79 let tint_symbol_1 = b();
80 let r = (tint_symbol + tint_symbol_1);
81}
82)";
83
dan sinclair41e4d9a2022-05-01 14:40:55 +000084 DataMap data;
85 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +000086
dan sinclair41e4d9a2022-05-01 14:40:55 +000087 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +000088}
89
90TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_LeftSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000091 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +000092fn a() -> i32 {
93 return 1;
94}
95
96fn f() {
97 var b = 1;
98 let r = a() + b;
99}
100)";
101
dan sinclair41e4d9a2022-05-01 14:40:55 +0000102 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000103fn a() -> i32 {
104 return 1;
105}
106
107fn f() {
108 var b = 1;
109 let tint_symbol = a();
110 let r = (tint_symbol + b);
111}
112)";
113
dan sinclair41e4d9a2022-05-01 14:40:55 +0000114 DataMap data;
115 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000116
dan sinclair41e4d9a2022-05-01 14:40:55 +0000117 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000118}
119
120TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_RightSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000121 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000122fn a() -> i32 {
123 return 1;
124}
125
126fn f() {
127 var b = 1;
128 let r = b + a();
129}
130)";
131
dan sinclair41e4d9a2022-05-01 14:40:55 +0000132 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000133fn a() -> i32 {
134 return 1;
135}
136
137fn f() {
138 var b = 1;
139 let tint_symbol = b;
140 let tint_symbol_1 = a();
141 let r = (tint_symbol + tint_symbol_1);
142}
143)";
144
dan sinclair41e4d9a2022-05-01 14:40:55 +0000145 DataMap data;
146 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000147
dan sinclair41e4d9a2022-05-01 14:40:55 +0000148 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000149}
150
151TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_LeftmostSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000152 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000153fn a() -> i32 {
154 return 1;
155}
156
157fn f() {
158 var b = 1;
159 var c = 1;
160 var d = 1;
161 let r = a() + b + c + d;
162}
163)";
164
dan sinclair41e4d9a2022-05-01 14:40:55 +0000165 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000166fn a() -> i32 {
167 return 1;
168}
169
170fn f() {
171 var b = 1;
172 var c = 1;
173 var d = 1;
174 let tint_symbol = a();
175 let r = (((tint_symbol + b) + c) + d);
176}
177)";
178
dan sinclair41e4d9a2022-05-01 14:40:55 +0000179 DataMap data;
180 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000181
dan sinclair41e4d9a2022-05-01 14:40:55 +0000182 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000183}
184
185TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_RightmostSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000186 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000187fn a() -> i32 {
188 return 1;
189}
190
191fn f() {
192 var b = 1;
193 var c = 1;
194 var d = 1;
195 let r = b + c + d + a();
196}
197)";
198
dan sinclair41e4d9a2022-05-01 14:40:55 +0000199 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000200fn a() -> i32 {
201 return 1;
202}
203
204fn f() {
205 var b = 1;
206 var c = 1;
207 var d = 1;
208 let tint_symbol = ((b + c) + d);
209 let tint_symbol_1 = a();
210 let r = (tint_symbol + tint_symbol_1);
211}
212)";
213
dan sinclair41e4d9a2022-05-01 14:40:55 +0000214 DataMap data;
215 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000216
dan sinclair41e4d9a2022-05-01 14:40:55 +0000217 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000218}
219
220TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_MiddleSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000221 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000222fn a() -> i32 {
223 return 1;
224}
225
226fn f() {
227 var b = 1;
228 var c = 1;
229 var d = 1;
230 var e = 1;
231 let r = b + c + a() + d + e;
232}
233)";
234
dan sinclair41e4d9a2022-05-01 14:40:55 +0000235 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000236fn a() -> i32 {
237 return 1;
238}
239
240fn f() {
241 var b = 1;
242 var c = 1;
243 var d = 1;
244 var e = 1;
245 let tint_symbol = (b + c);
246 let tint_symbol_1 = a();
247 let r = (((tint_symbol + tint_symbol_1) + d) + e);
248}
249)";
250
dan sinclair41e4d9a2022-05-01 14:40:55 +0000251 DataMap data;
252 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000253
dan sinclair41e4d9a2022-05-01 14:40:55 +0000254 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000255}
256
257TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_ThreeSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000258 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000259fn a(v : i32) -> i32 {
260 return v;
261}
262
263fn f() {
264 let r = a(0) + a(1) + a(2);
265}
266)";
267
dan sinclair41e4d9a2022-05-01 14:40:55 +0000268 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000269fn a(v : i32) -> i32 {
270 return v;
271}
272
273fn f() {
274 let tint_symbol = a(0);
275 let tint_symbol_1 = a(1);
276 let tint_symbol_2 = a(2);
277 let r = ((tint_symbol + tint_symbol_1) + tint_symbol_2);
278}
279)";
280
dan sinclair41e4d9a2022-05-01 14:40:55 +0000281 DataMap data;
282 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000283
dan sinclair41e4d9a2022-05-01 14:40:55 +0000284 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000285}
286
287TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_Constants_NoRecvSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000288 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000289fn a(i : i32) -> i32 {
290 return 1;
291}
292
293fn f() {
294 let r = ((((1 + a(0)) - 2) + 3) - 4);
295}
296)";
297
dan sinclair41e4d9a2022-05-01 14:40:55 +0000298 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000299fn a(i : i32) -> i32 {
300 return 1;
301}
302
303fn f() {
304 let tint_symbol = a(0);
305 let r = ((((1 + tint_symbol) - 2) + 3) - 4);
306}
307)";
308
dan sinclair41e4d9a2022-05-01 14:40:55 +0000309 DataMap data;
310 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000311
dan sinclair41e4d9a2022-05-01 14:40:55 +0000312 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000313}
314
315TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_Constants_RecvSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000316 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000317fn a(i : i32) -> i32 {
318 return 1;
319}
320
321fn f() {
322 var b = 1;
323 let r = a(0) + 1 + b + a(1) + 2;
324}
325)";
326
dan sinclair41e4d9a2022-05-01 14:40:55 +0000327 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000328fn a(i : i32) -> i32 {
329 return 1;
330}
331
332fn f() {
333 var b = 1;
334 let tint_symbol = a(0);
335 let tint_symbol_1 = b;
336 let tint_symbol_2 = a(1);
337 let r = ((((tint_symbol + 1) + tint_symbol_1) + tint_symbol_2) + 2);
338}
339)";
340
dan sinclair41e4d9a2022-05-01 14:40:55 +0000341 DataMap data;
342 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000343
dan sinclair41e4d9a2022-05-01 14:40:55 +0000344 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000345}
346
347TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_Constants_ConstAndSEAndVar) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000348 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000349fn a(i : i32) -> i32 {
350 return 1;
351}
352
353fn main() {
354 var b = 1;
355 var c = 1;
356 let r = 1 + a(0) + b;
357}
358)";
359
dan sinclair41e4d9a2022-05-01 14:40:55 +0000360 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000361fn a(i : i32) -> i32 {
362 return 1;
363}
364
365fn main() {
366 var b = 1;
367 var c = 1;
368 let tint_symbol = a(0);
369 let r = ((1 + tint_symbol) + b);
370}
371)";
372
dan sinclair41e4d9a2022-05-01 14:40:55 +0000373 DataMap data;
374 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000375
dan sinclair41e4d9a2022-05-01 14:40:55 +0000376 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000377}
378
379TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_Constants_VarAndSEAndConst) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000380 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000381fn a(i : i32) -> i32 {
382 return 1;
383}
384
385fn main() {
386 var b = 1;
387 let r = b + a(0) + 1;
388}
389)";
390
dan sinclair41e4d9a2022-05-01 14:40:55 +0000391 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000392fn a(i : i32) -> i32 {
393 return 1;
394}
395
396fn main() {
397 var b = 1;
398 let tint_symbol = b;
399 let tint_symbol_1 = a(0);
400 let r = ((tint_symbol + tint_symbol_1) + 1);
401}
402)";
403
dan sinclair41e4d9a2022-05-01 14:40:55 +0000404 DataMap data;
405 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000406
dan sinclair41e4d9a2022-05-01 14:40:55 +0000407 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000408}
409
dan sinclair41e4d9a2022-05-01 14:40:55 +0000410TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_Constants_SEAndVarAndConstAndVar) {
411 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000412fn a(i : i32) -> i32 {
413 return 1;
414}
415
416fn main() {
417 var b = 1;
418 var c = 1;
419 let r = a(0) + b + 1 + c;
420}
421)";
422
dan sinclair41e4d9a2022-05-01 14:40:55 +0000423 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000424fn a(i : i32) -> i32 {
425 return 1;
426}
427
428fn main() {
429 var b = 1;
430 var c = 1;
431 let tint_symbol = a(0);
432 let r = (((tint_symbol + b) + 1) + c);
433}
434)";
435
dan sinclair41e4d9a2022-05-01 14:40:55 +0000436 DataMap data;
437 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000438
dan sinclair41e4d9a2022-05-01 14:40:55 +0000439 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000440}
441
442TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_Builtins_WithSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000443 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000444struct SB {
James Price3b671cb2022-03-28 14:31:22 +0000445 a : atomic<i32>,
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000446}
447
448@group(0) @binding(0) var<storage, read_write> sb : SB;
449
450fn f() {
451 var b = 0;
452 let r = atomicAdd(&sb.a, 123) + b;
453}
454)";
455
dan sinclair41e4d9a2022-05-01 14:40:55 +0000456 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000457struct SB {
James Price3b671cb2022-03-28 14:31:22 +0000458 a : atomic<i32>,
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000459}
460
461@group(0) @binding(0) var<storage, read_write> sb : SB;
462
463fn f() {
464 var b = 0;
465 let tint_symbol = atomicAdd(&(sb.a), 123);
466 let r = (tint_symbol + b);
467}
468)";
469
dan sinclair41e4d9a2022-05-01 14:40:55 +0000470 DataMap data;
471 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000472
dan sinclair41e4d9a2022-05-01 14:40:55 +0000473 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000474}
475
476TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_Builtins_NoSEAndVar) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000477 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000478struct SB {
James Price3b671cb2022-03-28 14:31:22 +0000479 a : atomic<i32>,
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000480}
481
482@group(0) @binding(0) var<storage, read_write> sb : SB;
483
484fn f() {
485 var b = 0;
486 let r = (atomicLoad(&(sb.a)) + b);
487}
488)";
489
dan sinclair41e4d9a2022-05-01 14:40:55 +0000490 auto* expect = src;
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000491
dan sinclair41e4d9a2022-05-01 14:40:55 +0000492 DataMap data;
493 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000494
dan sinclair41e4d9a2022-05-01 14:40:55 +0000495 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000496}
497
498TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_Builtins_NoSEAndSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000499 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000500struct SB {
James Price3b671cb2022-03-28 14:31:22 +0000501 a : atomic<i32>,
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000502}
503
504@group(0) @binding(0) var<storage, read_write> sb : SB;
505
506fn a(i : i32) -> i32 {
507 return 1;
508}
509
510fn f() {
511 var b = 0;
512 let r = (atomicLoad(&(sb.a)) + a(0));
513}
514)";
515
dan sinclair41e4d9a2022-05-01 14:40:55 +0000516 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000517struct SB {
James Price3b671cb2022-03-28 14:31:22 +0000518 a : atomic<i32>,
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000519}
520
521@group(0) @binding(0) var<storage, read_write> sb : SB;
522
523fn a(i : i32) -> i32 {
524 return 1;
525}
526
527fn f() {
528 var b = 0;
529 let tint_symbol = atomicLoad(&(sb.a));
530 let tint_symbol_1 = a(0);
531 let r = (tint_symbol + tint_symbol_1);
532}
533)";
534
dan sinclair41e4d9a2022-05-01 14:40:55 +0000535 DataMap data;
536 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000537
dan sinclair41e4d9a2022-05-01 14:40:55 +0000538 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000539}
540
541TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_Vector_RightSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000542 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000543fn a() -> i32 {
544 return 1;
545}
546
547fn f() {
548 var b : vec3<i32>;
549 var c : i32;
550 let r = b[c] + a();
551}
552)";
553
dan sinclair41e4d9a2022-05-01 14:40:55 +0000554 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000555fn a() -> i32 {
556 return 1;
557}
558
559fn f() {
560 var b : vec3<i32>;
561 var c : i32;
562 let tint_symbol = c;
563 let tint_symbol_1 = b[tint_symbol];
564 let tint_symbol_2 = a();
565 let r = (tint_symbol_1 + tint_symbol_2);
566}
567)";
568
dan sinclair41e4d9a2022-05-01 14:40:55 +0000569 DataMap data;
570 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000571
dan sinclair41e4d9a2022-05-01 14:40:55 +0000572 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000573}
574
575TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_InCall) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000576 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000577fn a(i : i32) -> i32 {
578 return i;
579}
580
581fn g(i : i32) -> i32 {
582 return i;
583}
584
585fn f() {
586 var b = 1;
587 let r = g(a(0)) - g(b + a(1));
588}
589)";
590
dan sinclair41e4d9a2022-05-01 14:40:55 +0000591 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000592fn a(i : i32) -> i32 {
593 return i;
594}
595
596fn g(i : i32) -> i32 {
597 return i;
598}
599
600fn f() {
601 var b = 1;
602 let tint_symbol = a(0);
603 let tint_symbol_1 = g(tint_symbol);
604 let tint_symbol_2 = b;
605 let tint_symbol_3 = a(1);
606 let tint_symbol_4 = g((tint_symbol_2 + tint_symbol_3));
607 let r = (tint_symbol_1 - tint_symbol_4);
608}
609)";
610
dan sinclair41e4d9a2022-05-01 14:40:55 +0000611 DataMap data;
612 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000613
dan sinclair41e4d9a2022-05-01 14:40:55 +0000614 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000615}
616
617TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_InTypeCtor) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000618 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000619
620fn a(i : i32) -> i32 {
621 return 1;
622}
623
624fn f() {
625 var b = 1;
626 let r = i32(a(0)) + i32(a(1) + b) - i32(a(2) - a(3));
627}
628)";
629
dan sinclair41e4d9a2022-05-01 14:40:55 +0000630 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000631fn a(i : i32) -> i32 {
632 return 1;
633}
634
635fn f() {
636 var b = 1;
637 let tint_symbol = a(0);
638 let tint_symbol_1 = i32(tint_symbol);
639 let tint_symbol_2 = a(1);
640 let tint_symbol_3 = i32((tint_symbol_2 + b));
641 let tint_symbol_4 = a(2);
642 let tint_symbol_5 = a(3);
643 let tint_symbol_6 = i32((tint_symbol_4 - tint_symbol_5));
644 let r = ((tint_symbol_1 + tint_symbol_3) - tint_symbol_6);
645}
646)";
647
dan sinclair41e4d9a2022-05-01 14:40:55 +0000648 DataMap data;
649 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000650
dan sinclair41e4d9a2022-05-01 14:40:55 +0000651 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000652}
653
654TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_InTypeConversion) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000655 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000656
657fn a(i : i32) -> i32 {
658 return 1;
659}
660
661fn f() {
662 var b = 1u;
663 let r = u32(a(0)) + u32(a(1)) - b;
664}
665)";
666
dan sinclair41e4d9a2022-05-01 14:40:55 +0000667 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000668fn a(i : i32) -> i32 {
669 return 1;
670}
671
672fn f() {
673 var b = 1u;
674 let tint_symbol = a(0);
675 let tint_symbol_1 = u32(tint_symbol);
676 let tint_symbol_2 = a(1);
677 let tint_symbol_3 = u32(tint_symbol_2);
678 let r = ((tint_symbol_1 + tint_symbol_3) - b);
679}
680)";
681
dan sinclair41e4d9a2022-05-01 14:40:55 +0000682 DataMap data;
683 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000684
dan sinclair41e4d9a2022-05-01 14:40:55 +0000685 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000686}
687
688TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_InIntrinsic) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000689 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000690
691fn a(i : i32) -> i32 {
692 return i;
693}
694
695fn f() {
696 var b = 1;
697 let r = abs(a(0)) + abs(a(1) + b) - abs(a(2) + a(3));
698}
699)";
700
dan sinclair41e4d9a2022-05-01 14:40:55 +0000701 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000702fn a(i : i32) -> i32 {
703 return i;
704}
705
706fn f() {
707 var b = 1;
708 let tint_symbol = a(0);
709 let tint_symbol_1 = abs(tint_symbol);
710 let tint_symbol_2 = a(1);
711 let tint_symbol_3 = abs((tint_symbol_2 + b));
712 let tint_symbol_4 = a(2);
713 let tint_symbol_5 = a(3);
714 let tint_symbol_6 = abs((tint_symbol_4 + tint_symbol_5));
715 let r = ((tint_symbol_1 + tint_symbol_3) - tint_symbol_6);
716}
717)";
718
dan sinclair41e4d9a2022-05-01 14:40:55 +0000719 DataMap data;
720 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000721
dan sinclair41e4d9a2022-05-01 14:40:55 +0000722 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000723}
724
725TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_InMemberAccessor) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000726 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000727
728struct S {
James Price3b671cb2022-03-28 14:31:22 +0000729 v : i32,
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000730}
731
732fn a(i : i32) -> S {
733 return S();
734}
735
736fn f() {
737 var b = 1;
738 let r = a(0).v + b + a(1).v;
739}
740)";
741
dan sinclair41e4d9a2022-05-01 14:40:55 +0000742 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000743struct S {
James Price3b671cb2022-03-28 14:31:22 +0000744 v : i32,
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000745}
746
747fn a(i : i32) -> S {
748 return S();
749}
750
751fn f() {
752 var b = 1;
753 let tint_symbol = a(0);
754 let tint_symbol_1 = b;
755 let tint_symbol_2 = a(1);
756 let r = ((tint_symbol.v + tint_symbol_1) + tint_symbol_2.v);
757}
758)";
759
dan sinclair41e4d9a2022-05-01 14:40:55 +0000760 DataMap data;
761 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000762
dan sinclair41e4d9a2022-05-01 14:40:55 +0000763 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000764}
765
766TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_InUnary) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000767 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000768fn a(i : i32) -> i32 {
769 return i;
770}
771
772fn f() {
773 var b = 1;
774 let r = -a(0) + -(b + a(1));
775}
776)";
777
dan sinclair41e4d9a2022-05-01 14:40:55 +0000778 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000779fn a(i : i32) -> i32 {
780 return i;
781}
782
783fn f() {
784 var b = 1;
785 let tint_symbol = -(a(0));
786 let tint_symbol_1 = b;
787 let tint_symbol_2 = a(1);
788 let r = (tint_symbol + -((tint_symbol_1 + tint_symbol_2)));
789}
790)";
791
dan sinclair41e4d9a2022-05-01 14:40:55 +0000792 DataMap data;
793 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000794
dan sinclair41e4d9a2022-05-01 14:40:55 +0000795 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000796}
797
798TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_InBitcast) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000799 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000800fn a(i : i32) -> i32 {
801 return i;
802}
803
804fn f() {
805 var b = 1;
806 let r = bitcast<u32>(a(0) + a(1));
807}
808)";
809
dan sinclair41e4d9a2022-05-01 14:40:55 +0000810 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000811fn a(i : i32) -> i32 {
812 return i;
813}
814
815fn f() {
816 var b = 1;
817 let tint_symbol = a(0);
818 let tint_symbol_1 = a(1);
819 let r = bitcast<u32>((tint_symbol + tint_symbol_1));
820}
821)";
822
dan sinclair41e4d9a2022-05-01 14:40:55 +0000823 DataMap data;
824 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000825
dan sinclair41e4d9a2022-05-01 14:40:55 +0000826 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000827}
828
829TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_InForLoopInit) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000830 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000831fn a(i : i32) -> i32 {
832 return i;
833}
834
835fn f() {
836 var b = 1;
837 for(var r = a(0) + b; ; ) {
838 var marker = 0;
839 break;
840 }
841}
842)";
843
dan sinclair41e4d9a2022-05-01 14:40:55 +0000844 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000845fn a(i : i32) -> i32 {
846 return i;
847}
848
849fn f() {
850 var b = 1;
851 let tint_symbol = a(0);
852 for(var r = (tint_symbol + b); ; ) {
853 var marker = 0;
854 break;
855 }
856}
857)";
858
dan sinclair41e4d9a2022-05-01 14:40:55 +0000859 DataMap data;
860 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000861
dan sinclair41e4d9a2022-05-01 14:40:55 +0000862 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000863}
864
865TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_InForLoopCond) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000866 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000867fn a(i : i32) -> i32 {
868 return i;
869}
870
871fn f() {
872 var b = 1;
873 for(; a(0) + b > 0;) {
874 var marker = 0;
875 }
876}
877)";
878
dan sinclair41e4d9a2022-05-01 14:40:55 +0000879 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000880fn a(i : i32) -> i32 {
881 return i;
882}
883
884fn f() {
885 var b = 1;
886 loop {
887 let tint_symbol = a(0);
888 if (!(((tint_symbol + b) > 0))) {
889 break;
890 }
891 {
892 var marker = 0;
893 }
894 }
895}
896)";
897
dan sinclair41e4d9a2022-05-01 14:40:55 +0000898 DataMap data;
899 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000900
dan sinclair41e4d9a2022-05-01 14:40:55 +0000901 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000902}
903
904TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_InForLoopCont) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000905 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000906fn a(i : i32) -> i32 {
907 return i;
908}
909
910fn f() {
911 var b = 1;
912 var r = 0;
913 for(; ; r = a(0) + b) {
914 var marker = 0;
915 break;
916 }
917}
918)";
919
dan sinclair41e4d9a2022-05-01 14:40:55 +0000920 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000921fn a(i : i32) -> i32 {
922 return i;
923}
924
925fn f() {
926 var b = 1;
927 var r = 0;
928 loop {
929 {
930 var marker = 0;
931 break;
932 }
933
934 continuing {
935 let tint_symbol = a(0);
936 r = (tint_symbol + b);
937 }
938 }
939}
940)";
941
dan sinclair41e4d9a2022-05-01 14:40:55 +0000942 DataMap data;
943 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000944
dan sinclair41e4d9a2022-05-01 14:40:55 +0000945 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000946}
947
948TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_InForLoopInitCondCont) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000949 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000950fn a(i : i32) -> i32 {
951 return i;
952}
953
954fn f() {
955 var b = 1;
956 var c = 2;
957 var d = 3;
958 var r = 0;
959 for(var r = a(0) + b; a(1) + c > 0; r = a(2) + d) {
960 var marker = 0;
961 }
962}
963)";
964
dan sinclair41e4d9a2022-05-01 14:40:55 +0000965 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000966fn a(i : i32) -> i32 {
967 return i;
968}
969
970fn f() {
971 var b = 1;
972 var c = 2;
973 var d = 3;
974 var r = 0;
975 {
976 let tint_symbol = a(0);
977 var r = (tint_symbol + b);
978 loop {
979 let tint_symbol_1 = a(1);
980 if (!(((tint_symbol_1 + c) > 0))) {
981 break;
982 }
983 {
984 var marker = 0;
985 }
986
987 continuing {
988 let tint_symbol_2 = a(2);
989 r = (tint_symbol_2 + d);
990 }
991 }
992 }
993}
994)";
995
dan sinclair41e4d9a2022-05-01 14:40:55 +0000996 DataMap data;
997 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +0000998
dan sinclair41e4d9a2022-05-01 14:40:55 +0000999 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001000}
1001
1002TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_InElseIf) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001003 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001004fn a(i : i32) -> i32 {
1005 return i;
1006}
1007
1008fn f() {
1009 var b = 1;
1010 if (true) {
1011 var marker = 0;
1012 } else if (a(0) + b > 0) {
1013 var marker = 1;
1014 }
1015}
1016)";
1017
dan sinclair41e4d9a2022-05-01 14:40:55 +00001018 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001019fn a(i : i32) -> i32 {
1020 return i;
1021}
1022
1023fn f() {
1024 var b = 1;
1025 if (true) {
1026 var marker = 0;
1027 } else {
1028 let tint_symbol = a(0);
1029 if (((tint_symbol + b) > 0)) {
1030 var marker = 1;
1031 }
1032 }
1033}
1034)";
1035
dan sinclair41e4d9a2022-05-01 14:40:55 +00001036 DataMap data;
1037 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001038
dan sinclair41e4d9a2022-05-01 14:40:55 +00001039 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001040}
1041
1042TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_InElseIfChain) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001043 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001044fn a(i : i32) -> i32 {
1045 return i;
1046}
1047
1048fn f() {
1049 var b = 1;
1050 if (true) {
1051 var marker = 0;
1052 } else if (true) {
1053 var marker = 1;
1054 } else if (a(0) + b > 0) {
1055 var marker = 2;
1056 } else if (a(1) + a(2) > 0) {
1057 var marker = 3;
1058 } else if (true) {
1059 var marker = 4;
1060 } else {
1061 var marker = 5;
1062 }
1063}
1064)";
1065
dan sinclair41e4d9a2022-05-01 14:40:55 +00001066 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001067fn a(i : i32) -> i32 {
1068 return i;
1069}
1070
1071fn f() {
1072 var b = 1;
1073 if (true) {
1074 var marker = 0;
1075 } else if (true) {
1076 var marker = 1;
1077 } else {
1078 let tint_symbol = a(0);
1079 if (((tint_symbol + b) > 0)) {
1080 var marker = 2;
1081 } else {
1082 let tint_symbol_1 = a(1);
1083 let tint_symbol_2 = a(2);
1084 if (((tint_symbol_1 + tint_symbol_2) > 0)) {
1085 var marker = 3;
1086 } else if (true) {
1087 var marker = 4;
1088 } else {
1089 var marker = 5;
1090 }
1091 }
1092 }
1093}
1094)";
1095
dan sinclair41e4d9a2022-05-01 14:40:55 +00001096 DataMap data;
1097 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001098
dan sinclair41e4d9a2022-05-01 14:40:55 +00001099 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001100}
1101
1102TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_InReturn) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001103 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001104fn a(i : i32) -> i32 {
1105 return i;
1106}
1107
1108fn f() -> i32 {
1109 var b = 1;
1110 return b + a(0);
1111}
1112)";
1113
dan sinclair41e4d9a2022-05-01 14:40:55 +00001114 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001115fn a(i : i32) -> i32 {
1116 return i;
1117}
1118
1119fn f() -> i32 {
1120 var b = 1;
1121 let tint_symbol = b;
1122 let tint_symbol_1 = a(0);
1123 return (tint_symbol + tint_symbol_1);
1124}
1125)";
1126
dan sinclair41e4d9a2022-05-01 14:40:55 +00001127 DataMap data;
1128 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001129
dan sinclair41e4d9a2022-05-01 14:40:55 +00001130 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001131}
1132
1133TEST_F(PromoteSideEffectsToDeclTest, Binary_Arith_InSwitch) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001134 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001135fn a(i : i32) -> i32 {
1136 return i;
1137}
1138
1139fn f() {
1140 var b = 1;
1141 switch (b + a(0)) {
1142 default: {
1143 }
1144 }
1145}
1146)";
1147
dan sinclair41e4d9a2022-05-01 14:40:55 +00001148 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001149fn a(i : i32) -> i32 {
1150 return i;
1151}
1152
1153fn f() {
1154 var b = 1;
1155 let tint_symbol = b;
1156 let tint_symbol_1 = a(0);
1157 switch((tint_symbol + tint_symbol_1)) {
1158 default: {
1159 }
1160 }
1161}
1162)";
1163
dan sinclair41e4d9a2022-05-01 14:40:55 +00001164 DataMap data;
1165 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001166
dan sinclair41e4d9a2022-05-01 14:40:55 +00001167 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001168}
1169
1170TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_LeftSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001171 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001172fn a(i : i32) -> bool {
1173 return true;
1174}
1175
1176fn f() {
1177 var b = true;
1178 let r = a(0) && b;
1179}
1180)";
1181
dan sinclair41e4d9a2022-05-01 14:40:55 +00001182 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001183fn a(i : i32) -> bool {
1184 return true;
1185}
1186
1187fn f() {
1188 var b = true;
1189 var tint_symbol = a(0);
1190 if (tint_symbol) {
1191 tint_symbol = b;
1192 }
1193 let r = tint_symbol;
1194}
1195)";
1196
dan sinclair41e4d9a2022-05-01 14:40:55 +00001197 DataMap data;
1198 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001199
dan sinclair41e4d9a2022-05-01 14:40:55 +00001200 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001201}
1202
1203TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_RightSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001204 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001205fn a(i : i32) -> bool {
1206 return true;
1207}
1208
1209fn f() {
1210 var b = true;
1211 let r = b && a(0);
1212}
1213)";
1214
dan sinclair41e4d9a2022-05-01 14:40:55 +00001215 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001216fn a(i : i32) -> bool {
1217 return true;
1218}
1219
1220fn f() {
1221 var b = true;
1222 var tint_symbol = b;
1223 if (tint_symbol) {
1224 tint_symbol = a(0);
1225 }
1226 let r = tint_symbol;
1227}
1228)";
1229
dan sinclair41e4d9a2022-05-01 14:40:55 +00001230 DataMap data;
1231 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001232
dan sinclair41e4d9a2022-05-01 14:40:55 +00001233 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001234}
1235
1236TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_BothSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001237 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001238fn a(i : i32) -> bool {
1239 return true;
1240}
1241
1242fn f() {
1243 let r = a(0) && a(1);
1244}
1245)";
1246
dan sinclair41e4d9a2022-05-01 14:40:55 +00001247 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001248fn a(i : i32) -> bool {
1249 return true;
1250}
1251
1252fn f() {
1253 var tint_symbol = a(0);
1254 if (tint_symbol) {
1255 tint_symbol = a(1);
1256 }
1257 let r = tint_symbol;
1258}
1259)";
1260
dan sinclair41e4d9a2022-05-01 14:40:55 +00001261 DataMap data;
1262 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001263
dan sinclair41e4d9a2022-05-01 14:40:55 +00001264 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001265}
1266
1267TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_LeftmostSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001268 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001269fn a(i : i32) -> bool {
1270 return true;
1271}
1272
1273fn f() {
1274 var b = true;
1275 var c = true;
1276 var d = true;
1277 let r = a(0) && b && c && d;
1278}
1279)";
1280
dan sinclair41e4d9a2022-05-01 14:40:55 +00001281 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001282fn a(i : i32) -> bool {
1283 return true;
1284}
1285
1286fn f() {
1287 var b = true;
1288 var c = true;
1289 var d = true;
1290 var tint_symbol_2 = a(0);
1291 if (tint_symbol_2) {
1292 tint_symbol_2 = b;
1293 }
1294 var tint_symbol_1 = tint_symbol_2;
1295 if (tint_symbol_1) {
1296 tint_symbol_1 = c;
1297 }
1298 var tint_symbol = tint_symbol_1;
1299 if (tint_symbol) {
1300 tint_symbol = d;
1301 }
1302 let r = tint_symbol;
1303}
1304)";
1305
dan sinclair41e4d9a2022-05-01 14:40:55 +00001306 DataMap data;
1307 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001308
dan sinclair41e4d9a2022-05-01 14:40:55 +00001309 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001310}
1311
1312TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_RightmostSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001313 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001314fn a(i : i32) -> bool {
1315 return true;
1316}
1317
1318fn f() {
1319 var b = true;
1320 var c = true;
1321 var d = true;
1322 let r = b && c && d && a(0);
1323}
1324)";
1325
dan sinclair41e4d9a2022-05-01 14:40:55 +00001326 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001327fn a(i : i32) -> bool {
1328 return true;
1329}
1330
1331fn f() {
1332 var b = true;
1333 var c = true;
1334 var d = true;
1335 var tint_symbol = ((b && c) && d);
1336 if (tint_symbol) {
1337 tint_symbol = a(0);
1338 }
1339 let r = tint_symbol;
1340}
1341)";
1342
dan sinclair41e4d9a2022-05-01 14:40:55 +00001343 DataMap data;
1344 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001345
dan sinclair41e4d9a2022-05-01 14:40:55 +00001346 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001347}
1348
1349TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_MiddleSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001350 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001351fn a(i : i32) -> bool {
1352 return true;
1353}
1354
1355fn f() {
1356 var b = true;
1357 var c = true;
1358 var d = true;
1359 let r = b && c && a(0) && c && d;
1360}
1361)";
1362
dan sinclair41e4d9a2022-05-01 14:40:55 +00001363 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001364fn a(i : i32) -> bool {
1365 return true;
1366}
1367
1368fn f() {
1369 var b = true;
1370 var c = true;
1371 var d = true;
1372 var tint_symbol_2 = (b && c);
1373 if (tint_symbol_2) {
1374 tint_symbol_2 = a(0);
1375 }
1376 var tint_symbol_1 = tint_symbol_2;
1377 if (tint_symbol_1) {
1378 tint_symbol_1 = c;
1379 }
1380 var tint_symbol = tint_symbol_1;
1381 if (tint_symbol) {
1382 tint_symbol = d;
1383 }
1384 let r = tint_symbol;
1385}
1386)";
1387
dan sinclair41e4d9a2022-05-01 14:40:55 +00001388 DataMap data;
1389 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001390
dan sinclair41e4d9a2022-05-01 14:40:55 +00001391 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001392}
1393
1394TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_Constants_NoRecvSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001395 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001396fn a(i : i32) -> bool {
1397 return true;
1398}
1399
1400fn f() {
1401 let r = true && a(0) && false && a(1);
1402}
1403)";
1404
dan sinclair41e4d9a2022-05-01 14:40:55 +00001405 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001406fn a(i : i32) -> bool {
1407 return true;
1408}
1409
1410fn f() {
1411 var tint_symbol_2 = true;
1412 if (tint_symbol_2) {
1413 tint_symbol_2 = a(0);
1414 }
1415 var tint_symbol_1 = tint_symbol_2;
1416 if (tint_symbol_1) {
1417 tint_symbol_1 = false;
1418 }
1419 var tint_symbol = tint_symbol_1;
1420 if (tint_symbol) {
1421 tint_symbol = a(1);
1422 }
1423 let r = tint_symbol;
1424}
1425)";
1426
dan sinclair41e4d9a2022-05-01 14:40:55 +00001427 DataMap data;
1428 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001429
dan sinclair41e4d9a2022-05-01 14:40:55 +00001430 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001431}
1432
1433TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_Constants_RecvSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001434 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001435fn a(i : i32) -> bool {
1436 return true;
1437}
1438
1439fn f() {
1440 var b = true;
1441 let r = b && true && a(0) && false && a(1);
1442}
1443)";
1444
dan sinclair41e4d9a2022-05-01 14:40:55 +00001445 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001446fn a(i : i32) -> bool {
1447 return true;
1448}
1449
1450fn f() {
1451 var b = true;
1452 var tint_symbol_2 = (b && true);
1453 if (tint_symbol_2) {
1454 tint_symbol_2 = a(0);
1455 }
1456 var tint_symbol_1 = tint_symbol_2;
1457 if (tint_symbol_1) {
1458 tint_symbol_1 = false;
1459 }
1460 var tint_symbol = tint_symbol_1;
1461 if (tint_symbol) {
1462 tint_symbol = a(1);
1463 }
1464 let r = tint_symbol;
1465}
1466)";
1467
dan sinclair41e4d9a2022-05-01 14:40:55 +00001468 DataMap data;
1469 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001470
dan sinclair41e4d9a2022-05-01 14:40:55 +00001471 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001472}
1473
dan sinclair41e4d9a2022-05-01 14:40:55 +00001474TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_Constants_ConstAndSEAndVar) {
1475 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001476fn a(i : i32) -> bool {
1477 return true;
1478}
1479
1480fn main() {
1481 var b = true;
1482 var c = true;
1483 let r = true && a(0) && b;
1484}
1485)";
1486
dan sinclair41e4d9a2022-05-01 14:40:55 +00001487 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001488fn a(i : i32) -> bool {
1489 return true;
1490}
1491
1492fn main() {
1493 var b = true;
1494 var c = true;
1495 var tint_symbol_1 = true;
1496 if (tint_symbol_1) {
1497 tint_symbol_1 = a(0);
1498 }
1499 var tint_symbol = tint_symbol_1;
1500 if (tint_symbol) {
1501 tint_symbol = b;
1502 }
1503 let r = tint_symbol;
1504}
1505)";
1506
dan sinclair41e4d9a2022-05-01 14:40:55 +00001507 DataMap data;
1508 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001509
dan sinclair41e4d9a2022-05-01 14:40:55 +00001510 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001511}
1512
dan sinclair41e4d9a2022-05-01 14:40:55 +00001513TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_Constants_VarAndSEAndConst) {
1514 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001515fn a(i : i32) -> bool {
1516 return true;
1517}
1518
1519fn main() {
1520 var b = true;
1521 let r = b && a(0) && true;
1522}
1523)";
1524
dan sinclair41e4d9a2022-05-01 14:40:55 +00001525 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001526fn a(i : i32) -> bool {
1527 return true;
1528}
1529
1530fn main() {
1531 var b = true;
1532 var tint_symbol_1 = b;
1533 if (tint_symbol_1) {
1534 tint_symbol_1 = a(0);
1535 }
1536 var tint_symbol = tint_symbol_1;
1537 if (tint_symbol) {
1538 tint_symbol = true;
1539 }
1540 let r = tint_symbol;
1541}
1542)";
1543
dan sinclair41e4d9a2022-05-01 14:40:55 +00001544 DataMap data;
1545 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001546
dan sinclair41e4d9a2022-05-01 14:40:55 +00001547 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001548}
1549
dan sinclair41e4d9a2022-05-01 14:40:55 +00001550TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_Constants_SEAndVarAndConstAndVar) {
1551 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001552fn a(i : i32) -> bool {
1553 return true;
1554}
1555
1556fn main() {
1557 var b = true;
1558 var c = true;
1559 let r = a(0) && b && true && c;
1560}
1561)";
1562
dan sinclair41e4d9a2022-05-01 14:40:55 +00001563 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001564fn a(i : i32) -> bool {
1565 return true;
1566}
1567
1568fn main() {
1569 var b = true;
1570 var c = true;
1571 var tint_symbol_2 = a(0);
1572 if (tint_symbol_2) {
1573 tint_symbol_2 = b;
1574 }
1575 var tint_symbol_1 = tint_symbol_2;
1576 if (tint_symbol_1) {
1577 tint_symbol_1 = true;
1578 }
1579 var tint_symbol = tint_symbol_1;
1580 if (tint_symbol) {
1581 tint_symbol = c;
1582 }
1583 let r = tint_symbol;
1584}
1585)";
1586
dan sinclair41e4d9a2022-05-01 14:40:55 +00001587 DataMap data;
1588 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001589
dan sinclair41e4d9a2022-05-01 14:40:55 +00001590 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001591}
1592
1593TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_MixedSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001594 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001595fn a(i : i32) -> bool {
1596 return true;
1597}
1598
1599fn f() {
1600 var b = true;
1601 var c = true;
1602 var d = true;
1603 let r = b && a(0) || c && a(1) && c && d || a(2);
1604}
1605)";
1606
dan sinclair41e4d9a2022-05-01 14:40:55 +00001607 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001608fn a(i : i32) -> bool {
1609 return true;
1610}
1611
1612fn f() {
1613 var b = true;
1614 var c = true;
1615 var d = true;
1616 var tint_symbol_2 = b;
1617 if (tint_symbol_2) {
1618 tint_symbol_2 = a(0);
1619 }
1620 var tint_symbol_1 = tint_symbol_2;
1621 if (!(tint_symbol_1)) {
1622 var tint_symbol_5 = c;
1623 if (tint_symbol_5) {
1624 tint_symbol_5 = a(1);
1625 }
1626 var tint_symbol_4 = tint_symbol_5;
1627 if (tint_symbol_4) {
1628 tint_symbol_4 = c;
1629 }
1630 var tint_symbol_3 = tint_symbol_4;
1631 if (tint_symbol_3) {
1632 tint_symbol_3 = d;
1633 }
1634 tint_symbol_1 = tint_symbol_3;
1635 }
1636 var tint_symbol = tint_symbol_1;
1637 if (!(tint_symbol)) {
1638 tint_symbol = a(2);
1639 }
1640 let r = tint_symbol;
1641}
1642)";
1643
dan sinclair41e4d9a2022-05-01 14:40:55 +00001644 DataMap data;
1645 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001646
dan sinclair41e4d9a2022-05-01 14:40:55 +00001647 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001648}
1649
1650TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_NestedAnds) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001651 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001652fn a(i : i32) -> bool {
1653 return true;
1654}
1655
1656fn f() {
1657 let r = a(0) && (a(1) && (a(2) && (a(3) && (a(4) && a(5)))));
1658}
1659)";
1660
dan sinclair41e4d9a2022-05-01 14:40:55 +00001661 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001662fn a(i : i32) -> bool {
1663 return true;
1664}
1665
1666fn f() {
1667 var tint_symbol = a(0);
1668 if (tint_symbol) {
1669 var tint_symbol_1 = a(1);
1670 if (tint_symbol_1) {
1671 var tint_symbol_2 = a(2);
1672 if (tint_symbol_2) {
1673 var tint_symbol_3 = a(3);
1674 if (tint_symbol_3) {
1675 var tint_symbol_4 = a(4);
1676 if (tint_symbol_4) {
1677 tint_symbol_4 = a(5);
1678 }
1679 tint_symbol_3 = tint_symbol_4;
1680 }
1681 tint_symbol_2 = tint_symbol_3;
1682 }
1683 tint_symbol_1 = tint_symbol_2;
1684 }
1685 tint_symbol = tint_symbol_1;
1686 }
1687 let r = tint_symbol;
1688}
1689)";
1690
dan sinclair41e4d9a2022-05-01 14:40:55 +00001691 DataMap data;
1692 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001693
dan sinclair41e4d9a2022-05-01 14:40:55 +00001694 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001695}
1696
1697TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_NestedOrs) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001698 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001699fn a(i : i32) -> bool {
1700 return true;
1701}
1702
1703fn f() {
1704 let r = a(0) || (a(1) || (a(2) || (a(3) || (a(4) || a(5)))));
1705}
1706)";
1707
dan sinclair41e4d9a2022-05-01 14:40:55 +00001708 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001709fn a(i : i32) -> bool {
1710 return true;
1711}
1712
1713fn f() {
1714 var tint_symbol = a(0);
1715 if (!(tint_symbol)) {
1716 var tint_symbol_1 = a(1);
1717 if (!(tint_symbol_1)) {
1718 var tint_symbol_2 = a(2);
1719 if (!(tint_symbol_2)) {
1720 var tint_symbol_3 = a(3);
1721 if (!(tint_symbol_3)) {
1722 var tint_symbol_4 = a(4);
1723 if (!(tint_symbol_4)) {
1724 tint_symbol_4 = a(5);
1725 }
1726 tint_symbol_3 = tint_symbol_4;
1727 }
1728 tint_symbol_2 = tint_symbol_3;
1729 }
1730 tint_symbol_1 = tint_symbol_2;
1731 }
1732 tint_symbol = tint_symbol_1;
1733 }
1734 let r = tint_symbol;
1735}
1736)";
1737
dan sinclair41e4d9a2022-05-01 14:40:55 +00001738 DataMap data;
1739 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001740
dan sinclair41e4d9a2022-05-01 14:40:55 +00001741 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001742}
1743
1744TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_MultipleStatements) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001745 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001746fn a(i : i32) -> bool {
1747 return true;
1748}
1749
1750fn f() {
1751 var b = true;
1752 let r1 = b && a(0);
1753 let r2 = a(1) || b;
1754}
1755)";
1756
dan sinclair41e4d9a2022-05-01 14:40:55 +00001757 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001758fn a(i : i32) -> bool {
1759 return true;
1760}
1761
1762fn f() {
1763 var b = true;
1764 var tint_symbol = b;
1765 if (tint_symbol) {
1766 tint_symbol = a(0);
1767 }
1768 let r1 = tint_symbol;
1769 var tint_symbol_1 = a(1);
1770 if (!(tint_symbol_1)) {
1771 tint_symbol_1 = b;
1772 }
1773 let r2 = tint_symbol_1;
1774}
1775)";
1776
dan sinclair41e4d9a2022-05-01 14:40:55 +00001777 DataMap data;
1778 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001779
dan sinclair41e4d9a2022-05-01 14:40:55 +00001780 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001781}
1782
1783TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_InCall) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001784 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001785fn a(i : i32) -> bool {
1786 return true;
1787}
1788
1789fn g(v : bool) -> bool {
1790 return v;
1791}
1792
1793fn f() {
1794 var b = true;
1795 g(b && a(1));
1796}
1797)";
1798
dan sinclair41e4d9a2022-05-01 14:40:55 +00001799 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001800fn a(i : i32) -> bool {
1801 return true;
1802}
1803
1804fn g(v : bool) -> bool {
1805 return v;
1806}
1807
1808fn f() {
1809 var b = true;
1810 var tint_symbol = b;
1811 if (tint_symbol) {
1812 tint_symbol = a(1);
1813 }
1814 g(tint_symbol);
1815}
1816)";
1817
dan sinclair41e4d9a2022-05-01 14:40:55 +00001818 DataMap data;
1819 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001820
dan sinclair41e4d9a2022-05-01 14:40:55 +00001821 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001822}
1823
1824TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_InTypeCtor) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001825 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001826
1827fn a(i : i32) -> bool {
1828 return true;
1829}
1830
1831fn f() {
1832 var b = true;
1833 let r = bool(a(0)) && bool(a(1) && b) || bool(a(2) && a(3));
1834}
1835)";
1836
dan sinclair41e4d9a2022-05-01 14:40:55 +00001837 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001838fn a(i : i32) -> bool {
1839 return true;
1840}
1841
1842fn f() {
1843 var b = true;
1844 let tint_symbol_2 = a(0);
1845 var tint_symbol_1 = bool(tint_symbol_2);
1846 if (tint_symbol_1) {
1847 var tint_symbol_3 = a(1);
1848 if (tint_symbol_3) {
1849 tint_symbol_3 = b;
1850 }
1851 tint_symbol_1 = bool(tint_symbol_3);
1852 }
1853 var tint_symbol = tint_symbol_1;
1854 if (!(tint_symbol)) {
1855 var tint_symbol_4 = a(2);
1856 if (tint_symbol_4) {
1857 tint_symbol_4 = a(3);
1858 }
1859 tint_symbol = bool(tint_symbol_4);
1860 }
1861 let r = tint_symbol;
1862}
1863)";
1864
dan sinclair41e4d9a2022-05-01 14:40:55 +00001865 DataMap data;
1866 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001867
dan sinclair41e4d9a2022-05-01 14:40:55 +00001868 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001869}
1870
1871TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_InTypeConversion) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001872 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001873
1874fn a(i : i32) -> i32 {
1875 return 1;
1876}
1877
1878fn f() {
1879 var b = true;
1880 let r = bool(a(0)) && bool(a(1)) || b;
1881}
1882)";
1883
dan sinclair41e4d9a2022-05-01 14:40:55 +00001884 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001885fn a(i : i32) -> i32 {
1886 return 1;
1887}
1888
1889fn f() {
1890 var b = true;
1891 let tint_symbol_2 = a(0);
1892 var tint_symbol_1 = bool(tint_symbol_2);
1893 if (tint_symbol_1) {
1894 let tint_symbol_3 = a(1);
1895 tint_symbol_1 = bool(tint_symbol_3);
1896 }
1897 var tint_symbol = tint_symbol_1;
1898 if (!(tint_symbol)) {
1899 tint_symbol = b;
1900 }
1901 let r = tint_symbol;
1902}
1903)";
1904
dan sinclair41e4d9a2022-05-01 14:40:55 +00001905 DataMap data;
1906 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001907
dan sinclair41e4d9a2022-05-01 14:40:55 +00001908 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001909}
1910
1911// Make sure we process logical binary expressions of non-logical binary
1912// expressions.
1913TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_OfNonLogical) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001914 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001915
1916fn a(i : i32) -> i32 {
1917 return 1;
1918}
1919
1920fn f() {
1921 var b = 1;
1922 let r = bool(a(0) == b) && bool(a(1) == b);
1923}
1924)";
1925
dan sinclair41e4d9a2022-05-01 14:40:55 +00001926 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001927fn a(i : i32) -> i32 {
1928 return 1;
1929}
1930
1931fn f() {
1932 var b = 1;
1933 let tint_symbol_1 = a(0);
1934 var tint_symbol = bool((tint_symbol_1 == b));
1935 if (tint_symbol) {
1936 let tint_symbol_2 = a(1);
1937 tint_symbol = bool((tint_symbol_2 == b));
1938 }
1939 let r = tint_symbol;
1940}
1941)";
1942
dan sinclair41e4d9a2022-05-01 14:40:55 +00001943 DataMap data;
1944 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001945
dan sinclair41e4d9a2022-05-01 14:40:55 +00001946 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001947}
1948
1949TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_InIntrinsic) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001950 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001951
1952fn a(i : i32) -> bool {
1953 return true;
1954}
1955
1956fn f() {
1957 var b = true;
1958 let r = all(a(0)) && all(a(1) && b) || all(a(2) && a(3));
1959}
1960)";
1961
dan sinclair41e4d9a2022-05-01 14:40:55 +00001962 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001963fn a(i : i32) -> bool {
1964 return true;
1965}
1966
1967fn f() {
1968 var b = true;
1969 let tint_symbol_2 = a(0);
1970 var tint_symbol_1 = all(tint_symbol_2);
1971 if (tint_symbol_1) {
1972 var tint_symbol_3 = a(1);
1973 if (tint_symbol_3) {
1974 tint_symbol_3 = b;
1975 }
1976 tint_symbol_1 = all(tint_symbol_3);
1977 }
1978 var tint_symbol = tint_symbol_1;
1979 if (!(tint_symbol)) {
1980 var tint_symbol_4 = a(2);
1981 if (tint_symbol_4) {
1982 tint_symbol_4 = a(3);
1983 }
1984 tint_symbol = all(tint_symbol_4);
1985 }
1986 let r = tint_symbol;
1987}
1988)";
1989
dan sinclair41e4d9a2022-05-01 14:40:55 +00001990 DataMap data;
1991 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001992
dan sinclair41e4d9a2022-05-01 14:40:55 +00001993 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001994}
1995
1996TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_InMemberAccessor) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00001997 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00001998
1999struct S {
James Price3b671cb2022-03-28 14:31:22 +00002000 v : bool,
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002001}
2002
2003fn a(i : i32) -> S {
2004 return S();
2005}
2006
2007fn f() {
2008 var b = true;
2009 let r = a(0).v && b && a(1).v;
2010}
2011)";
2012
dan sinclair41e4d9a2022-05-01 14:40:55 +00002013 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002014struct S {
James Price3b671cb2022-03-28 14:31:22 +00002015 v : bool,
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002016}
2017
2018fn a(i : i32) -> S {
2019 return S();
2020}
2021
2022fn f() {
2023 var b = true;
2024 let tint_symbol_2 = a(0);
2025 var tint_symbol_1 = tint_symbol_2.v;
2026 if (tint_symbol_1) {
2027 tint_symbol_1 = b;
2028 }
2029 var tint_symbol = tint_symbol_1;
2030 if (tint_symbol) {
2031 let tint_symbol_3 = a(1);
2032 tint_symbol = tint_symbol_3.v;
2033 }
2034 let r = tint_symbol;
2035}
2036)";
2037
dan sinclair41e4d9a2022-05-01 14:40:55 +00002038 DataMap data;
2039 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002040
dan sinclair41e4d9a2022-05-01 14:40:55 +00002041 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002042}
2043
2044TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_InUnary) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002045 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002046
2047fn a(i : i32) -> bool {
2048 return true;
2049}
2050
2051fn f() {
2052 var b = true;
2053 let r = !(b || a(1));
2054}
2055)";
2056
dan sinclair41e4d9a2022-05-01 14:40:55 +00002057 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002058fn a(i : i32) -> bool {
2059 return true;
2060}
2061
2062fn f() {
2063 var b = true;
2064 var tint_symbol = b;
2065 if (!(tint_symbol)) {
2066 tint_symbol = a(1);
2067 }
2068 let r = !(tint_symbol);
2069}
2070)";
2071
dan sinclair41e4d9a2022-05-01 14:40:55 +00002072 DataMap data;
2073 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002074
dan sinclair41e4d9a2022-05-01 14:40:55 +00002075 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002076}
2077
2078TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_InBitcast) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002079 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002080fn a(i : i32) -> bool {
2081 return true;
2082}
2083
2084fn f() {
2085 var b = true;
2086 let r = bitcast<u32>(i32(a(0) && a(1)));
2087}
2088)";
2089
dan sinclair41e4d9a2022-05-01 14:40:55 +00002090 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002091fn a(i : i32) -> bool {
2092 return true;
2093}
2094
2095fn f() {
2096 var b = true;
2097 var tint_symbol = a(0);
2098 if (tint_symbol) {
2099 tint_symbol = a(1);
2100 }
2101 let r = bitcast<u32>(i32(tint_symbol));
2102}
2103)";
2104
dan sinclair41e4d9a2022-05-01 14:40:55 +00002105 DataMap data;
2106 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002107
dan sinclair41e4d9a2022-05-01 14:40:55 +00002108 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002109}
2110
2111TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_InForLoopInit) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002112 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002113fn a(i : i32) -> bool {
2114 return true;
2115}
2116
2117fn f() {
2118 var b = true;
2119 for(var r = a(0) && b; ; ) {
2120 var marker = 0;
2121 break;
2122 }
2123}
2124)";
2125
dan sinclair41e4d9a2022-05-01 14:40:55 +00002126 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002127fn a(i : i32) -> bool {
2128 return true;
2129}
2130
2131fn f() {
2132 var b = true;
2133 var tint_symbol = a(0);
2134 if (tint_symbol) {
2135 tint_symbol = b;
2136 }
2137 for(var r = tint_symbol; ; ) {
2138 var marker = 0;
2139 break;
2140 }
2141}
2142)";
2143
dan sinclair41e4d9a2022-05-01 14:40:55 +00002144 DataMap data;
2145 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002146
dan sinclair41e4d9a2022-05-01 14:40:55 +00002147 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002148}
2149
2150TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_InForLoopCond) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002151 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002152fn a(i : i32) -> bool {
2153 return true;
2154}
2155
2156fn f() {
2157 var b = true;
2158 for(; a(0) && b;) {
2159 var marker = 0;
2160 }
2161}
2162)";
2163
dan sinclair41e4d9a2022-05-01 14:40:55 +00002164 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002165fn a(i : i32) -> bool {
2166 return true;
2167}
2168
2169fn f() {
2170 var b = true;
2171 loop {
2172 var tint_symbol = a(0);
2173 if (tint_symbol) {
2174 tint_symbol = b;
2175 }
2176 if (!(tint_symbol)) {
2177 break;
2178 }
2179 {
2180 var marker = 0;
2181 }
2182 }
2183}
2184)";
2185
dan sinclair41e4d9a2022-05-01 14:40:55 +00002186 DataMap data;
2187 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002188
dan sinclair41e4d9a2022-05-01 14:40:55 +00002189 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002190}
2191
2192TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_InForLoopCont) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002193 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002194fn a(i : i32) -> bool {
2195 return true;
2196}
2197
2198fn f() {
2199 var b = true;
2200 var r = true;
2201 for(; ; r = a(0) && b) {
2202 var marker = 0;
2203 break;
2204 }
2205}
2206)";
2207
dan sinclair41e4d9a2022-05-01 14:40:55 +00002208 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002209fn a(i : i32) -> bool {
2210 return true;
2211}
2212
2213fn f() {
2214 var b = true;
2215 var r = true;
2216 loop {
2217 {
2218 var marker = 0;
2219 break;
2220 }
2221
2222 continuing {
2223 var tint_symbol = a(0);
2224 if (tint_symbol) {
2225 tint_symbol = b;
2226 }
2227 r = tint_symbol;
2228 }
2229 }
2230}
2231)";
2232
dan sinclair41e4d9a2022-05-01 14:40:55 +00002233 DataMap data;
2234 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002235
dan sinclair41e4d9a2022-05-01 14:40:55 +00002236 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002237}
2238
2239TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_InForLoopInitCondCont) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002240 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002241fn a(i : i32) -> bool {
2242 return true;
2243}
2244
2245fn f() {
2246 var b = true;
2247 var c = true;
2248 var d = true;
2249 var r = true;
2250 for(var r = a(0) && b; a(1) && c; r = a(2) && d) {
2251 var marker = 0;
2252 }
2253}
2254)";
2255
dan sinclair41e4d9a2022-05-01 14:40:55 +00002256 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002257fn a(i : i32) -> bool {
2258 return true;
2259}
2260
2261fn f() {
2262 var b = true;
2263 var c = true;
2264 var d = true;
2265 var r = true;
2266 {
2267 var tint_symbol = a(0);
2268 if (tint_symbol) {
2269 tint_symbol = b;
2270 }
2271 var r = tint_symbol;
2272 loop {
2273 var tint_symbol_1 = a(1);
2274 if (tint_symbol_1) {
2275 tint_symbol_1 = c;
2276 }
2277 if (!(tint_symbol_1)) {
2278 break;
2279 }
2280 {
2281 var marker = 0;
2282 }
2283
2284 continuing {
2285 var tint_symbol_2 = a(2);
2286 if (tint_symbol_2) {
2287 tint_symbol_2 = d;
2288 }
2289 r = tint_symbol_2;
2290 }
2291 }
2292 }
2293}
2294)";
2295
dan sinclair41e4d9a2022-05-01 14:40:55 +00002296 DataMap data;
2297 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002298
dan sinclair41e4d9a2022-05-01 14:40:55 +00002299 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002300}
2301
2302TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_InElseIf) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002303 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002304fn a(i : i32) -> bool {
2305 return true;
2306}
2307
2308fn f() {
2309 var b = true;
2310 if (true) {
2311 var marker = 0;
2312 } else if (a(0) && b) {
2313 var marker = 1;
2314 }
2315}
2316)";
2317
dan sinclair41e4d9a2022-05-01 14:40:55 +00002318 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002319fn a(i : i32) -> bool {
2320 return true;
2321}
2322
2323fn f() {
2324 var b = true;
2325 if (true) {
2326 var marker = 0;
2327 } else {
2328 var tint_symbol = a(0);
2329 if (tint_symbol) {
2330 tint_symbol = b;
2331 }
2332 if (tint_symbol) {
2333 var marker = 1;
2334 }
2335 }
2336}
2337)";
2338
dan sinclair41e4d9a2022-05-01 14:40:55 +00002339 DataMap data;
2340 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002341
dan sinclair41e4d9a2022-05-01 14:40:55 +00002342 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002343}
2344
2345TEST_F(PromoteSideEffectsToDeclTest, Binary_Logical_InElseIfChain) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002346 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002347fn a(i : i32) -> bool {
2348 return true;
2349}
2350
2351fn f() {
2352 var b = true;
2353 if (true) {
2354 var marker = 0;
2355 } else if (true) {
2356 var marker = 1;
2357 } else if (a(0) && b) {
2358 var marker = 2;
2359 } else if (a(1) && a(2)) {
2360 var marker = 3;
2361 } else if (true) {
2362 var marker = 4;
2363 } else {
2364 var marker = 5;
2365 }
2366}
2367)";
2368
dan sinclair41e4d9a2022-05-01 14:40:55 +00002369 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002370fn a(i : i32) -> bool {
2371 return true;
2372}
2373
2374fn f() {
2375 var b = true;
2376 if (true) {
2377 var marker = 0;
2378 } else if (true) {
2379 var marker = 1;
2380 } else {
2381 var tint_symbol = a(0);
2382 if (tint_symbol) {
2383 tint_symbol = b;
2384 }
2385 if (tint_symbol) {
2386 var marker = 2;
2387 } else {
2388 var tint_symbol_1 = a(1);
2389 if (tint_symbol_1) {
2390 tint_symbol_1 = a(2);
2391 }
2392 if (tint_symbol_1) {
2393 var marker = 3;
2394 } else if (true) {
2395 var marker = 4;
2396 } else {
2397 var marker = 5;
2398 }
2399 }
2400 }
2401}
2402)";
2403
dan sinclair41e4d9a2022-05-01 14:40:55 +00002404 DataMap data;
2405 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002406
dan sinclair41e4d9a2022-05-01 14:40:55 +00002407 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002408}
2409
2410TEST_F(PromoteSideEffectsToDeclTest, Call_NoSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002411 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002412fn a(i : i32) -> i32 {
2413 return 1;
2414}
2415
2416fn g(a : i32, b : i32, c : i32) -> i32 {
2417 return 1;
2418}
2419
2420fn f() {
2421 var b = 1;
2422 var c = 1;
2423 let r = g(b, c, 3);
2424}
2425)";
2426
dan sinclair41e4d9a2022-05-01 14:40:55 +00002427 auto* expect = src;
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002428
dan sinclair41e4d9a2022-05-01 14:40:55 +00002429 DataMap data;
2430 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002431
dan sinclair41e4d9a2022-05-01 14:40:55 +00002432 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002433}
2434
2435TEST_F(PromoteSideEffectsToDeclTest, Call_OneSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002436 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002437fn a(i : i32) -> i32 {
2438 return 1;
2439}
2440
2441fn g(a : i32, b : i32, c : i32) -> i32 {
2442 return 1;
2443}
2444
2445fn f() {
2446 var b = 1;
2447 let r = g(a(0), b, 3);
2448}
2449)";
2450
dan sinclair41e4d9a2022-05-01 14:40:55 +00002451 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002452fn a(i : i32) -> i32 {
2453 return 1;
2454}
2455
2456fn g(a : i32, b : i32, c : i32) -> i32 {
2457 return 1;
2458}
2459
2460fn f() {
2461 var b = 1;
2462 let tint_symbol = a(0);
2463 let r = g(tint_symbol, b, 3);
2464}
2465)";
2466
dan sinclair41e4d9a2022-05-01 14:40:55 +00002467 DataMap data;
2468 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002469
dan sinclair41e4d9a2022-05-01 14:40:55 +00002470 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002471}
2472
2473TEST_F(PromoteSideEffectsToDeclTest, Call_AllSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002474 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002475fn a(i : i32) -> i32 {
2476 return 1;
2477}
2478
2479fn g(a : i32, b : i32, c : i32) -> i32 {
2480 return 1;
2481}
2482
2483fn f() {
2484 let r = g(a(0), a(1), a(2));
2485}
2486)";
2487
dan sinclair41e4d9a2022-05-01 14:40:55 +00002488 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002489fn a(i : i32) -> i32 {
2490 return 1;
2491}
2492
2493fn g(a : i32, b : i32, c : i32) -> i32 {
2494 return 1;
2495}
2496
2497fn f() {
2498 let tint_symbol = a(0);
2499 let tint_symbol_1 = a(1);
2500 let tint_symbol_2 = a(2);
2501 let r = g(tint_symbol, tint_symbol_1, tint_symbol_2);
2502}
2503)";
2504
dan sinclair41e4d9a2022-05-01 14:40:55 +00002505 DataMap data;
2506 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002507
dan sinclair41e4d9a2022-05-01 14:40:55 +00002508 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002509}
2510
2511TEST_F(PromoteSideEffectsToDeclTest, Call_MiddleNotSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002512 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002513fn a(i : i32) -> i32 {
2514 return 1;
2515}
2516
2517fn g(a : i32, b : i32, c : i32) -> i32 {
2518 return 1;
2519}
2520
2521
2522fn f() {
2523 var b = 1;
2524 let r = g(a(0), b, a(1));
2525}
2526)";
2527
dan sinclair41e4d9a2022-05-01 14:40:55 +00002528 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002529fn a(i : i32) -> i32 {
2530 return 1;
2531}
2532
2533fn g(a : i32, b : i32, c : i32) -> i32 {
2534 return 1;
2535}
2536
2537fn f() {
2538 var b = 1;
2539 let tint_symbol = a(0);
2540 let tint_symbol_1 = b;
2541 let tint_symbol_2 = a(1);
2542 let r = g(tint_symbol, tint_symbol_1, tint_symbol_2);
2543}
2544)";
2545
dan sinclair41e4d9a2022-05-01 14:40:55 +00002546 DataMap data;
2547 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002548
dan sinclair41e4d9a2022-05-01 14:40:55 +00002549 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002550}
2551
2552TEST_F(PromoteSideEffectsToDeclTest, Call_InBinary) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002553 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002554fn a(i : i32) -> i32 {
2555 return 1;
2556}
2557
2558fn g(i : i32, j : i32, k : i32) -> i32 {
2559 return 1;
2560}
2561
2562fn f() {
2563 var b = 0;
2564 var c = 0;
2565 var d = 0;
2566 let r = b + g(c, a(0), d) + a(1);
2567}
2568)";
2569
dan sinclair41e4d9a2022-05-01 14:40:55 +00002570 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002571fn a(i : i32) -> i32 {
2572 return 1;
2573}
2574
2575fn g(i : i32, j : i32, k : i32) -> i32 {
2576 return 1;
2577}
2578
2579fn f() {
2580 var b = 0;
2581 var c = 0;
2582 var d = 0;
2583 let tint_symbol = b;
2584 let tint_symbol_1 = c;
2585 let tint_symbol_2 = a(0);
2586 let tint_symbol_3 = g(tint_symbol_1, tint_symbol_2, d);
2587 let tint_symbol_4 = a(1);
2588 let r = ((tint_symbol + tint_symbol_3) + tint_symbol_4);
2589}
2590)";
2591
dan sinclair41e4d9a2022-05-01 14:40:55 +00002592 DataMap data;
2593 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002594
dan sinclair41e4d9a2022-05-01 14:40:55 +00002595 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002596}
2597
2598TEST_F(PromoteSideEffectsToDeclTest, IndexAccessor_2D_LeftSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002599 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002600fn a(i : i32) -> i32 {
2601 return 1;
2602}
2603
2604fn f() {
2605 var b = array<array<i32, 10>, 10>();
2606 var c = 1;
2607 var r = b[a(0)][c];
2608}
2609)";
2610
dan sinclair41e4d9a2022-05-01 14:40:55 +00002611 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002612fn a(i : i32) -> i32 {
2613 return 1;
2614}
2615
2616fn f() {
2617 var b = array<array<i32, 10>, 10>();
2618 var c = 1;
2619 let tint_symbol = a(0);
2620 var r = b[tint_symbol][c];
2621}
2622)";
2623
dan sinclair41e4d9a2022-05-01 14:40:55 +00002624 DataMap data;
2625 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002626
dan sinclair41e4d9a2022-05-01 14:40:55 +00002627 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002628}
2629
2630TEST_F(PromoteSideEffectsToDeclTest, IndexAccessor_2D_RightSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002631 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002632fn a(i : i32) -> i32 {
2633 return 1;
2634}
2635
2636fn f() {
2637 var b = array<array<i32, 10>, 10>();
2638 var c = 1;
2639 let tint_symbol = c;
2640 let tint_symbol_1 = a(0);
2641 var r = b[tint_symbol][tint_symbol_1];
2642}
2643)";
2644
dan sinclair41e4d9a2022-05-01 14:40:55 +00002645 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002646fn a(i : i32) -> i32 {
2647 return 1;
2648}
2649
2650fn f() {
2651 var b = array<array<i32, 10>, 10>();
2652 var c = 1;
2653 let tint_symbol = c;
2654 let tint_symbol_1 = a(0);
2655 var r = b[tint_symbol][tint_symbol_1];
2656}
2657)";
2658
dan sinclair41e4d9a2022-05-01 14:40:55 +00002659 DataMap data;
2660 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002661
dan sinclair41e4d9a2022-05-01 14:40:55 +00002662 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002663}
2664
2665TEST_F(PromoteSideEffectsToDeclTest, IndexAccessor_2D_BothSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002666 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002667fn a(i : i32) -> i32 {
2668 return 1;
2669}
2670
2671fn f() {
2672 var b = array<array<i32, 10>, 10>();
2673 var r = b[a(0)][a(1)];
2674}
2675)";
2676
dan sinclair41e4d9a2022-05-01 14:40:55 +00002677 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002678fn a(i : i32) -> i32 {
2679 return 1;
2680}
2681
2682fn f() {
2683 var b = array<array<i32, 10>, 10>();
2684 let tint_symbol = a(0);
2685 let tint_symbol_1 = a(1);
2686 var r = b[tint_symbol][tint_symbol_1];
2687}
2688)";
2689
dan sinclair41e4d9a2022-05-01 14:40:55 +00002690 DataMap data;
2691 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002692
dan sinclair41e4d9a2022-05-01 14:40:55 +00002693 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002694}
2695
2696TEST_F(PromoteSideEffectsToDeclTest, Assignment_ToPhony) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002697 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002698fn a(i : i32) -> i32 {
2699 return 1;
2700}
2701
2702fn f() {
2703 _ = a(0);
2704}
2705)";
2706
dan sinclair41e4d9a2022-05-01 14:40:55 +00002707 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002708fn a(i : i32) -> i32 {
2709 return 1;
2710}
2711
2712fn f() {
2713 _ = a(0);
2714}
2715)";
2716
dan sinclair41e4d9a2022-05-01 14:40:55 +00002717 DataMap data;
2718 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002719
dan sinclair41e4d9a2022-05-01 14:40:55 +00002720 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002721}
2722
2723TEST_F(PromoteSideEffectsToDeclTest, Assignment_ToArray1D) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002724 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002725fn a(i : i32) -> i32 {
2726 return 1;
2727}
2728
2729fn f() {
2730 var b = array<i32, 10>();
2731 b[a(0)] = a(1);
2732}
2733)";
2734
dan sinclair41e4d9a2022-05-01 14:40:55 +00002735 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002736fn a(i : i32) -> i32 {
2737 return 1;
2738}
2739
2740fn f() {
2741 var b = array<i32, 10>();
2742 let tint_symbol = a(1);
2743 let tint_symbol_1 = a(0);
2744 b[tint_symbol_1] = tint_symbol;
2745}
2746)";
2747
dan sinclair41e4d9a2022-05-01 14:40:55 +00002748 DataMap data;
2749 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002750
dan sinclair41e4d9a2022-05-01 14:40:55 +00002751 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002752}
2753
2754TEST_F(PromoteSideEffectsToDeclTest, Assignment_ToArray2D) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002755 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002756fn a(i : i32) -> i32 {
2757 return 1;
2758}
2759
2760fn f() {
2761 var b = array<array<i32, 10>, 10>();
2762 b[a(0)][a(1)] = a(2);
2763}
2764)";
2765
dan sinclair41e4d9a2022-05-01 14:40:55 +00002766 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002767fn a(i : i32) -> i32 {
2768 return 1;
2769}
2770
2771fn f() {
2772 var b = array<array<i32, 10>, 10>();
2773 let tint_symbol = a(2);
2774 let tint_symbol_1 = a(0);
2775 let tint_symbol_2 = a(1);
2776 b[tint_symbol_1][tint_symbol_2] = tint_symbol;
2777}
2778)";
2779
dan sinclair41e4d9a2022-05-01 14:40:55 +00002780 DataMap data;
2781 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002782
dan sinclair41e4d9a2022-05-01 14:40:55 +00002783 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002784}
2785
2786TEST_F(PromoteSideEffectsToDeclTest, Assignment_ToArray3D) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002787 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002788fn a(i : i32) -> i32 {
2789 return 1;
2790}
2791
2792fn f() {
2793 var b = array<array<array<i32, 10>, 10>, 10>();
2794 b[a(0)][a(1)][a(2)] = a(3);
2795}
2796)";
2797
dan sinclair41e4d9a2022-05-01 14:40:55 +00002798 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002799fn a(i : i32) -> i32 {
2800 return 1;
2801}
2802
2803fn f() {
2804 var b = array<array<array<i32, 10>, 10>, 10>();
2805 let tint_symbol = a(3);
2806 let tint_symbol_1 = a(0);
2807 let tint_symbol_2 = a(1);
2808 let tint_symbol_3 = a(2);
2809 b[tint_symbol_1][tint_symbol_2][tint_symbol_3] = tint_symbol;
2810}
2811)";
2812
dan sinclair41e4d9a2022-05-01 14:40:55 +00002813 DataMap data;
2814 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002815
dan sinclair41e4d9a2022-05-01 14:40:55 +00002816 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002817}
2818
2819TEST_F(PromoteSideEffectsToDeclTest, Assignment_ToArray_FromArray) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002820 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002821fn a(i : i32) -> i32 {
2822 return 1;
2823}
2824
2825fn f() {
2826 var b = array<i32, 3>();
2827 var d = array<array<i32, 3>, 3>();
2828 var a_1 = 0;
2829 b[a(2)] = d[a(0)][a_1];
2830}
2831)";
2832
dan sinclair41e4d9a2022-05-01 14:40:55 +00002833 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002834fn a(i : i32) -> i32 {
2835 return 1;
2836}
2837
2838fn f() {
2839 var b = array<i32, 3>();
2840 var d = array<array<i32, 3>, 3>();
2841 var a_1 = 0;
2842 let tint_symbol = a(0);
2843 let tint_symbol_1 = a_1;
2844 let tint_symbol_2 = d[tint_symbol][tint_symbol_1];
2845 let tint_symbol_3 = a(2);
2846 b[tint_symbol_3] = tint_symbol_2;
2847}
2848)";
2849
dan sinclair41e4d9a2022-05-01 14:40:55 +00002850 DataMap data;
2851 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002852
dan sinclair41e4d9a2022-05-01 14:40:55 +00002853 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002854}
2855
2856TEST_F(PromoteSideEffectsToDeclTest, Assignment_ToVec_BothSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002857 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002858fn a(i : i32) -> i32 {
2859 return 1;
2860}
2861
2862fn f() {
2863 var b = vec3<i32>();
2864 b[a(0)] = a(1);
2865}
2866)";
2867
dan sinclair41e4d9a2022-05-01 14:40:55 +00002868 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002869fn a(i : i32) -> i32 {
2870 return 1;
2871}
2872
2873fn f() {
2874 var b = vec3<i32>();
2875 let tint_symbol = a(1);
2876 let tint_symbol_1 = a(0);
2877 b[tint_symbol_1] = tint_symbol;
2878}
2879)";
2880
dan sinclair41e4d9a2022-05-01 14:40:55 +00002881 DataMap data;
2882 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002883
dan sinclair41e4d9a2022-05-01 14:40:55 +00002884 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002885}
2886
2887TEST_F(PromoteSideEffectsToDeclTest, Assignment_ToVec_LeftSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002888 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002889fn a(i : i32) -> i32 {
2890 return 1;
2891}
2892
2893fn f() {
2894 var b = vec3<i32>();
2895 var c = 0;
2896 b[a(0)] = c;
2897}
2898)";
2899
dan sinclair41e4d9a2022-05-01 14:40:55 +00002900 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002901fn a(i : i32) -> i32 {
2902 return 1;
2903}
2904
2905fn f() {
2906 var b = vec3<i32>();
2907 var c = 0;
2908 let tint_symbol = c;
2909 let tint_symbol_1 = a(0);
2910 b[tint_symbol_1] = tint_symbol;
2911}
2912)";
2913
dan sinclair41e4d9a2022-05-01 14:40:55 +00002914 DataMap data;
2915 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002916
dan sinclair41e4d9a2022-05-01 14:40:55 +00002917 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002918}
2919
2920TEST_F(PromoteSideEffectsToDeclTest, Assignment_ToVec_RightSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002921 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002922fn a(i : i32) -> i32 {
2923 return 1;
2924}
2925
2926fn f() {
2927 var b = vec3<i32>();
2928 var c = 0;
2929 b[c] = a(0);
2930}
2931)";
2932
dan sinclair41e4d9a2022-05-01 14:40:55 +00002933 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002934fn a(i : i32) -> i32 {
2935 return 1;
2936}
2937
2938fn f() {
2939 var b = vec3<i32>();
2940 var c = 0;
2941 let tint_symbol = a(0);
2942 b[c] = tint_symbol;
2943}
2944)";
2945
dan sinclair41e4d9a2022-05-01 14:40:55 +00002946 DataMap data;
2947 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002948
dan sinclair41e4d9a2022-05-01 14:40:55 +00002949 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002950}
2951
2952TEST_F(PromoteSideEffectsToDeclTest, TypeConstructor_Struct) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002953 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002954fn a(i : i32) -> i32 {
2955 return 1;
2956}
2957
2958struct S {
James Price3b671cb2022-03-28 14:31:22 +00002959 x : i32,
2960 y : i32,
2961 z : i32,
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002962}
2963
2964fn f() {
2965 var r = S(a(0), a(1), a(2));
2966}
2967)";
2968
dan sinclair41e4d9a2022-05-01 14:40:55 +00002969 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002970fn a(i : i32) -> i32 {
2971 return 1;
2972}
2973
2974struct S {
James Price3b671cb2022-03-28 14:31:22 +00002975 x : i32,
2976 y : i32,
2977 z : i32,
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002978}
2979
2980fn f() {
2981 let tint_symbol = a(0);
2982 let tint_symbol_1 = a(1);
2983 let tint_symbol_2 = a(2);
2984 var r = S(tint_symbol, tint_symbol_1, tint_symbol_2);
2985}
2986)";
2987
dan sinclair41e4d9a2022-05-01 14:40:55 +00002988 DataMap data;
2989 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002990
dan sinclair41e4d9a2022-05-01 14:40:55 +00002991 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002992}
2993
2994TEST_F(PromoteSideEffectsToDeclTest, TypeConstructor_Array1D) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00002995 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00002996fn a(i : i32) -> i32 {
2997 return 1;
2998}
2999
3000fn f() {
3001 var r = array<i32, 3>(a(0), a(1), a(2));
3002}
3003)";
3004
dan sinclair41e4d9a2022-05-01 14:40:55 +00003005 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003006fn a(i : i32) -> i32 {
3007 return 1;
3008}
3009
3010fn f() {
3011 let tint_symbol = a(0);
3012 let tint_symbol_1 = a(1);
3013 let tint_symbol_2 = a(2);
3014 var r = array<i32, 3>(tint_symbol, tint_symbol_1, tint_symbol_2);
3015}
3016)";
3017
dan sinclair41e4d9a2022-05-01 14:40:55 +00003018 DataMap data;
3019 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003020
dan sinclair41e4d9a2022-05-01 14:40:55 +00003021 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003022}
3023
3024TEST_F(PromoteSideEffectsToDeclTest, TypeConstructor_Array2D) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003025 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003026fn a(i : i32) -> i32 {
3027 return 1;
3028}
3029
3030fn f() {
3031 var r = array<array<i32, 2>, 2>(array<i32, 2>(a(0), a(1)), array<i32, 2>(a(2), a(3)));
3032}
3033)";
3034
dan sinclair41e4d9a2022-05-01 14:40:55 +00003035 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003036fn a(i : i32) -> i32 {
3037 return 1;
3038}
3039
3040fn f() {
3041 let tint_symbol = a(0);
3042 let tint_symbol_1 = a(1);
3043 let tint_symbol_2 = array<i32, 2>(tint_symbol, tint_symbol_1);
3044 let tint_symbol_3 = a(2);
3045 let tint_symbol_4 = a(3);
3046 let tint_symbol_5 = array<i32, 2>(tint_symbol_3, tint_symbol_4);
3047 var r = array<array<i32, 2>, 2>(tint_symbol_2, tint_symbol_5);
3048}
3049)";
3050
dan sinclair41e4d9a2022-05-01 14:40:55 +00003051 DataMap data;
3052 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003053
dan sinclair41e4d9a2022-05-01 14:40:55 +00003054 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003055}
3056
3057TEST_F(PromoteSideEffectsToDeclTest, MemberAccessor_Vec) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003058 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003059fn a(i : i32) -> vec3<i32> {
3060 return vec3<i32>();
3061}
3062
3063fn f() {
3064 var r = a(0).x + a(1).y;
3065}
3066)";
3067
dan sinclair41e4d9a2022-05-01 14:40:55 +00003068 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003069fn a(i : i32) -> vec3<i32> {
3070 return vec3<i32>();
3071}
3072
3073fn f() {
3074 let tint_symbol = a(0);
3075 let tint_symbol_1 = a(1);
3076 var r = (tint_symbol.x + tint_symbol_1.y);
3077}
3078)";
3079
dan sinclair41e4d9a2022-05-01 14:40:55 +00003080 DataMap data;
3081 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003082
dan sinclair41e4d9a2022-05-01 14:40:55 +00003083 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003084}
3085
3086TEST_F(PromoteSideEffectsToDeclTest, MemberAccessor_Struct) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003087 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003088struct S {
James Price3b671cb2022-03-28 14:31:22 +00003089 x : i32,
3090 y : i32,
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003091}
3092
3093fn a(i : i32) -> S {
3094 return S();
3095}
3096
3097fn f() {
3098 var r = a(0).x + a(1).y;
3099}
3100)";
3101
dan sinclair41e4d9a2022-05-01 14:40:55 +00003102 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003103struct S {
James Price3b671cb2022-03-28 14:31:22 +00003104 x : i32,
3105 y : i32,
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003106}
3107
3108fn a(i : i32) -> S {
3109 return S();
3110}
3111
3112fn f() {
3113 let tint_symbol = a(0);
3114 let tint_symbol_1 = a(1);
3115 var r = (tint_symbol.x + tint_symbol_1.y);
3116}
3117)";
3118
dan sinclair41e4d9a2022-05-01 14:40:55 +00003119 DataMap data;
3120 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003121
dan sinclair41e4d9a2022-05-01 14:40:55 +00003122 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003123}
3124
3125TEST_F(PromoteSideEffectsToDeclTest, MemberAccessor_Struct_Mixed) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003126 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003127struct S {
James Price3b671cb2022-03-28 14:31:22 +00003128 x : i32,
3129 y : i32,
3130 arr : array<i32, 10>,
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003131}
3132
3133fn a(i : i32) -> S {
3134 return S();
3135}
3136
3137fn b(i : i32) -> i32 {
3138 return 0;
3139}
3140
3141fn f() {
3142 var i = 0;
3143 var j = 0;
3144 var k = 0;
3145 var l = 0;
3146 var m = 0;
3147 var r = a(0).x + i + a(1).y + j + a(2).arr[k + b(3) + l] + m;
3148}
3149)";
3150
dan sinclair41e4d9a2022-05-01 14:40:55 +00003151 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003152struct S {
James Price3b671cb2022-03-28 14:31:22 +00003153 x : i32,
3154 y : i32,
3155 arr : array<i32, 10>,
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003156}
3157
3158fn a(i : i32) -> S {
3159 return S();
3160}
3161
3162fn b(i : i32) -> i32 {
3163 return 0;
3164}
3165
3166fn f() {
3167 var i = 0;
3168 var j = 0;
3169 var k = 0;
3170 var l = 0;
3171 var m = 0;
3172 let tint_symbol = a(0);
3173 let tint_symbol_1 = i;
3174 let tint_symbol_2 = a(1);
3175 let tint_symbol_3 = j;
3176 let tint_symbol_4 = a(2);
3177 let tint_symbol_5 = k;
3178 let tint_symbol_6 = b(3);
3179 var r = (((((tint_symbol.x + tint_symbol_1) + tint_symbol_2.y) + tint_symbol_3) + tint_symbol_4.arr[((tint_symbol_5 + tint_symbol_6) + l)]) + m);
3180}
3181)";
3182
dan sinclair41e4d9a2022-05-01 14:40:55 +00003183 DataMap data;
3184 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003185
dan sinclair41e4d9a2022-05-01 14:40:55 +00003186 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003187}
3188
3189TEST_F(PromoteSideEffectsToDeclTest, IndexAccessor_Plus_SE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003190 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003191fn a(i : i32) -> i32 {
3192 return i;
3193}
3194
3195fn f() {
3196 var v = array<i32, 10>();
3197 let r = v[0] + a(0);
3198}
3199)";
3200
dan sinclair41e4d9a2022-05-01 14:40:55 +00003201 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003202fn a(i : i32) -> i32 {
3203 return i;
3204}
3205
3206fn f() {
3207 var v = array<i32, 10>();
3208 let tint_symbol = v[0];
3209 let tint_symbol_1 = a(0);
3210 let r = (tint_symbol + tint_symbol_1);
3211}
3212)";
3213
dan sinclair41e4d9a2022-05-01 14:40:55 +00003214 DataMap data;
3215 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003216
dan sinclair41e4d9a2022-05-01 14:40:55 +00003217 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003218}
3219
3220TEST_F(PromoteSideEffectsToDeclTest, IndexAccessor_Of_SE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003221 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003222fn a(i : i32) -> i32 {
3223 return i;
3224}
3225
3226fn f() {
3227 var v = array<i32, 10>();
3228 let r = v[a(0)];
3229}
3230)";
3231
dan sinclair41e4d9a2022-05-01 14:40:55 +00003232 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003233fn a(i : i32) -> i32 {
3234 return i;
3235}
3236
3237fn f() {
3238 var v = array<i32, 10>();
3239 let tint_symbol = a(0);
3240 let r = v[tint_symbol];
3241}
3242)";
3243
dan sinclair41e4d9a2022-05-01 14:40:55 +00003244 DataMap data;
3245 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003246
dan sinclair41e4d9a2022-05-01 14:40:55 +00003247 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003248}
3249
3250TEST_F(PromoteSideEffectsToDeclTest, IndexAccessor2_Of_LeftSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003251 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003252fn a(i : i32) -> i32 {
3253 return i;
3254}
3255
3256fn f() {
3257 var v = array<array<i32, 10>, 10>();
3258 let r = v[a(0)][0];
3259}
3260)";
3261
dan sinclair41e4d9a2022-05-01 14:40:55 +00003262 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003263fn a(i : i32) -> i32 {
3264 return i;
3265}
3266
3267fn f() {
3268 var v = array<array<i32, 10>, 10>();
3269 let tint_symbol = a(0);
3270 let r = v[tint_symbol][0];
3271}
3272)";
3273
dan sinclair41e4d9a2022-05-01 14:40:55 +00003274 DataMap data;
3275 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003276
dan sinclair41e4d9a2022-05-01 14:40:55 +00003277 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003278}
3279
3280TEST_F(PromoteSideEffectsToDeclTest, IndexAccessor2_Of_RightSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003281 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003282fn a(i : i32) -> i32 {
3283 return i;
3284}
3285
3286fn f() {
3287 var v = array<array<i32, 10>, 10>();
3288 let r = v[0][a(0)];
3289}
3290)";
3291
dan sinclair41e4d9a2022-05-01 14:40:55 +00003292 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003293fn a(i : i32) -> i32 {
3294 return i;
3295}
3296
3297fn f() {
3298 var v = array<array<i32, 10>, 10>();
3299 let tint_symbol = a(0);
3300 let r = v[0][tint_symbol];
3301}
3302)";
3303
dan sinclair41e4d9a2022-05-01 14:40:55 +00003304 DataMap data;
3305 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003306
dan sinclair41e4d9a2022-05-01 14:40:55 +00003307 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003308}
3309
3310TEST_F(PromoteSideEffectsToDeclTest, IndexAccessor2_Of_SEAndVar) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003311 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003312fn a(i : i32) -> i32 {
3313 return i;
3314}
3315
3316fn f() {
3317 var v = array<array<i32, 10>, 10>();
3318 var b : i32;
3319 let r = v[a(0)][b];
3320}
3321)";
3322
dan sinclair41e4d9a2022-05-01 14:40:55 +00003323 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003324fn a(i : i32) -> i32 {
3325 return i;
3326}
3327
3328fn f() {
3329 var v = array<array<i32, 10>, 10>();
3330 var b : i32;
3331 let tint_symbol = a(0);
3332 let r = v[tint_symbol][b];
3333}
3334)";
3335
dan sinclair41e4d9a2022-05-01 14:40:55 +00003336 DataMap data;
3337 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003338
dan sinclair41e4d9a2022-05-01 14:40:55 +00003339 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003340}
3341
3342TEST_F(PromoteSideEffectsToDeclTest, IndexAccessor2_Of_VarAndSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003343 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003344fn a(i : i32) -> i32 {
3345 return i;
3346}
3347
3348fn f() {
3349 var v = array<array<i32, 10>, 10>();
3350 var b : i32;
3351 let r = v[b][a(0)];
3352}
3353)";
3354
dan sinclair41e4d9a2022-05-01 14:40:55 +00003355 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003356fn a(i : i32) -> i32 {
3357 return i;
3358}
3359
3360fn f() {
3361 var v = array<array<i32, 10>, 10>();
3362 var b : i32;
3363 let tint_symbol = b;
3364 let tint_symbol_1 = a(0);
3365 let r = v[tint_symbol][tint_symbol_1];
3366}
3367)";
3368
dan sinclair41e4d9a2022-05-01 14:40:55 +00003369 DataMap data;
3370 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003371
dan sinclair41e4d9a2022-05-01 14:40:55 +00003372 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003373}
3374
3375TEST_F(PromoteSideEffectsToDeclTest, IndexAccessorOfVar_Plus_SE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003376 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003377fn a(i : i32) -> i32 {
3378 return i;
3379}
3380
3381fn f() {
3382 var v = array<i32, 10>();
3383 var b = 0;
3384 let r = v[b] + a(0);
3385}
3386)";
3387
dan sinclair41e4d9a2022-05-01 14:40:55 +00003388 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003389fn a(i : i32) -> i32 {
3390 return i;
3391}
3392
3393fn f() {
3394 var v = array<i32, 10>();
3395 var b = 0;
3396 let tint_symbol = b;
3397 let tint_symbol_1 = v[tint_symbol];
3398 let tint_symbol_2 = a(0);
3399 let r = (tint_symbol_1 + tint_symbol_2);
3400}
3401)";
3402
dan sinclair41e4d9a2022-05-01 14:40:55 +00003403 DataMap data;
3404 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003405
dan sinclair41e4d9a2022-05-01 14:40:55 +00003406 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003407}
3408
3409TEST_F(PromoteSideEffectsToDeclTest, IndexAccessor_Plus_IndexAccessorOfSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003410 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003411fn a(i : i32) -> i32 {
3412 return i;
3413}
3414
3415fn f() {
3416 var v = array<i32, 10>();
3417 let r = v[0] + v[a(0)];
3418}
3419)";
3420
dan sinclair41e4d9a2022-05-01 14:40:55 +00003421 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003422fn a(i : i32) -> i32 {
3423 return i;
3424}
3425
3426fn f() {
3427 var v = array<i32, 10>();
3428 let tint_symbol = v[0];
3429 let tint_symbol_1 = a(0);
3430 let r = (tint_symbol + v[tint_symbol_1]);
3431}
3432)";
3433
dan sinclair41e4d9a2022-05-01 14:40:55 +00003434 DataMap data;
3435 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003436
dan sinclair41e4d9a2022-05-01 14:40:55 +00003437 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003438}
3439
dan sinclair41e4d9a2022-05-01 14:40:55 +00003440TEST_F(PromoteSideEffectsToDeclTest, AssignTo_IndexAccessorOfIndexAccessorOfSE) {
3441 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003442fn a(i : i32) -> i32 {
3443 return i;
3444}
3445
3446fn f() {
3447 var v = array<i32, 10>();
3448 var w = array<i32, 10>();
3449 v[w[a(0)]] = 1;
3450}
3451)";
3452
dan sinclair41e4d9a2022-05-01 14:40:55 +00003453 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003454fn a(i : i32) -> i32 {
3455 return i;
3456}
3457
3458fn f() {
3459 var v = array<i32, 10>();
3460 var w = array<i32, 10>();
3461 let tint_symbol = a(0);
3462 v[w[tint_symbol]] = 1;
3463}
3464)";
3465
dan sinclair41e4d9a2022-05-01 14:40:55 +00003466 DataMap data;
3467 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003468
dan sinclair41e4d9a2022-05-01 14:40:55 +00003469 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003470}
3471
dan sinclair41e4d9a2022-05-01 14:40:55 +00003472TEST_F(PromoteSideEffectsToDeclTest, AssignTo_IndexAccessorOfIndexAccessorOfLiteralPlusSE) {
3473 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003474fn a(i : i32) -> i32 {
3475 return i;
3476}
3477
3478fn f() {
3479 var v = array<i32, 10>();
3480 var w = array<i32, 10>();
3481 v[w[0] + a(0)] = 1;
3482}
3483)";
3484
dan sinclair41e4d9a2022-05-01 14:40:55 +00003485 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003486fn a(i : i32) -> i32 {
3487 return i;
3488}
3489
3490fn f() {
3491 var v = array<i32, 10>();
3492 var w = array<i32, 10>();
3493 let tint_symbol = w[0];
3494 let tint_symbol_1 = a(0);
3495 v[(tint_symbol + tint_symbol_1)] = 1;
3496}
3497)";
3498
dan sinclair41e4d9a2022-05-01 14:40:55 +00003499 DataMap data;
3500 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003501
dan sinclair41e4d9a2022-05-01 14:40:55 +00003502 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003503}
3504
3505TEST_F(PromoteSideEffectsToDeclTest,
3506 AssignTo_IndexAccessorOfIndexAccessorOfLiteralPlusIndexAccessorOfSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003507 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003508fn a(i : i32) -> i32 {
3509 return i;
3510}
3511
3512fn f() {
3513 var v = array<i32, 10>();
3514 var w = array<i32, 10>();
3515 v[w[0] + w[a(0)]] = 1;
3516}
3517)";
3518
dan sinclair41e4d9a2022-05-01 14:40:55 +00003519 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003520fn a(i : i32) -> i32 {
3521 return i;
3522}
3523
3524fn f() {
3525 var v = array<i32, 10>();
3526 var w = array<i32, 10>();
3527 let tint_symbol = w[0];
3528 let tint_symbol_1 = a(0);
3529 v[(tint_symbol + w[tint_symbol_1])] = 1;
3530}
3531)";
3532
dan sinclair41e4d9a2022-05-01 14:40:55 +00003533 DataMap data;
3534 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003535
dan sinclair41e4d9a2022-05-01 14:40:55 +00003536 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003537}
3538
3539TEST_F(PromoteSideEffectsToDeclTest, IndexAccessorOfLhsSERhsSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003540 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003541fn a(i : i32) -> i32 {
3542 return i;
3543}
3544
3545fn b() -> array<i32, 10> {
3546 return array<i32, 10>();
3547}
3548
3549fn f() {
3550 let r = b()[a(0)];
3551}
3552)";
3553
dan sinclair41e4d9a2022-05-01 14:40:55 +00003554 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003555fn a(i : i32) -> i32 {
3556 return i;
3557}
3558
3559fn b() -> array<i32, 10> {
3560 return array<i32, 10>();
3561}
3562
3563fn f() {
3564 let tint_symbol = b();
3565 let tint_symbol_1 = a(0);
3566 let r = tint_symbol[tint_symbol_1];
3567}
3568)";
3569
dan sinclair41e4d9a2022-05-01 14:40:55 +00003570 DataMap data;
3571 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003572
dan sinclair41e4d9a2022-05-01 14:40:55 +00003573 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003574}
3575
3576TEST_F(PromoteSideEffectsToDeclTest, BinaryIndexAccessorOfLhsSERhsSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003577 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003578fn a(i : i32) -> i32 {
3579 return i;
3580}
3581
3582fn b() -> array<i32, 10> {
3583 return array<i32, 10>();
3584}
3585
3586fn f() {
3587 let r = b()[0] + a(0);
3588}
3589)";
3590
dan sinclair41e4d9a2022-05-01 14:40:55 +00003591 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003592fn a(i : i32) -> i32 {
3593 return i;
3594}
3595
3596fn b() -> array<i32, 10> {
3597 return array<i32, 10>();
3598}
3599
3600fn f() {
3601 let tint_symbol = b();
3602 let tint_symbol_1 = a(0);
3603 let r = (tint_symbol[0] + tint_symbol_1);
3604}
3605)";
3606
dan sinclair41e4d9a2022-05-01 14:40:55 +00003607 DataMap data;
3608 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003609
dan sinclair41e4d9a2022-05-01 14:40:55 +00003610 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003611}
3612
3613TEST_F(PromoteSideEffectsToDeclTest, BinaryMemberAccessorPlusSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003614 // bclayton@'s example:
3615 // https://dawn-review.googlesource.com/c/tint/+/78620/6..8/src/transform/promote_side_effects_to_decl.cc#b490
3616 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003617fn modify_vec(p : ptr<function, vec4<i32>>) -> i32 {
3618 (*p).x = 42;
3619 return 0;
3620}
3621
3622fn f() {
3623 var v = vec4<i32>();
3624 let l = v.x + modify_vec(&v);
3625 // l should be 0, not 42
3626}
3627)";
3628
dan sinclair41e4d9a2022-05-01 14:40:55 +00003629 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003630fn modify_vec(p : ptr<function, vec4<i32>>) -> i32 {
3631 (*(p)).x = 42;
3632 return 0;
3633}
3634
3635fn f() {
3636 var v = vec4<i32>();
3637 let tint_symbol = v.x;
3638 let tint_symbol_1 = modify_vec(&(v));
3639 let l = (tint_symbol + tint_symbol_1);
3640}
3641)";
3642
dan sinclair41e4d9a2022-05-01 14:40:55 +00003643 DataMap data;
3644 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003645
dan sinclair41e4d9a2022-05-01 14:40:55 +00003646 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003647}
3648
3649TEST_F(PromoteSideEffectsToDeclTest, Call_ReadOnlyArgAndSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003650 // Make sure that read-only args don't get hoisted (tex and samp)
3651 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003652@group(1) @binding(1) var tex: texture_2d_array<u32>;
3653@group(1) @binding(2) var samp: sampler;
3654
3655fn get_uv() -> vec2<f32> {
3656 return vec2<f32>(1.0, 2.0);
3657}
3658
3659fn f() {
3660 let r = textureGather(1, tex, samp, get_uv(), 1);
3661}
3662)";
3663
dan sinclair41e4d9a2022-05-01 14:40:55 +00003664 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003665@group(1) @binding(1) var tex : texture_2d_array<u32>;
3666
3667@group(1) @binding(2) var samp : sampler;
3668
3669fn get_uv() -> vec2<f32> {
3670 return vec2<f32>(1.0, 2.0);
3671}
3672
3673fn f() {
3674 let tint_symbol = get_uv();
3675 let r = textureGather(1, tex, samp, tint_symbol, 1);
3676}
3677)";
3678
dan sinclair41e4d9a2022-05-01 14:40:55 +00003679 DataMap data;
3680 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003681
dan sinclair41e4d9a2022-05-01 14:40:55 +00003682 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003683}
3684
3685TEST_F(PromoteSideEffectsToDeclTest, Call_PtrArgAndSE) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003686 // Make sure that read-only args don't get hoisted (tex and samp)
3687 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003688
3689var<private> b : i32 = 0;
3690
3691fn a(i : i32) -> i32 {
3692 b = 42;
3693 return 0;
3694}
3695
3696fn g(i : ptr<private, i32>, j : i32) -> i32 {
3697 return *i;
3698}
3699
3700fn f() {
3701 // a(0) should be hoisted, but not &b
3702 let r = g(&b, a(0));
3703 // r should be 42
3704}
3705)";
3706
dan sinclair41e4d9a2022-05-01 14:40:55 +00003707 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003708var<private> b : i32 = 0;
3709
3710fn a(i : i32) -> i32 {
3711 b = 42;
3712 return 0;
3713}
3714
3715fn g(i : ptr<private, i32>, j : i32) -> i32 {
3716 return *(i);
3717}
3718
3719fn f() {
3720 let tint_symbol = a(0);
3721 let r = g(&(b), tint_symbol);
3722}
3723)";
3724
dan sinclair41e4d9a2022-05-01 14:40:55 +00003725 DataMap data;
3726 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003727
dan sinclair41e4d9a2022-05-01 14:40:55 +00003728 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003729}
3730
3731TEST_F(PromoteSideEffectsToDeclTest, TypeCtor_VarPlusI32CtorPlusVar) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003732 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003733fn f() {
3734 var b = 0;
3735 var c = 0;
3736 var d = 0;
3737 let r = ((b + i32(c)) + d);
3738}
3739)";
3740
dan sinclair41e4d9a2022-05-01 14:40:55 +00003741 auto* expect = src;
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003742
dan sinclair41e4d9a2022-05-01 14:40:55 +00003743 DataMap data;
3744 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003745
dan sinclair41e4d9a2022-05-01 14:40:55 +00003746 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003747}
3748
3749TEST_F(PromoteSideEffectsToDeclTest, Binary_Mixed_ArithPlusLogical) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003750 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003751fn a(i : i32) -> i32 {
3752 return 0;
3753}
3754
3755fn b(i : i32) -> bool {
3756 return true;
3757}
3758
3759fn g(i : bool) -> i32 {
3760 return 0;
3761}
3762
3763fn f() {
3764 let r = a(0) + g(b(1) && b(2));
3765}
3766)";
3767
dan sinclair41e4d9a2022-05-01 14:40:55 +00003768 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003769fn a(i : i32) -> i32 {
3770 return 0;
3771}
3772
3773fn b(i : i32) -> bool {
3774 return true;
3775}
3776
3777fn g(i : bool) -> i32 {
3778 return 0;
3779}
3780
3781fn f() {
3782 let tint_symbol = a(0);
3783 var tint_symbol_1 = b(1);
3784 if (tint_symbol_1) {
3785 tint_symbol_1 = b(2);
3786 }
3787 let tint_symbol_2 = g(tint_symbol_1);
3788 let r = (tint_symbol + tint_symbol_2);
3789}
3790)";
3791
dan sinclair41e4d9a2022-05-01 14:40:55 +00003792 DataMap data;
3793 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003794
dan sinclair41e4d9a2022-05-01 14:40:55 +00003795 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003796}
3797
3798TEST_F(PromoteSideEffectsToDeclTest, Binary_Mixed_LogicalPlusArith) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003799 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003800fn a(i : i32) -> i32 {
3801 return 0;
3802}
3803
3804fn b(i : i32) -> bool {
3805 return true;
3806}
3807
3808fn g(i : bool) -> i32 {
3809 return 0;
3810}
3811
3812fn f() {
3813 let r = g(b(0) && b(1)) + a(2);
3814}
3815)";
3816
dan sinclair41e4d9a2022-05-01 14:40:55 +00003817 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003818fn a(i : i32) -> i32 {
3819 return 0;
3820}
3821
3822fn b(i : i32) -> bool {
3823 return true;
3824}
3825
3826fn g(i : bool) -> i32 {
3827 return 0;
3828}
3829
3830fn f() {
3831 var tint_symbol = b(0);
3832 if (tint_symbol) {
3833 tint_symbol = b(1);
3834 }
3835 let tint_symbol_1 = g(tint_symbol);
3836 let tint_symbol_2 = a(2);
3837 let r = (tint_symbol_1 + tint_symbol_2);
3838}
3839)";
3840
dan sinclair41e4d9a2022-05-01 14:40:55 +00003841 DataMap data;
3842 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003843
dan sinclair41e4d9a2022-05-01 14:40:55 +00003844 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003845}
3846
3847TEST_F(PromoteSideEffectsToDeclTest, Binary_Mixed_ArithAndLogicalArgs) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003848 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003849fn a(i : i32) -> i32 {
3850 return 0;
3851}
3852
3853fn b(i : i32) -> bool {
3854 return true;
3855}
3856
3857fn g(i : i32, j : bool) -> i32 {
3858 return 0;
3859}
3860
3861fn f() {
3862 let r = g(a(0), b(1) && b(2));
3863}
3864)";
3865
dan sinclair41e4d9a2022-05-01 14:40:55 +00003866 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003867fn a(i : i32) -> i32 {
3868 return 0;
3869}
3870
3871fn b(i : i32) -> bool {
3872 return true;
3873}
3874
3875fn g(i : i32, j : bool) -> i32 {
3876 return 0;
3877}
3878
3879fn f() {
3880 let tint_symbol = a(0);
3881 var tint_symbol_1 = b(1);
3882 if (tint_symbol_1) {
3883 tint_symbol_1 = b(2);
3884 }
3885 let r = g(tint_symbol, tint_symbol_1);
3886}
3887)";
3888
dan sinclair41e4d9a2022-05-01 14:40:55 +00003889 DataMap data;
3890 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003891
dan sinclair41e4d9a2022-05-01 14:40:55 +00003892 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003893}
3894
3895TEST_F(PromoteSideEffectsToDeclTest, Binary_Mixed_LogicalAndArithArgs) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003896 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003897fn a(i : i32) -> i32 {
3898 return 0;
3899}
3900
3901fn b(i : i32) -> bool {
3902 return true;
3903}
3904
3905fn g(i : bool, j : i32) -> i32 {
3906 return 0;
3907}
3908
3909fn f() {
3910 let r = g(b(0) && b(1), a(2));
3911}
3912)";
3913
dan sinclair41e4d9a2022-05-01 14:40:55 +00003914 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003915fn a(i : i32) -> i32 {
3916 return 0;
3917}
3918
3919fn b(i : i32) -> bool {
3920 return true;
3921}
3922
3923fn g(i : bool, j : i32) -> i32 {
3924 return 0;
3925}
3926
3927fn f() {
3928 var tint_symbol = b(0);
3929 if (tint_symbol) {
3930 tint_symbol = b(1);
3931 }
3932 let tint_symbol_1 = a(2);
3933 let r = g(tint_symbol, tint_symbol_1);
3934}
3935)";
3936
dan sinclair41e4d9a2022-05-01 14:40:55 +00003937 DataMap data;
3938 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003939
dan sinclair41e4d9a2022-05-01 14:40:55 +00003940 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003941}
3942
3943TEST_F(PromoteSideEffectsToDeclTest, Binary_Mixed_Complex) {
dan sinclair41e4d9a2022-05-01 14:40:55 +00003944 auto* src = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003945fn a(i : i32) -> i32 {
3946 return 0;
3947}
3948
3949fn b(i : i32) -> bool {
3950 return true;
3951}
3952
3953fn c(i : bool) -> i32 {
3954 return 0;
3955}
3956
3957fn g(i : bool, j : i32) -> i32 {
3958 return 0;
3959}
3960
3961fn f() {
3962 let r = a(0) + g(b(1) && b(a(2) + a(3)), a(4)) + a(5);
3963}
3964)";
3965
dan sinclair41e4d9a2022-05-01 14:40:55 +00003966 auto* expect = R"(
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00003967fn a(i : i32) -> i32 {
3968 return 0;
3969}
3970
3971fn b(i : i32) -> bool {
3972 return true;
3973}
3974
3975fn c(i : bool) -> i32 {
3976 return 0;
3977}
3978
3979fn g(i : bool, j : i32) -> i32 {
3980 return 0;
3981}
3982
3983fn f() {
3984 let tint_symbol = a(0);
3985 var tint_symbol_1 = b(1);
3986 if (tint_symbol_1) {
3987 let tint_symbol_2 = a(2);
3988 let tint_symbol_3 = a(3);
3989 tint_symbol_1 = b((tint_symbol_2 + tint_symbol_3));
3990 }
3991 let tint_symbol_4 = a(4);
3992 let tint_symbol_5 = g(tint_symbol_1, tint_symbol_4);
3993 let tint_symbol_6 = a(5);
3994 let r = ((tint_symbol + tint_symbol_5) + tint_symbol_6);
3995}
3996)";
3997
dan sinclair41e4d9a2022-05-01 14:40:55 +00003998 DataMap data;
3999 auto got = Run<PromoteSideEffectsToDecl>(src, data);
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00004000
dan sinclair41e4d9a2022-05-01 14:40:55 +00004001 EXPECT_EQ(expect, str(got));
Antonio Maioranoc25ddf42022-03-15 15:03:03 +00004002}
4003} // namespace
dan sinclairb5599d32022-04-07 16:55:14 +00004004} // namespace tint::transform