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 many small functions with small differences.
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 %6 "f1("
35 OpName %8 "f2("
36 OpName %10 "f3("
37 OpName %12 "f4("
38 OpName %14 "f5("
39 OpName %17 "BufferOut"
40 OpMemberName %17 0 "o"
41 OpName %19 ""
42 OpName %22 "BufferIn"
43 OpMemberName %22 0 "i"
44 OpName %24 ""
45 OpMemberDecorate %17 0 Offset 0
46 OpDecorate %17 BufferBlock
47 OpDecorate %19 DescriptorSet 0
48 OpDecorate %19 Binding 1
49 OpMemberDecorate %22 0 Offset 0
50 OpDecorate %22 Block
51 OpDecorate %24 DescriptorSet 0
52 OpDecorate %24 Binding 0
53 %2 = OpTypeVoid
54 %3 = OpTypeFunction %2
55 %16 = OpTypeInt 32 0
56 %17 = OpTypeStruct %16
57 %18 = OpTypePointer Uniform %17
58 %19 = OpVariable %18 Uniform
59 %20 = OpTypeInt 32 1
60 %21 = OpConstant %20 0
61 %22 = OpTypeStruct %16
62 %23 = OpTypePointer Uniform %22
63 %24 = OpVariable %23 Uniform
64 %25 = OpTypePointer Uniform %16
65 %31 = OpConstant %20 1
66 %36 = OpConstant %16 2
67 %4 = OpFunction %2 None %3
68 %5 = OpLabel
69 %45 = OpFunctionCall %2 %6
70 %46 = OpFunctionCall %2 %8
71 %47 = OpFunctionCall %2 %10
72 %48 = OpFunctionCall %2 %12
73 %49 = OpFunctionCall %2 %14
74 OpReturn
75 OpFunctionEnd
76 %6 = OpFunction %2 None %3
77 %7 = OpLabel
78 %26 = OpAccessChain %25 %24 %21
79 %27 = OpLoad %16 %26
80 %28 = OpAccessChain %25 %19 %21
81 OpStore %28 %27
82 OpReturn
83 OpFunctionEnd
84 %8 = OpFunction %2 None %3
85 %9 = OpLabel
86 %29 = OpAccessChain %25 %19 %21
87 %30 = OpLoad %16 %29
88 %32 = OpIAdd %16 %30 %31
89 OpStore %29 %32
90 OpReturn
91 OpFunctionEnd
92 %10 = OpFunction %2 None %3
93 %11 = OpLabel
94 %33 = OpAccessChain %25 %19 %21
95 %34 = OpLoad %16 %33
96 %35 = OpISub %16 %34 %31
97 OpStore %33 %35
98 OpReturn
99 OpFunctionEnd
100 %12 = OpFunction %2 None %3
101 %13 = OpLabel
102 %37 = OpAccessChain %25 %19 %21
103 %38 = OpLoad %16 %37
104 %39 = OpIMul %16 %38 %36
105 %40 = OpAccessChain %25 %19 %21
106 OpStore %40 %39
107 OpReturn
108 OpFunctionEnd
109 %14 = OpFunction %2 None %3
110 %15 = OpLabel
111 %41 = OpAccessChain %25 %19 %21
112 %42 = OpLoad %16 %41
113 %43 = OpUDiv %16 %42 %36
114 %44 = OpAccessChain %25 %19 %21
115 OpStore %44 %43
116 OpReturn
117 OpFunctionEnd
118 )";
119 constexpr char kDst[] = R"( OpCapability Shader
120 %1 = OpExtInstImport "GLSL.std.450"
121 OpMemoryModel Logical GLSL450
122 OpEntryPoint GLCompute %4 "main"
123 OpExecutionMode %4 LocalSize 1 1 1
124 OpSource ESSL 310
125 OpName %4 "main"
126 OpName %6 "f1("
127 OpName %8 "f2("
128 OpName %10 "f3("
129 OpName %12 "f4("
130 OpName %14 "f5("
131 OpName %17 "BufferOut"
132 OpMemberName %17 0 "o"
133 OpName %19 ""
134 OpName %22 "BufferIn"
135 OpMemberName %22 0 "i"
136 OpName %24 ""
137 OpMemberDecorate %17 0 Offset 0
138 OpDecorate %17 BufferBlock
139 OpDecorate %19 DescriptorSet 0
140 OpDecorate %19 Binding 1
141 OpMemberDecorate %22 0 Offset 0
142 OpDecorate %22 Block
143 OpDecorate %24 DescriptorSet 0
144 OpDecorate %24 Binding 0
145 %2 = OpTypeVoid
146 %3 = OpTypeFunction %2
147 %16 = OpTypeInt 32 0
148 %17 = OpTypeStruct %16
149 %18 = OpTypePointer Uniform %17
150 %19 = OpVariable %18 Uniform
151 %20 = OpTypeInt 32 1
152 %21 = OpConstant %20 0
153 %22 = OpTypeStruct %16
154 %23 = OpTypePointer Uniform %22
155 %24 = OpVariable %23 Uniform
156 %25 = OpTypePointer Uniform %16
157 %31 = OpConstant %20 1
158 %36 = OpConstant %16 2
159 %6 = OpFunction %2 None %3
160 %7 = OpLabel
161 %26 = OpAccessChain %25 %24 %21
162 %27 = OpLoad %16 %26
163 %28 = OpAccessChain %25 %19 %21
164 OpStore %28 %27
165 OpReturn
166 OpFunctionEnd
167 %14 = OpFunction %2 None %3
168 %15 = OpLabel
169 %41 = OpAccessChain %25 %19 %21
170 %42 = OpLoad %16 %41
171 %43 = OpIAdd %16 %42 %36
172 %44 = OpAccessChain %25 %19 %21
173 OpStore %44 %43
174 OpReturn
175 OpFunctionEnd
176 %8 = OpFunction %2 None %3
177 %9 = OpLabel
178 %29 = OpAccessChain %25 %19 %21
179 %30 = OpLoad %16 %29
180 %32 = OpISub %16 %30 %31
181 OpStore %29 %32
182 OpReturn
183 OpFunctionEnd
184 %10 = OpFunction %2 None %3
185 %11 = OpLabel
186 %33 = OpAccessChain %25 %19 %21
187 %34 = OpLoad %16 %33
188 %35 = OpIAdd %16 %34 %31
189 OpStore %33 %35
190 OpReturn
191 OpFunctionEnd
192 %4 = OpFunction %2 None %3
193 %5 = OpLabel
194 %45 = OpFunctionCall %2 %6
195 %46 = OpFunctionCall %2 %8
196 %47 = OpFunctionCall %2 %10
197 %48 = OpFunctionCall %2 %12
198 %49 = OpFunctionCall %2 %14
199 OpReturn
200 OpFunctionEnd
201 %12 = OpFunction %2 None %3
202 %13 = OpLabel
203 %37 = OpAccessChain %25 %19 %21
204 %38 = OpLoad %16 %37
205 %39 = OpISub %16 %38 %36
206 %40 = OpAccessChain %25 %19 %21
207 OpStore %40 %39
208 OpReturn
209 OpFunctionEnd
210
211 )";
212
TEST(DiffTest,SmallFunctionsSmallDiffs)213 TEST(DiffTest, SmallFunctionsSmallDiffs) {
214 constexpr char kDiff[] = R"( ; SPIR-V
215 ; Version: 1.6
216 ; Generator: Khronos SPIR-V Tools Assembler; 0
217 -; Bound: 50
218 +; Bound: 54
219 ; Schema: 0
220 OpCapability Shader
221 %1 = OpExtInstImport "GLSL.std.450"
222 OpMemoryModel Logical GLSL450
223 OpEntryPoint GLCompute %4 "main"
224 OpExecutionMode %4 LocalSize 1 1 1
225 OpSource ESSL 310
226 OpName %4 "main"
227 OpName %6 "f1("
228 OpName %8 "f2("
229 OpName %10 "f3("
230 OpName %12 "f4("
231 OpName %14 "f5("
232 OpName %17 "BufferOut"
233 OpMemberName %17 0 "o"
234 OpName %19 ""
235 OpName %22 "BufferIn"
236 OpMemberName %22 0 "i"
237 OpName %24 ""
238 OpMemberDecorate %17 0 Offset 0
239 OpDecorate %17 BufferBlock
240 OpDecorate %19 DescriptorSet 0
241 OpDecorate %19 Binding 1
242 OpMemberDecorate %22 0 Offset 0
243 OpDecorate %22 Block
244 OpDecorate %24 DescriptorSet 0
245 OpDecorate %24 Binding 0
246 %2 = OpTypeVoid
247 %3 = OpTypeFunction %2
248 %16 = OpTypeInt 32 0
249 %17 = OpTypeStruct %16
250 %18 = OpTypePointer Uniform %17
251 %19 = OpVariable %18 Uniform
252 %20 = OpTypeInt 32 1
253 %21 = OpConstant %20 0
254 %22 = OpTypeStruct %16
255 %23 = OpTypePointer Uniform %22
256 %24 = OpVariable %23 Uniform
257 %25 = OpTypePointer Uniform %16
258 %31 = OpConstant %20 1
259 %36 = OpConstant %16 2
260 %4 = OpFunction %2 None %3
261 %5 = OpLabel
262 %45 = OpFunctionCall %2 %6
263 %46 = OpFunctionCall %2 %8
264 %47 = OpFunctionCall %2 %10
265 %48 = OpFunctionCall %2 %12
266 %49 = OpFunctionCall %2 %14
267 OpReturn
268 OpFunctionEnd
269 %6 = OpFunction %2 None %3
270 %7 = OpLabel
271 %26 = OpAccessChain %25 %24 %21
272 %27 = OpLoad %16 %26
273 %28 = OpAccessChain %25 %19 %21
274 OpStore %28 %27
275 OpReturn
276 OpFunctionEnd
277 %8 = OpFunction %2 None %3
278 %9 = OpLabel
279 %29 = OpAccessChain %25 %19 %21
280 %30 = OpLoad %16 %29
281 -%32 = OpIAdd %16 %30 %31
282 +%50 = OpISub %16 %30 %31
283 -OpStore %29 %32
284 +OpStore %29 %50
285 OpReturn
286 OpFunctionEnd
287 %10 = OpFunction %2 None %3
288 %11 = OpLabel
289 %33 = OpAccessChain %25 %19 %21
290 %34 = OpLoad %16 %33
291 -%35 = OpISub %16 %34 %31
292 +%51 = OpIAdd %16 %34 %31
293 -OpStore %33 %35
294 +OpStore %33 %51
295 OpReturn
296 OpFunctionEnd
297 %12 = OpFunction %2 None %3
298 %13 = OpLabel
299 %37 = OpAccessChain %25 %19 %21
300 %38 = OpLoad %16 %37
301 -%39 = OpIMul %16 %38 %36
302 +%52 = OpISub %16 %38 %36
303 %40 = OpAccessChain %25 %19 %21
304 -OpStore %40 %39
305 +OpStore %40 %52
306 OpReturn
307 OpFunctionEnd
308 %14 = OpFunction %2 None %3
309 %15 = OpLabel
310 %41 = OpAccessChain %25 %19 %21
311 %42 = OpLoad %16 %41
312 -%43 = OpUDiv %16 %42 %36
313 +%53 = OpIAdd %16 %42 %36
314 %44 = OpAccessChain %25 %19 %21
315 -OpStore %44 %43
316 +OpStore %44 %53
317 OpReturn
318 OpFunctionEnd
319 )";
320 Options options;
321 DoStringDiffTest(kSrc, kDst, kDiff, options);
322 }
323
TEST(DiffTest,SmallFunctionsSmallDiffsNoDebug)324 TEST(DiffTest, SmallFunctionsSmallDiffsNoDebug) {
325 constexpr char kSrcNoDebug[] = R"( OpCapability Shader
326 %1 = OpExtInstImport "GLSL.std.450"
327 OpMemoryModel Logical GLSL450
328 OpEntryPoint GLCompute %4 "main"
329 OpExecutionMode %4 LocalSize 1 1 1
330 OpSource ESSL 310
331 OpMemberDecorate %17 0 Offset 0
332 OpDecorate %17 BufferBlock
333 OpDecorate %19 DescriptorSet 0
334 OpDecorate %19 Binding 1
335 OpMemberDecorate %22 0 Offset 0
336 OpDecorate %22 Block
337 OpDecorate %24 DescriptorSet 0
338 OpDecorate %24 Binding 0
339 %2 = OpTypeVoid
340 %3 = OpTypeFunction %2
341 %16 = OpTypeInt 32 0
342 %17 = OpTypeStruct %16
343 %18 = OpTypePointer Uniform %17
344 %19 = OpVariable %18 Uniform
345 %20 = OpTypeInt 32 1
346 %21 = OpConstant %20 0
347 %22 = OpTypeStruct %16
348 %23 = OpTypePointer Uniform %22
349 %24 = OpVariable %23 Uniform
350 %25 = OpTypePointer Uniform %16
351 %31 = OpConstant %20 1
352 %36 = OpConstant %16 2
353 %4 = OpFunction %2 None %3
354 %5 = OpLabel
355 %45 = OpFunctionCall %2 %6
356 %46 = OpFunctionCall %2 %8
357 %47 = OpFunctionCall %2 %10
358 %48 = OpFunctionCall %2 %12
359 %49 = OpFunctionCall %2 %14
360 OpReturn
361 OpFunctionEnd
362 %6 = OpFunction %2 None %3
363 %7 = OpLabel
364 %26 = OpAccessChain %25 %24 %21
365 %27 = OpLoad %16 %26
366 %28 = OpAccessChain %25 %19 %21
367 OpStore %28 %27
368 OpReturn
369 OpFunctionEnd
370 %8 = OpFunction %2 None %3
371 %9 = OpLabel
372 %29 = OpAccessChain %25 %19 %21
373 %30 = OpLoad %16 %29
374 %32 = OpIAdd %16 %30 %31
375 OpStore %29 %32
376 OpReturn
377 OpFunctionEnd
378 %10 = OpFunction %2 None %3
379 %11 = OpLabel
380 %33 = OpAccessChain %25 %19 %21
381 %34 = OpLoad %16 %33
382 %35 = OpISub %16 %34 %31
383 OpStore %33 %35
384 OpReturn
385 OpFunctionEnd
386 %12 = OpFunction %2 None %3
387 %13 = OpLabel
388 %37 = OpAccessChain %25 %19 %21
389 %38 = OpLoad %16 %37
390 %39 = OpIMul %16 %38 %36
391 %40 = OpAccessChain %25 %19 %21
392 OpStore %40 %39
393 OpReturn
394 OpFunctionEnd
395 %14 = OpFunction %2 None %3
396 %15 = OpLabel
397 %41 = OpAccessChain %25 %19 %21
398 %42 = OpLoad %16 %41
399 %43 = OpUDiv %16 %42 %36
400 %44 = OpAccessChain %25 %19 %21
401 OpStore %44 %43
402 OpReturn
403 OpFunctionEnd
404
405 )";
406 constexpr char kDstNoDebug[] = R"( OpCapability Shader
407 %1 = OpExtInstImport "GLSL.std.450"
408 OpMemoryModel Logical GLSL450
409 OpEntryPoint GLCompute %4 "main"
410 OpExecutionMode %4 LocalSize 1 1 1
411 OpSource ESSL 310
412 OpMemberDecorate %17 0 Offset 0
413 OpDecorate %17 BufferBlock
414 OpDecorate %19 DescriptorSet 0
415 OpDecorate %19 Binding 1
416 OpMemberDecorate %22 0 Offset 0
417 OpDecorate %22 Block
418 OpDecorate %24 DescriptorSet 0
419 OpDecorate %24 Binding 0
420 %2 = OpTypeVoid
421 %3 = OpTypeFunction %2
422 %16 = OpTypeInt 32 0
423 %17 = OpTypeStruct %16
424 %18 = OpTypePointer Uniform %17
425 %19 = OpVariable %18 Uniform
426 %20 = OpTypeInt 32 1
427 %21 = OpConstant %20 0
428 %22 = OpTypeStruct %16
429 %23 = OpTypePointer Uniform %22
430 %24 = OpVariable %23 Uniform
431 %25 = OpTypePointer Uniform %16
432 %31 = OpConstant %20 1
433 %36 = OpConstant %16 2
434 %6 = OpFunction %2 None %3
435 %7 = OpLabel
436 %26 = OpAccessChain %25 %24 %21
437 %27 = OpLoad %16 %26
438 %28 = OpAccessChain %25 %19 %21
439 OpStore %28 %27
440 OpReturn
441 OpFunctionEnd
442 %14 = OpFunction %2 None %3
443 %15 = OpLabel
444 %41 = OpAccessChain %25 %19 %21
445 %42 = OpLoad %16 %41
446 %43 = OpIAdd %16 %42 %36
447 %44 = OpAccessChain %25 %19 %21
448 OpStore %44 %43
449 OpReturn
450 OpFunctionEnd
451 %8 = OpFunction %2 None %3
452 %9 = OpLabel
453 %29 = OpAccessChain %25 %19 %21
454 %30 = OpLoad %16 %29
455 %32 = OpISub %16 %30 %31
456 OpStore %29 %32
457 OpReturn
458 OpFunctionEnd
459 %10 = OpFunction %2 None %3
460 %11 = OpLabel
461 %33 = OpAccessChain %25 %19 %21
462 %34 = OpLoad %16 %33
463 %35 = OpIAdd %16 %34 %31
464 OpStore %33 %35
465 OpReturn
466 OpFunctionEnd
467 %4 = OpFunction %2 None %3
468 %5 = OpLabel
469 %45 = OpFunctionCall %2 %6
470 %46 = OpFunctionCall %2 %8
471 %47 = OpFunctionCall %2 %10
472 %48 = OpFunctionCall %2 %12
473 %49 = OpFunctionCall %2 %14
474 OpReturn
475 OpFunctionEnd
476 %12 = OpFunction %2 None %3
477 %13 = OpLabel
478 %37 = OpAccessChain %25 %19 %21
479 %38 = OpLoad %16 %37
480 %39 = OpISub %16 %38 %36
481 %40 = OpAccessChain %25 %19 %21
482 OpStore %40 %39
483 OpReturn
484 OpFunctionEnd
485
486 )";
487 constexpr char kDiff[] = R"( ; SPIR-V
488 ; Version: 1.6
489 ; Generator: Khronos SPIR-V Tools Assembler; 0
490 -; Bound: 50
491 +; Bound: 52
492 ; Schema: 0
493 OpCapability Shader
494 %1 = OpExtInstImport "GLSL.std.450"
495 OpMemoryModel Logical GLSL450
496 OpEntryPoint GLCompute %4 "main"
497 OpExecutionMode %4 LocalSize 1 1 1
498 OpSource ESSL 310
499 OpMemberDecorate %17 0 Offset 0
500 OpDecorate %17 BufferBlock
501 OpDecorate %19 DescriptorSet 0
502 OpDecorate %19 Binding 1
503 OpMemberDecorate %22 0 Offset 0
504 OpDecorate %22 Block
505 OpDecorate %24 DescriptorSet 0
506 OpDecorate %24 Binding 0
507 %2 = OpTypeVoid
508 %3 = OpTypeFunction %2
509 %16 = OpTypeInt 32 0
510 %17 = OpTypeStruct %16
511 %18 = OpTypePointer Uniform %17
512 %19 = OpVariable %18 Uniform
513 %20 = OpTypeInt 32 1
514 %21 = OpConstant %20 0
515 %22 = OpTypeStruct %16
516 %23 = OpTypePointer Uniform %22
517 %24 = OpVariable %23 Uniform
518 %25 = OpTypePointer Uniform %16
519 %31 = OpConstant %20 1
520 %36 = OpConstant %16 2
521 %4 = OpFunction %2 None %3
522 %5 = OpLabel
523 %45 = OpFunctionCall %2 %6
524 -%46 = OpFunctionCall %2 %8
525 +%46 = OpFunctionCall %2 %10
526 -%47 = OpFunctionCall %2 %10
527 +%47 = OpFunctionCall %2 %8
528 %48 = OpFunctionCall %2 %12
529 %49 = OpFunctionCall %2 %14
530 OpReturn
531 OpFunctionEnd
532 %6 = OpFunction %2 None %3
533 %7 = OpLabel
534 %26 = OpAccessChain %25 %24 %21
535 %27 = OpLoad %16 %26
536 %28 = OpAccessChain %25 %19 %21
537 OpStore %28 %27
538 OpReturn
539 OpFunctionEnd
540 %8 = OpFunction %2 None %3
541 %9 = OpLabel
542 %29 = OpAccessChain %25 %19 %21
543 %30 = OpLoad %16 %29
544 %32 = OpIAdd %16 %30 %31
545 OpStore %29 %32
546 OpReturn
547 OpFunctionEnd
548 %10 = OpFunction %2 None %3
549 %11 = OpLabel
550 %33 = OpAccessChain %25 %19 %21
551 %34 = OpLoad %16 %33
552 %35 = OpISub %16 %34 %31
553 OpStore %33 %35
554 OpReturn
555 OpFunctionEnd
556 %12 = OpFunction %2 None %3
557 %13 = OpLabel
558 %37 = OpAccessChain %25 %19 %21
559 %38 = OpLoad %16 %37
560 -%39 = OpIMul %16 %38 %36
561 +%50 = OpISub %16 %38 %36
562 %40 = OpAccessChain %25 %19 %21
563 -OpStore %40 %39
564 +OpStore %40 %50
565 OpReturn
566 OpFunctionEnd
567 %14 = OpFunction %2 None %3
568 %15 = OpLabel
569 %41 = OpAccessChain %25 %19 %21
570 %42 = OpLoad %16 %41
571 -%43 = OpUDiv %16 %42 %36
572 +%51 = OpIAdd %16 %42 %36
573 %44 = OpAccessChain %25 %19 %21
574 -OpStore %44 %43
575 +OpStore %44 %51
576 OpReturn
577 OpFunctionEnd
578 )";
579 Options options;
580 DoStringDiffTest(kSrcNoDebug, kDstNoDebug, kDiff, options);
581 }
582
TEST(DiffTest,SmallFunctionsSmallDiffsDumpIds)583 TEST(DiffTest, SmallFunctionsSmallDiffsDumpIds) {
584 constexpr char kDiff[] = R"( ; SPIR-V
585 ; Version: 1.6
586 ; Generator: Khronos SPIR-V Tools Assembler; 0
587 -; Bound: 50
588 +; Bound: 54
589 ; Schema: 0
590 OpCapability Shader
591 %1 = OpExtInstImport "GLSL.std.450"
592 OpMemoryModel Logical GLSL450
593 OpEntryPoint GLCompute %4 "main"
594 OpExecutionMode %4 LocalSize 1 1 1
595 OpSource ESSL 310
596 OpName %4 "main"
597 OpName %6 "f1("
598 OpName %8 "f2("
599 OpName %10 "f3("
600 OpName %12 "f4("
601 OpName %14 "f5("
602 OpName %17 "BufferOut"
603 OpMemberName %17 0 "o"
604 OpName %19 ""
605 OpName %22 "BufferIn"
606 OpMemberName %22 0 "i"
607 OpName %24 ""
608 OpMemberDecorate %17 0 Offset 0
609 OpDecorate %17 BufferBlock
610 OpDecorate %19 DescriptorSet 0
611 OpDecorate %19 Binding 1
612 OpMemberDecorate %22 0 Offset 0
613 OpDecorate %22 Block
614 OpDecorate %24 DescriptorSet 0
615 OpDecorate %24 Binding 0
616 %2 = OpTypeVoid
617 %3 = OpTypeFunction %2
618 %16 = OpTypeInt 32 0
619 %17 = OpTypeStruct %16
620 %18 = OpTypePointer Uniform %17
621 %19 = OpVariable %18 Uniform
622 %20 = OpTypeInt 32 1
623 %21 = OpConstant %20 0
624 %22 = OpTypeStruct %16
625 %23 = OpTypePointer Uniform %22
626 %24 = OpVariable %23 Uniform
627 %25 = OpTypePointer Uniform %16
628 %31 = OpConstant %20 1
629 %36 = OpConstant %16 2
630 %4 = OpFunction %2 None %3
631 %5 = OpLabel
632 %45 = OpFunctionCall %2 %6
633 %46 = OpFunctionCall %2 %8
634 %47 = OpFunctionCall %2 %10
635 %48 = OpFunctionCall %2 %12
636 %49 = OpFunctionCall %2 %14
637 OpReturn
638 OpFunctionEnd
639 %6 = OpFunction %2 None %3
640 %7 = OpLabel
641 %26 = OpAccessChain %25 %24 %21
642 %27 = OpLoad %16 %26
643 %28 = OpAccessChain %25 %19 %21
644 OpStore %28 %27
645 OpReturn
646 OpFunctionEnd
647 %8 = OpFunction %2 None %3
648 %9 = OpLabel
649 %29 = OpAccessChain %25 %19 %21
650 %30 = OpLoad %16 %29
651 -%32 = OpIAdd %16 %30 %31
652 +%50 = OpISub %16 %30 %31
653 -OpStore %29 %32
654 +OpStore %29 %50
655 OpReturn
656 OpFunctionEnd
657 %10 = OpFunction %2 None %3
658 %11 = OpLabel
659 %33 = OpAccessChain %25 %19 %21
660 %34 = OpLoad %16 %33
661 -%35 = OpISub %16 %34 %31
662 +%51 = OpIAdd %16 %34 %31
663 -OpStore %33 %35
664 +OpStore %33 %51
665 OpReturn
666 OpFunctionEnd
667 %12 = OpFunction %2 None %3
668 %13 = OpLabel
669 %37 = OpAccessChain %25 %19 %21
670 %38 = OpLoad %16 %37
671 -%39 = OpIMul %16 %38 %36
672 +%52 = OpISub %16 %38 %36
673 %40 = OpAccessChain %25 %19 %21
674 -OpStore %40 %39
675 +OpStore %40 %52
676 OpReturn
677 OpFunctionEnd
678 %14 = OpFunction %2 None %3
679 %15 = OpLabel
680 %41 = OpAccessChain %25 %19 %21
681 %42 = OpLoad %16 %41
682 -%43 = OpUDiv %16 %42 %36
683 +%53 = OpIAdd %16 %42 %36
684 %44 = OpAccessChain %25 %19 %21
685 -OpStore %44 %43
686 +OpStore %44 %53
687 OpReturn
688 OpFunctionEnd
689 Src -> Dst
690 1 -> 1 [ExtInstImport]
691 2 -> 2 [TypeVoid]
692 3 -> 3 [TypeFunction]
693 4 -> 4 [Function]
694 5 -> 5 [Label]
695 6 -> 6 [Function]
696 7 -> 7 [Label]
697 8 -> 8 [Function]
698 9 -> 9 [Label]
699 10 -> 10 [Function]
700 11 -> 11 [Label]
701 12 -> 12 [Function]
702 13 -> 13 [Label]
703 14 -> 14 [Function]
704 15 -> 15 [Label]
705 16 -> 16 [TypeInt]
706 17 -> 17 [TypeStruct]
707 18 -> 18 [TypePointer]
708 19 -> 19 [Variable]
709 20 -> 20 [TypeInt]
710 21 -> 21 [Constant]
711 22 -> 22 [TypeStruct]
712 23 -> 23 [TypePointer]
713 24 -> 24 [Variable]
714 25 -> 25 [TypePointer]
715 26 -> 26 [AccessChain]
716 27 -> 27 [Load]
717 28 -> 28 [AccessChain]
718 29 -> 29 [AccessChain]
719 30 -> 30 [Load]
720 31 -> 31 [Constant]
721 32 -> 50 [IAdd]
722 33 -> 33 [AccessChain]
723 34 -> 34 [Load]
724 35 -> 51 [ISub]
725 36 -> 36 [Constant]
726 37 -> 37 [AccessChain]
727 38 -> 38 [Load]
728 39 -> 52 [IMul]
729 40 -> 40 [AccessChain]
730 41 -> 41 [AccessChain]
731 42 -> 42 [Load]
732 43 -> 53 [UDiv]
733 44 -> 44 [AccessChain]
734 45 -> 45 [FunctionCall]
735 46 -> 46 [FunctionCall]
736 47 -> 47 [FunctionCall]
737 48 -> 48 [FunctionCall]
738 49 -> 49 [FunctionCall]
739 )";
740 Options options;
741 options.dump_id_map = true;
742 DoStringDiffTest(kSrc, kDst, kDiff, options);
743 }
744
745 } // namespace
746 } // namespace diff
747 } // namespace spvtools
748