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