1 // GENERATED FILE - DO NOT EDIT.
2 // Generated by generate_tests.py
3 //
4 // Copyright (c) 2022 Google LLC.
5 //
6 // Licensed under the Apache License, Version 2.0 (the "License");
7 // you may not use this file except in compliance with the License.
8 // You may obtain a copy of the License at
9 //
10 // http://www.apache.org/licenses/LICENSE-2.0
11 //
12 // Unless required by applicable law or agreed to in writing, software
13 // distributed under the License is distributed on an "AS IS" BASIS,
14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 // See the License for the specific language governing permissions and
16 // limitations under the License.
17
18 #include "../diff_test_utils.h"
19
20 #include "gtest/gtest.h"
21
22 namespace spvtools {
23 namespace diff {
24 namespace {
25
26 // Test where src and dst have cases of a switch in different order.
27 constexpr char kSrc[] = R"( OpCapability Shader
28 %1 = OpExtInstImport "GLSL.std.450"
29 OpMemoryModel Logical GLSL450
30 OpEntryPoint GLCompute %4 "main"
31 OpExecutionMode %4 LocalSize 1 1 1
32 OpSource ESSL 310
33 OpName %4 "main"
34 OpName %7 "BufferIn"
35 OpMemberName %7 0 "i"
36 OpName %9 ""
37 OpName %23 "BufferOut"
38 OpMemberName %23 0 "o"
39 OpName %25 ""
40 OpMemberDecorate %7 0 Offset 0
41 OpDecorate %7 Block
42 OpDecorate %9 DescriptorSet 0
43 OpDecorate %9 Binding 0
44 OpMemberDecorate %23 0 Offset 0
45 OpDecorate %23 BufferBlock
46 OpDecorate %25 DescriptorSet 0
47 OpDecorate %25 Binding 1
48 %2 = OpTypeVoid
49 %3 = OpTypeFunction %2
50 %6 = OpTypeInt 32 0
51 %7 = OpTypeStruct %6
52 %8 = OpTypePointer Uniform %7
53 %9 = OpVariable %8 Uniform
54 %10 = OpTypeInt 32 1
55 %11 = OpConstant %10 0
56 %12 = OpTypePointer Uniform %6
57 %23 = OpTypeStruct %6
58 %24 = OpTypePointer Uniform %23
59 %25 = OpVariable %24 Uniform
60 %28 = OpConstant %10 1
61 %34 = OpConstant %6 2
62 %52 = OpConstant %6 1
63 %4 = OpFunction %2 None %3
64 %5 = OpLabel
65 %13 = OpAccessChain %12 %9 %11
66 %14 = OpLoad %6 %13
67 OpSelectionMerge %22 None
68 OpSwitch %14 %21 0 %15 1 %16 2 %17 3 %18 4 %19 5 %20
69 %21 = OpLabel
70 %54 = OpAccessChain %12 %25 %11
71 %55 = OpLoad %6 %54
72 %56 = OpIAdd %6 %55 %34
73 %57 = OpAccessChain %12 %25 %11
74 OpStore %57 %56
75 OpBranch %22
76 %15 = OpLabel
77 %26 = OpAccessChain %12 %25 %11
78 %27 = OpLoad %6 %26
79 %29 = OpIAdd %6 %27 %28
80 OpStore %26 %29
81 OpBranch %22
82 %16 = OpLabel
83 %31 = OpAccessChain %12 %25 %11
84 %32 = OpLoad %6 %31
85 %33 = OpISub %6 %32 %28
86 OpStore %31 %33
87 OpBranch %17
88 %17 = OpLabel
89 %35 = OpAccessChain %12 %25 %11
90 %36 = OpLoad %6 %35
91 %37 = OpIMul %6 %36 %34
92 %38 = OpAccessChain %12 %25 %11
93 OpStore %38 %37
94 OpBranch %22
95 %18 = OpLabel
96 %40 = OpAccessChain %12 %25 %11
97 %41 = OpLoad %6 %40
98 %42 = OpUDiv %6 %41 %34
99 %43 = OpAccessChain %12 %25 %11
100 OpStore %43 %42
101 OpBranch %22
102 %19 = OpLabel
103 %45 = OpAccessChain %12 %25 %11
104 %46 = OpLoad %6 %45
105 %47 = OpAccessChain %12 %25 %11
106 %48 = OpLoad %6 %47
107 %49 = OpIMul %6 %46 %48
108 %50 = OpAccessChain %12 %25 %11
109 OpStore %50 %49
110 OpBranch %22
111 %20 = OpLabel
112 %53 = OpAccessChain %12 %25 %11
113 OpStore %53 %52
114 OpBranch %21
115 %22 = OpLabel
116 OpReturn
117 OpFunctionEnd)";
118 constexpr char kDst[] = R"( OpCapability Shader
119 %1 = OpExtInstImport "GLSL.std.450"
120 OpMemoryModel Logical GLSL450
121 OpEntryPoint GLCompute %4 "main"
122 OpExecutionMode %4 LocalSize 1 1 1
123 OpSource ESSL 310
124 OpName %4 "main"
125 OpName %7 "BufferIn"
126 OpMemberName %7 0 "i"
127 OpName %9 ""
128 OpName %23 "BufferOut"
129 OpMemberName %23 0 "o"
130 OpName %25 ""
131 OpMemberDecorate %7 0 Offset 0
132 OpDecorate %7 Block
133 OpDecorate %9 DescriptorSet 0
134 OpDecorate %9 Binding 0
135 OpMemberDecorate %23 0 Offset 0
136 OpDecorate %23 BufferBlock
137 OpDecorate %25 DescriptorSet 0
138 OpDecorate %25 Binding 1
139 %2 = OpTypeVoid
140 %3 = OpTypeFunction %2
141 %6 = OpTypeInt 32 0
142 %7 = OpTypeStruct %6
143 %8 = OpTypePointer Uniform %7
144 %9 = OpVariable %8 Uniform
145 %10 = OpTypeInt 32 1
146 %11 = OpConstant %10 0
147 %12 = OpTypePointer Uniform %6
148 %23 = OpTypeStruct %6
149 %24 = OpTypePointer Uniform %23
150 %25 = OpVariable %24 Uniform
151 %28 = OpConstant %10 1
152 %34 = OpConstant %6 2
153 %52 = OpConstant %6 1
154 %4 = OpFunction %2 None %3
155 %5 = OpLabel
156 %13 = OpAccessChain %12 %9 %11
157 %14 = OpLoad %6 %13
158 OpSelectionMerge %22 None
159 OpSwitch %14 %21 0 %15 1 %16 2 %17 3 %18 4 %19 5 %20
160 %17 = OpLabel
161 %35 = OpAccessChain %12 %25 %11
162 %36 = OpLoad %6 %35
163 %37 = OpIMul %6 %36 %34
164 %38 = OpAccessChain %12 %25 %11
165 OpStore %38 %37
166 OpBranch %22
167 %18 = OpLabel
168 %40 = OpAccessChain %12 %25 %11
169 %41 = OpLoad %6 %40
170 %42 = OpUDiv %6 %41 %34
171 %43 = OpAccessChain %12 %25 %11
172 OpStore %43 %42
173 OpBranch %22
174 %21 = OpLabel
175 %54 = OpAccessChain %12 %25 %11
176 %55 = OpLoad %6 %54
177 %56 = OpIAdd %6 %55 %34
178 %57 = OpAccessChain %12 %25 %11
179 OpStore %57 %56
180 OpBranch %22
181 %20 = OpLabel
182 %53 = OpAccessChain %12 %25 %11
183 OpStore %53 %52
184 OpBranch %21
185 %15 = OpLabel
186 %26 = OpAccessChain %12 %25 %11
187 %27 = OpLoad %6 %26
188 %29 = OpIAdd %6 %27 %28
189 OpStore %26 %29
190 OpBranch %22
191 %19 = OpLabel
192 %45 = OpAccessChain %12 %25 %11
193 %46 = OpLoad %6 %45
194 %47 = OpAccessChain %12 %25 %11
195 %48 = OpLoad %6 %47
196 %49 = OpIMul %6 %46 %48
197 %50 = OpAccessChain %12 %25 %11
198 OpStore %50 %49
199 OpBranch %22
200 %16 = OpLabel
201 %31 = OpAccessChain %12 %25 %11
202 %32 = OpLoad %6 %31
203 %33 = OpISub %6 %32 %28
204 OpStore %31 %33
205 OpBranch %17
206 %22 = OpLabel
207 OpReturn
208 OpFunctionEnd
209 )";
210
TEST(DiffTest,ReorderedSwitchBlocks)211 TEST(DiffTest, ReorderedSwitchBlocks) {
212 constexpr char kDiff[] = R"( ; SPIR-V
213 ; Version: 1.6
214 ; Generator: Khronos SPIR-V Tools Assembler; 0
215 ; Bound: 58
216 ; Schema: 0
217 OpCapability Shader
218 %1 = OpExtInstImport "GLSL.std.450"
219 OpMemoryModel Logical GLSL450
220 OpEntryPoint GLCompute %4 "main"
221 OpExecutionMode %4 LocalSize 1 1 1
222 OpSource ESSL 310
223 OpName %4 "main"
224 OpName %7 "BufferIn"
225 OpMemberName %7 0 "i"
226 OpName %9 ""
227 OpName %23 "BufferOut"
228 OpMemberName %23 0 "o"
229 OpName %25 ""
230 OpMemberDecorate %7 0 Offset 0
231 OpDecorate %7 Block
232 OpDecorate %9 DescriptorSet 0
233 OpDecorate %9 Binding 0
234 OpMemberDecorate %23 0 Offset 0
235 OpDecorate %23 BufferBlock
236 OpDecorate %25 DescriptorSet 0
237 OpDecorate %25 Binding 1
238 %2 = OpTypeVoid
239 %3 = OpTypeFunction %2
240 %6 = OpTypeInt 32 0
241 %7 = OpTypeStruct %6
242 %8 = OpTypePointer Uniform %7
243 %9 = OpVariable %8 Uniform
244 %10 = OpTypeInt 32 1
245 %11 = OpConstant %10 0
246 %12 = OpTypePointer Uniform %6
247 %23 = OpTypeStruct %6
248 %24 = OpTypePointer Uniform %23
249 %25 = OpVariable %24 Uniform
250 %28 = OpConstant %10 1
251 %34 = OpConstant %6 2
252 %52 = OpConstant %6 1
253 %4 = OpFunction %2 None %3
254 %5 = OpLabel
255 %13 = OpAccessChain %12 %9 %11
256 %14 = OpLoad %6 %13
257 OpSelectionMerge %22 None
258 OpSwitch %14 %21 0 %15 1 %16 2 %17 3 %18 4 %19 5 %20
259 %20 = OpLabel
260 %53 = OpAccessChain %12 %25 %11
261 OpStore %53 %52
262 OpBranch %21
263 %19 = OpLabel
264 %45 = OpAccessChain %12 %25 %11
265 %46 = OpLoad %6 %45
266 %47 = OpAccessChain %12 %25 %11
267 %48 = OpLoad %6 %47
268 %49 = OpIMul %6 %46 %48
269 %50 = OpAccessChain %12 %25 %11
270 OpStore %50 %49
271 OpBranch %22
272 %18 = OpLabel
273 %40 = OpAccessChain %12 %25 %11
274 %41 = OpLoad %6 %40
275 %42 = OpUDiv %6 %41 %34
276 %43 = OpAccessChain %12 %25 %11
277 OpStore %43 %42
278 OpBranch %22
279 %16 = OpLabel
280 %31 = OpAccessChain %12 %25 %11
281 %32 = OpLoad %6 %31
282 %33 = OpISub %6 %32 %28
283 OpStore %31 %33
284 OpBranch %17
285 %17 = OpLabel
286 %35 = OpAccessChain %12 %25 %11
287 %36 = OpLoad %6 %35
288 %37 = OpIMul %6 %36 %34
289 %38 = OpAccessChain %12 %25 %11
290 OpStore %38 %37
291 OpBranch %22
292 %15 = OpLabel
293 %26 = OpAccessChain %12 %25 %11
294 %27 = OpLoad %6 %26
295 %29 = OpIAdd %6 %27 %28
296 OpStore %26 %29
297 OpBranch %22
298 %21 = OpLabel
299 %54 = OpAccessChain %12 %25 %11
300 %55 = OpLoad %6 %54
301 %56 = OpIAdd %6 %55 %34
302 %57 = OpAccessChain %12 %25 %11
303 OpStore %57 %56
304 OpBranch %22
305 %22 = OpLabel
306 OpReturn
307 OpFunctionEnd
308 )";
309 Options options;
310 DoStringDiffTest(kSrc, kDst, kDiff, options);
311 }
312
TEST(DiffTest,ReorderedSwitchBlocksNoDebug)313 TEST(DiffTest, ReorderedSwitchBlocksNoDebug) {
314 constexpr char kSrcNoDebug[] = R"( OpCapability Shader
315 %1 = OpExtInstImport "GLSL.std.450"
316 OpMemoryModel Logical GLSL450
317 OpEntryPoint GLCompute %4 "main"
318 OpExecutionMode %4 LocalSize 1 1 1
319 OpSource ESSL 310
320 OpMemberDecorate %7 0 Offset 0
321 OpDecorate %7 Block
322 OpDecorate %9 DescriptorSet 0
323 OpDecorate %9 Binding 0
324 OpMemberDecorate %23 0 Offset 0
325 OpDecorate %23 BufferBlock
326 OpDecorate %25 DescriptorSet 0
327 OpDecorate %25 Binding 1
328 %2 = OpTypeVoid
329 %3 = OpTypeFunction %2
330 %6 = OpTypeInt 32 0
331 %7 = OpTypeStruct %6
332 %8 = OpTypePointer Uniform %7
333 %9 = OpVariable %8 Uniform
334 %10 = OpTypeInt 32 1
335 %11 = OpConstant %10 0
336 %12 = OpTypePointer Uniform %6
337 %23 = OpTypeStruct %6
338 %24 = OpTypePointer Uniform %23
339 %25 = OpVariable %24 Uniform
340 %28 = OpConstant %10 1
341 %34 = OpConstant %6 2
342 %52 = OpConstant %6 1
343 %4 = OpFunction %2 None %3
344 %5 = OpLabel
345 %13 = OpAccessChain %12 %9 %11
346 %14 = OpLoad %6 %13
347 OpSelectionMerge %22 None
348 OpSwitch %14 %21 0 %15 1 %16 2 %17 3 %18 4 %19 5 %20
349 %21 = OpLabel
350 %54 = OpAccessChain %12 %25 %11
351 %55 = OpLoad %6 %54
352 %56 = OpIAdd %6 %55 %34
353 %57 = OpAccessChain %12 %25 %11
354 OpStore %57 %56
355 OpBranch %22
356 %15 = OpLabel
357 %26 = OpAccessChain %12 %25 %11
358 %27 = OpLoad %6 %26
359 %29 = OpIAdd %6 %27 %28
360 OpStore %26 %29
361 OpBranch %22
362 %16 = OpLabel
363 %31 = OpAccessChain %12 %25 %11
364 %32 = OpLoad %6 %31
365 %33 = OpISub %6 %32 %28
366 OpStore %31 %33
367 OpBranch %17
368 %17 = OpLabel
369 %35 = OpAccessChain %12 %25 %11
370 %36 = OpLoad %6 %35
371 %37 = OpIMul %6 %36 %34
372 %38 = OpAccessChain %12 %25 %11
373 OpStore %38 %37
374 OpBranch %22
375 %18 = OpLabel
376 %40 = OpAccessChain %12 %25 %11
377 %41 = OpLoad %6 %40
378 %42 = OpUDiv %6 %41 %34
379 %43 = OpAccessChain %12 %25 %11
380 OpStore %43 %42
381 OpBranch %22
382 %19 = OpLabel
383 %45 = OpAccessChain %12 %25 %11
384 %46 = OpLoad %6 %45
385 %47 = OpAccessChain %12 %25 %11
386 %48 = OpLoad %6 %47
387 %49 = OpIMul %6 %46 %48
388 %50 = OpAccessChain %12 %25 %11
389 OpStore %50 %49
390 OpBranch %22
391 %20 = OpLabel
392 %53 = OpAccessChain %12 %25 %11
393 OpStore %53 %52
394 OpBranch %21
395 %22 = OpLabel
396 OpReturn
397 OpFunctionEnd
398 )";
399 constexpr char kDstNoDebug[] = R"( OpCapability Shader
400 %1 = OpExtInstImport "GLSL.std.450"
401 OpMemoryModel Logical GLSL450
402 OpEntryPoint GLCompute %4 "main"
403 OpExecutionMode %4 LocalSize 1 1 1
404 OpSource ESSL 310
405 OpMemberDecorate %7 0 Offset 0
406 OpDecorate %7 Block
407 OpDecorate %9 DescriptorSet 0
408 OpDecorate %9 Binding 0
409 OpMemberDecorate %23 0 Offset 0
410 OpDecorate %23 BufferBlock
411 OpDecorate %25 DescriptorSet 0
412 OpDecorate %25 Binding 1
413 %2 = OpTypeVoid
414 %3 = OpTypeFunction %2
415 %6 = OpTypeInt 32 0
416 %7 = OpTypeStruct %6
417 %8 = OpTypePointer Uniform %7
418 %9 = OpVariable %8 Uniform
419 %10 = OpTypeInt 32 1
420 %11 = OpConstant %10 0
421 %12 = OpTypePointer Uniform %6
422 %23 = OpTypeStruct %6
423 %24 = OpTypePointer Uniform %23
424 %25 = OpVariable %24 Uniform
425 %28 = OpConstant %10 1
426 %34 = OpConstant %6 2
427 %52 = OpConstant %6 1
428 %4 = OpFunction %2 None %3
429 %5 = OpLabel
430 %13 = OpAccessChain %12 %9 %11
431 %14 = OpLoad %6 %13
432 OpSelectionMerge %22 None
433 OpSwitch %14 %21 0 %15 1 %16 2 %17 3 %18 4 %19 5 %20
434 %17 = OpLabel
435 %35 = OpAccessChain %12 %25 %11
436 %36 = OpLoad %6 %35
437 %37 = OpIMul %6 %36 %34
438 %38 = OpAccessChain %12 %25 %11
439 OpStore %38 %37
440 OpBranch %22
441 %18 = OpLabel
442 %40 = OpAccessChain %12 %25 %11
443 %41 = OpLoad %6 %40
444 %42 = OpUDiv %6 %41 %34
445 %43 = OpAccessChain %12 %25 %11
446 OpStore %43 %42
447 OpBranch %22
448 %21 = OpLabel
449 %54 = OpAccessChain %12 %25 %11
450 %55 = OpLoad %6 %54
451 %56 = OpIAdd %6 %55 %34
452 %57 = OpAccessChain %12 %25 %11
453 OpStore %57 %56
454 OpBranch %22
455 %20 = OpLabel
456 %53 = OpAccessChain %12 %25 %11
457 OpStore %53 %52
458 OpBranch %21
459 %15 = OpLabel
460 %26 = OpAccessChain %12 %25 %11
461 %27 = OpLoad %6 %26
462 %29 = OpIAdd %6 %27 %28
463 OpStore %26 %29
464 OpBranch %22
465 %19 = OpLabel
466 %45 = OpAccessChain %12 %25 %11
467 %46 = OpLoad %6 %45
468 %47 = OpAccessChain %12 %25 %11
469 %48 = OpLoad %6 %47
470 %49 = OpIMul %6 %46 %48
471 %50 = OpAccessChain %12 %25 %11
472 OpStore %50 %49
473 OpBranch %22
474 %16 = OpLabel
475 %31 = OpAccessChain %12 %25 %11
476 %32 = OpLoad %6 %31
477 %33 = OpISub %6 %32 %28
478 OpStore %31 %33
479 OpBranch %17
480 %22 = OpLabel
481 OpReturn
482 OpFunctionEnd
483 )";
484 constexpr char kDiff[] = R"( ; SPIR-V
485 ; Version: 1.6
486 ; Generator: Khronos SPIR-V Tools Assembler; 0
487 ; Bound: 58
488 ; Schema: 0
489 OpCapability Shader
490 %1 = OpExtInstImport "GLSL.std.450"
491 OpMemoryModel Logical GLSL450
492 OpEntryPoint GLCompute %4 "main"
493 OpExecutionMode %4 LocalSize 1 1 1
494 OpSource ESSL 310
495 OpMemberDecorate %7 0 Offset 0
496 OpDecorate %7 Block
497 OpDecorate %9 DescriptorSet 0
498 OpDecorate %9 Binding 0
499 OpMemberDecorate %23 0 Offset 0
500 OpDecorate %23 BufferBlock
501 OpDecorate %25 DescriptorSet 0
502 OpDecorate %25 Binding 1
503 %2 = OpTypeVoid
504 %3 = OpTypeFunction %2
505 %6 = OpTypeInt 32 0
506 %7 = OpTypeStruct %6
507 %8 = OpTypePointer Uniform %7
508 %9 = OpVariable %8 Uniform
509 %10 = OpTypeInt 32 1
510 %11 = OpConstant %10 0
511 %12 = OpTypePointer Uniform %6
512 %23 = OpTypeStruct %6
513 %24 = OpTypePointer Uniform %23
514 %25 = OpVariable %24 Uniform
515 %28 = OpConstant %10 1
516 %34 = OpConstant %6 2
517 %52 = OpConstant %6 1
518 %4 = OpFunction %2 None %3
519 %5 = OpLabel
520 %13 = OpAccessChain %12 %9 %11
521 %14 = OpLoad %6 %13
522 OpSelectionMerge %22 None
523 OpSwitch %14 %21 0 %15 1 %16 2 %17 3 %18 4 %19 5 %20
524 %20 = OpLabel
525 %53 = OpAccessChain %12 %25 %11
526 OpStore %53 %52
527 OpBranch %21
528 %19 = OpLabel
529 %45 = OpAccessChain %12 %25 %11
530 %46 = OpLoad %6 %45
531 %47 = OpAccessChain %12 %25 %11
532 %48 = OpLoad %6 %47
533 %49 = OpIMul %6 %46 %48
534 %50 = OpAccessChain %12 %25 %11
535 OpStore %50 %49
536 OpBranch %22
537 %18 = OpLabel
538 %40 = OpAccessChain %12 %25 %11
539 %41 = OpLoad %6 %40
540 %42 = OpUDiv %6 %41 %34
541 %43 = OpAccessChain %12 %25 %11
542 OpStore %43 %42
543 OpBranch %22
544 %16 = OpLabel
545 %31 = OpAccessChain %12 %25 %11
546 %32 = OpLoad %6 %31
547 %33 = OpISub %6 %32 %28
548 OpStore %31 %33
549 OpBranch %17
550 %17 = OpLabel
551 %35 = OpAccessChain %12 %25 %11
552 %36 = OpLoad %6 %35
553 %37 = OpIMul %6 %36 %34
554 %38 = OpAccessChain %12 %25 %11
555 OpStore %38 %37
556 OpBranch %22
557 %15 = OpLabel
558 %26 = OpAccessChain %12 %25 %11
559 %27 = OpLoad %6 %26
560 %29 = OpIAdd %6 %27 %28
561 OpStore %26 %29
562 OpBranch %22
563 %21 = OpLabel
564 %54 = OpAccessChain %12 %25 %11
565 %55 = OpLoad %6 %54
566 %56 = OpIAdd %6 %55 %34
567 %57 = OpAccessChain %12 %25 %11
568 OpStore %57 %56
569 OpBranch %22
570 %22 = OpLabel
571 OpReturn
572 OpFunctionEnd
573 )";
574 Options options;
575 DoStringDiffTest(kSrcNoDebug, kDstNoDebug, kDiff, options);
576 }
577
578 } // namespace
579 } // namespace diff
580 } // namespace spvtools
581