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 +; Bound: 62
217 ; Schema: 0
218 OpCapability Shader
219 %1 = OpExtInstImport "GLSL.std.450"
220 OpMemoryModel Logical GLSL450
221 OpEntryPoint GLCompute %4 "main"
222 OpExecutionMode %4 LocalSize 1 1 1
223 OpSource ESSL 310
224 OpName %4 "main"
225 OpName %7 "BufferIn"
226 OpMemberName %7 0 "i"
227 OpName %9 ""
228 OpName %23 "BufferOut"
229 OpMemberName %23 0 "o"
230 OpName %25 ""
231 OpMemberDecorate %7 0 Offset 0
232 OpDecorate %7 Block
233 OpDecorate %9 DescriptorSet 0
234 OpDecorate %9 Binding 0
235 OpMemberDecorate %23 0 Offset 0
236 OpDecorate %23 BufferBlock
237 OpDecorate %25 DescriptorSet 0
238 OpDecorate %25 Binding 1
239 %2 = OpTypeVoid
240 %3 = OpTypeFunction %2
241 %6 = OpTypeInt 32 0
242 %7 = OpTypeStruct %6
243 %8 = OpTypePointer Uniform %7
244 %9 = OpVariable %8 Uniform
245 %10 = OpTypeInt 32 1
246 %11 = OpConstant %10 0
247 %12 = OpTypePointer Uniform %6
248 %23 = OpTypeStruct %6
249 %24 = OpTypePointer Uniform %23
250 %25 = OpVariable %24 Uniform
251 %28 = OpConstant %10 1
252 %34 = OpConstant %6 2
253 %52 = OpConstant %6 1
254 %4 = OpFunction %2 None %3
255 %5 = OpLabel
256 %13 = OpAccessChain %12 %9 %11
257 %14 = OpLoad %6 %13
258 OpSelectionMerge %22 None
259 OpSwitch %14 %21 0 %15 1 %16 2 %17 3 %18 4 %19 5 %20
260 %20 = OpLabel
261 %53 = OpAccessChain %12 %25 %11
262 OpStore %53 %52
263 OpBranch %21
264 %19 = OpLabel
265 %45 = OpAccessChain %12 %25 %11
266 %46 = OpLoad %6 %45
267 %47 = OpAccessChain %12 %25 %11
268 %48 = OpLoad %6 %47
269 %49 = OpIMul %6 %46 %48
270 %50 = OpAccessChain %12 %25 %11
271 OpStore %50 %49
272 OpBranch %22
273 %18 = OpLabel
274 %40 = OpAccessChain %12 %25 %11
275 %41 = OpLoad %6 %40
276 %42 = OpUDiv %6 %41 %34
277 %43 = OpAccessChain %12 %25 %11
278 OpStore %43 %42
279 OpBranch %22
280 %16 = OpLabel
281 %31 = OpAccessChain %12 %25 %11
282 %32 = OpLoad %6 %31
283 %33 = OpISub %6 %32 %28
284 OpStore %31 %33
285 OpBranch %17
286 %17 = OpLabel
287 %35 = OpAccessChain %12 %25 %11
288 %36 = OpLoad %6 %35
289 %37 = OpIMul %6 %36 %34
290 %38 = OpAccessChain %12 %25 %11
291 OpStore %38 %37
292 OpBranch %22
293 %15 = OpLabel
294 %26 = OpAccessChain %12 %25 %11
295 %27 = OpLoad %6 %26
296 %29 = OpIAdd %6 %27 %28
297 OpStore %26 %29
298 OpBranch %22
299 %21 = OpLabel
300 %54 = OpAccessChain %12 %25 %11
301 %55 = OpLoad %6 %54
302 %56 = OpIAdd %6 %55 %34
303 %57 = OpAccessChain %12 %25 %11
304 OpStore %57 %56
305 OpBranch %22
306 %22 = OpLabel
307 OpReturn
308 OpFunctionEnd
309 )";
310 Options options;
311 DoStringDiffTest(kSrc, kDst, kDiff, options);
312 }
313
TEST(DiffTest,ReorderedSwitchBlocksNoDebug)314 TEST(DiffTest, ReorderedSwitchBlocksNoDebug) {
315 constexpr char kSrcNoDebug[] = R"( OpCapability Shader
316 %1 = OpExtInstImport "GLSL.std.450"
317 OpMemoryModel Logical GLSL450
318 OpEntryPoint GLCompute %4 "main"
319 OpExecutionMode %4 LocalSize 1 1 1
320 OpSource ESSL 310
321 OpMemberDecorate %7 0 Offset 0
322 OpDecorate %7 Block
323 OpDecorate %9 DescriptorSet 0
324 OpDecorate %9 Binding 0
325 OpMemberDecorate %23 0 Offset 0
326 OpDecorate %23 BufferBlock
327 OpDecorate %25 DescriptorSet 0
328 OpDecorate %25 Binding 1
329 %2 = OpTypeVoid
330 %3 = OpTypeFunction %2
331 %6 = OpTypeInt 32 0
332 %7 = OpTypeStruct %6
333 %8 = OpTypePointer Uniform %7
334 %9 = OpVariable %8 Uniform
335 %10 = OpTypeInt 32 1
336 %11 = OpConstant %10 0
337 %12 = OpTypePointer Uniform %6
338 %23 = OpTypeStruct %6
339 %24 = OpTypePointer Uniform %23
340 %25 = OpVariable %24 Uniform
341 %28 = OpConstant %10 1
342 %34 = OpConstant %6 2
343 %52 = OpConstant %6 1
344 %4 = OpFunction %2 None %3
345 %5 = OpLabel
346 %13 = OpAccessChain %12 %9 %11
347 %14 = OpLoad %6 %13
348 OpSelectionMerge %22 None
349 OpSwitch %14 %21 0 %15 1 %16 2 %17 3 %18 4 %19 5 %20
350 %21 = OpLabel
351 %54 = OpAccessChain %12 %25 %11
352 %55 = OpLoad %6 %54
353 %56 = OpIAdd %6 %55 %34
354 %57 = OpAccessChain %12 %25 %11
355 OpStore %57 %56
356 OpBranch %22
357 %15 = OpLabel
358 %26 = OpAccessChain %12 %25 %11
359 %27 = OpLoad %6 %26
360 %29 = OpIAdd %6 %27 %28
361 OpStore %26 %29
362 OpBranch %22
363 %16 = OpLabel
364 %31 = OpAccessChain %12 %25 %11
365 %32 = OpLoad %6 %31
366 %33 = OpISub %6 %32 %28
367 OpStore %31 %33
368 OpBranch %17
369 %17 = OpLabel
370 %35 = OpAccessChain %12 %25 %11
371 %36 = OpLoad %6 %35
372 %37 = OpIMul %6 %36 %34
373 %38 = OpAccessChain %12 %25 %11
374 OpStore %38 %37
375 OpBranch %22
376 %18 = OpLabel
377 %40 = OpAccessChain %12 %25 %11
378 %41 = OpLoad %6 %40
379 %42 = OpUDiv %6 %41 %34
380 %43 = OpAccessChain %12 %25 %11
381 OpStore %43 %42
382 OpBranch %22
383 %19 = OpLabel
384 %45 = OpAccessChain %12 %25 %11
385 %46 = OpLoad %6 %45
386 %47 = OpAccessChain %12 %25 %11
387 %48 = OpLoad %6 %47
388 %49 = OpIMul %6 %46 %48
389 %50 = OpAccessChain %12 %25 %11
390 OpStore %50 %49
391 OpBranch %22
392 %20 = OpLabel
393 %53 = OpAccessChain %12 %25 %11
394 OpStore %53 %52
395 OpBranch %21
396 %22 = OpLabel
397 OpReturn
398 OpFunctionEnd
399 )";
400 constexpr char kDstNoDebug[] = R"( OpCapability Shader
401 %1 = OpExtInstImport "GLSL.std.450"
402 OpMemoryModel Logical GLSL450
403 OpEntryPoint GLCompute %4 "main"
404 OpExecutionMode %4 LocalSize 1 1 1
405 OpSource ESSL 310
406 OpMemberDecorate %7 0 Offset 0
407 OpDecorate %7 Block
408 OpDecorate %9 DescriptorSet 0
409 OpDecorate %9 Binding 0
410 OpMemberDecorate %23 0 Offset 0
411 OpDecorate %23 BufferBlock
412 OpDecorate %25 DescriptorSet 0
413 OpDecorate %25 Binding 1
414 %2 = OpTypeVoid
415 %3 = OpTypeFunction %2
416 %6 = OpTypeInt 32 0
417 %7 = OpTypeStruct %6
418 %8 = OpTypePointer Uniform %7
419 %9 = OpVariable %8 Uniform
420 %10 = OpTypeInt 32 1
421 %11 = OpConstant %10 0
422 %12 = OpTypePointer Uniform %6
423 %23 = OpTypeStruct %6
424 %24 = OpTypePointer Uniform %23
425 %25 = OpVariable %24 Uniform
426 %28 = OpConstant %10 1
427 %34 = OpConstant %6 2
428 %52 = OpConstant %6 1
429 %4 = OpFunction %2 None %3
430 %5 = OpLabel
431 %13 = OpAccessChain %12 %9 %11
432 %14 = OpLoad %6 %13
433 OpSelectionMerge %22 None
434 OpSwitch %14 %21 0 %15 1 %16 2 %17 3 %18 4 %19 5 %20
435 %17 = OpLabel
436 %35 = OpAccessChain %12 %25 %11
437 %36 = OpLoad %6 %35
438 %37 = OpIMul %6 %36 %34
439 %38 = OpAccessChain %12 %25 %11
440 OpStore %38 %37
441 OpBranch %22
442 %18 = OpLabel
443 %40 = OpAccessChain %12 %25 %11
444 %41 = OpLoad %6 %40
445 %42 = OpUDiv %6 %41 %34
446 %43 = OpAccessChain %12 %25 %11
447 OpStore %43 %42
448 OpBranch %22
449 %21 = OpLabel
450 %54 = OpAccessChain %12 %25 %11
451 %55 = OpLoad %6 %54
452 %56 = OpIAdd %6 %55 %34
453 %57 = OpAccessChain %12 %25 %11
454 OpStore %57 %56
455 OpBranch %22
456 %20 = OpLabel
457 %53 = OpAccessChain %12 %25 %11
458 OpStore %53 %52
459 OpBranch %21
460 %15 = OpLabel
461 %26 = OpAccessChain %12 %25 %11
462 %27 = OpLoad %6 %26
463 %29 = OpIAdd %6 %27 %28
464 OpStore %26 %29
465 OpBranch %22
466 %19 = OpLabel
467 %45 = OpAccessChain %12 %25 %11
468 %46 = OpLoad %6 %45
469 %47 = OpAccessChain %12 %25 %11
470 %48 = OpLoad %6 %47
471 %49 = OpIMul %6 %46 %48
472 %50 = OpAccessChain %12 %25 %11
473 OpStore %50 %49
474 OpBranch %22
475 %16 = OpLabel
476 %31 = OpAccessChain %12 %25 %11
477 %32 = OpLoad %6 %31
478 %33 = OpISub %6 %32 %28
479 OpStore %31 %33
480 OpBranch %17
481 %22 = OpLabel
482 OpReturn
483 OpFunctionEnd
484 )";
485 constexpr char kDiff[] = R"( ; SPIR-V
486 ; Version: 1.6
487 ; Generator: Khronos SPIR-V Tools Assembler; 0
488 -; Bound: 58
489 +; Bound: 62
490 ; Schema: 0
491 OpCapability Shader
492 %1 = OpExtInstImport "GLSL.std.450"
493 OpMemoryModel Logical GLSL450
494 OpEntryPoint GLCompute %4 "main"
495 OpExecutionMode %4 LocalSize 1 1 1
496 OpSource ESSL 310
497 OpMemberDecorate %7 0 Offset 0
498 OpDecorate %7 Block
499 OpDecorate %9 DescriptorSet 0
500 OpDecorate %9 Binding 0
501 OpMemberDecorate %23 0 Offset 0
502 OpDecorate %23 BufferBlock
503 OpDecorate %25 DescriptorSet 0
504 OpDecorate %25 Binding 1
505 %2 = OpTypeVoid
506 %3 = OpTypeFunction %2
507 %6 = OpTypeInt 32 0
508 %7 = OpTypeStruct %6
509 %8 = OpTypePointer Uniform %7
510 %9 = OpVariable %8 Uniform
511 %10 = OpTypeInt 32 1
512 %11 = OpConstant %10 0
513 %12 = OpTypePointer Uniform %6
514 %23 = OpTypeStruct %6
515 %24 = OpTypePointer Uniform %23
516 %25 = OpVariable %24 Uniform
517 %28 = OpConstant %10 1
518 %34 = OpConstant %6 2
519 %52 = OpConstant %6 1
520 %4 = OpFunction %2 None %3
521 %5 = OpLabel
522 %13 = OpAccessChain %12 %9 %11
523 %14 = OpLoad %6 %13
524 OpSelectionMerge %22 None
525 OpSwitch %14 %21 0 %15 1 %16 2 %17 3 %18 4 %19 5 %20
526 %20 = OpLabel
527 %53 = OpAccessChain %12 %25 %11
528 OpStore %53 %52
529 OpBranch %21
530 %19 = OpLabel
531 %45 = OpAccessChain %12 %25 %11
532 %46 = OpLoad %6 %45
533 %47 = OpAccessChain %12 %25 %11
534 %48 = OpLoad %6 %47
535 %49 = OpIMul %6 %46 %48
536 %50 = OpAccessChain %12 %25 %11
537 OpStore %50 %49
538 OpBranch %22
539 %18 = OpLabel
540 %40 = OpAccessChain %12 %25 %11
541 %41 = OpLoad %6 %40
542 %42 = OpUDiv %6 %41 %34
543 %43 = OpAccessChain %12 %25 %11
544 OpStore %43 %42
545 OpBranch %22
546 %16 = OpLabel
547 %31 = OpAccessChain %12 %25 %11
548 %32 = OpLoad %6 %31
549 %33 = OpISub %6 %32 %28
550 OpStore %31 %33
551 OpBranch %17
552 %17 = OpLabel
553 %35 = OpAccessChain %12 %25 %11
554 %36 = OpLoad %6 %35
555 %37 = OpIMul %6 %36 %34
556 %38 = OpAccessChain %12 %25 %11
557 OpStore %38 %37
558 OpBranch %22
559 %15 = OpLabel
560 %26 = OpAccessChain %12 %25 %11
561 %27 = OpLoad %6 %26
562 %29 = OpIAdd %6 %27 %28
563 OpStore %26 %29
564 OpBranch %22
565 %21 = OpLabel
566 %54 = OpAccessChain %12 %25 %11
567 %55 = OpLoad %6 %54
568 %56 = OpIAdd %6 %55 %34
569 %57 = OpAccessChain %12 %25 %11
570 OpStore %57 %56
571 OpBranch %22
572 %22 = OpLabel
573 OpReturn
574 OpFunctionEnd
575 )";
576 Options options;
577 DoStringDiffTest(kSrcNoDebug, kDstNoDebug, kDiff, options);
578 }
579
580 } // namespace
581 } // namespace diff
582 } // namespace spvtools
583