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 a few large 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" %15
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 %12 "x"
37 OpName %15 "gl_LocalInvocationID"
38 OpName %20 "y"
39 OpName %27 "image"
40 OpName %44 "sum"
41 OpName %46 "i"
42 OpName %56 "j"
43 OpName %80 "BufferOut"
44 OpMemberName %80 0 "o_uv4"
45 OpMemberName %80 1 "o_v3"
46 OpMemberName %80 2 "o_i"
47 OpName %82 ""
48 OpName %88 "BufferIn"
49 OpMemberName %88 0 "i_u"
50 OpMemberName %88 1 "i_v4"
51 OpMemberName %88 2 "i_f"
52 OpName %90 ""
53 OpName %101 "i"
54 OpDecorate %15 BuiltIn LocalInvocationId
55 OpDecorate %27 DescriptorSet 0
56 OpDecorate %27 Binding 2
57 OpMemberDecorate %80 0 Offset 0
58 OpMemberDecorate %80 1 Offset 16
59 OpMemberDecorate %80 2 Offset 28
60 OpDecorate %80 BufferBlock
61 OpDecorate %82 DescriptorSet 0
62 OpDecorate %82 Binding 1
63 OpMemberDecorate %88 0 Offset 0
64 OpMemberDecorate %88 1 RowMajor
65 OpMemberDecorate %88 1 Offset 16
66 OpMemberDecorate %88 1 MatrixStride 16
67 OpMemberDecorate %88 2 Offset 80
68 OpDecorate %88 Block
69 OpDecorate %90 DescriptorSet 0
70 OpDecorate %90 Binding 0
71 %2 = OpTypeVoid
72 %3 = OpTypeFunction %2
73 %10 = OpTypeInt 32 0
74 %11 = OpTypePointer Function %10
75 %13 = OpTypeVector %10 3
76 %14 = OpTypePointer Input %13
77 %15 = OpVariable %14 Input
78 %16 = OpConstant %10 0
79 %17 = OpTypePointer Input %10
80 %21 = OpConstant %10 1
81 %24 = OpTypeInt 32 1
82 %25 = OpTypeImage %24 2D 0 0 0 2 R32i
83 %26 = OpTypePointer UniformConstant %25
84 %27 = OpVariable %26 UniformConstant
85 %29 = OpTypeVector %10 2
86 %32 = OpTypeVector %24 2
87 %38 = OpTypeVector %24 4
88 %40 = OpConstant %10 2
89 %41 = OpConstant %10 3400
90 %42 = OpConstant %10 264
91 %43 = OpTypePointer Function %24
92 %45 = OpConstant %24 0
93 %53 = OpConstant %24 2
94 %54 = OpTypeBool
95 %73 = OpConstant %24 1
96 %77 = OpTypeVector %10 4
97 %78 = OpTypeFloat 32
98 %79 = OpTypeVector %78 3
99 %80 = OpTypeStruct %77 %79 %24
100 %81 = OpTypePointer Uniform %80
101 %82 = OpVariable %81 Uniform
102 %84 = OpTypePointer Uniform %24
103 %86 = OpTypeVector %78 4
104 %87 = OpTypeMatrix %86 4
105 %88 = OpTypeStruct %10 %87 %78
106 %89 = OpTypePointer Uniform %88
107 %90 = OpVariable %89 Uniform
108 %91 = OpTypePointer Uniform %87
109 %94 = OpTypePointer Uniform %77
110 %108 = OpConstant %24 3
111 %110 = OpTypePointer Uniform %79
112 %113 = OpTypePointer Uniform %78
113 %129 = OpConstantComposite %32 %45 %45
114 %4 = OpFunction %2 None %3
115 %5 = OpLabel
116 %135 = OpFunctionCall %2 %6
117 %136 = OpFunctionCall %2 %8
118 OpReturn
119 OpFunctionEnd
120 %6 = OpFunction %2 None %3
121 %7 = OpLabel
122 %12 = OpVariable %11 Function
123 %20 = OpVariable %11 Function
124 %44 = OpVariable %43 Function
125 %46 = OpVariable %43 Function
126 %56 = OpVariable %43 Function
127 %18 = OpAccessChain %17 %15 %16
128 %19 = OpLoad %10 %18
129 OpStore %12 %19
130 %22 = OpAccessChain %17 %15 %21
131 %23 = OpLoad %10 %22
132 OpStore %20 %23
133 %28 = OpLoad %25 %27
134 %30 = OpLoad %13 %15
135 %31 = OpVectorShuffle %29 %30 %30 0 1
136 %33 = OpBitcast %32 %31
137 %34 = OpLoad %10 %12
138 %35 = OpLoad %10 %20
139 %36 = OpIAdd %10 %34 %35
140 %37 = OpBitcast %24 %36
141 %39 = OpCompositeConstruct %38 %37 %37 %37 %37
142 OpImageWrite %28 %33 %39
143 OpMemoryBarrier %40 %41
144 OpControlBarrier %40 %40 %42
145 OpStore %44 %45
146 OpStore %46 %45
147 OpBranch %47
148 %47 = OpLabel
149 OpLoopMerge %49 %50 None
150 OpBranch %51
151 %51 = OpLabel
152 %52 = OpLoad %24 %46
153 %55 = OpSLessThan %54 %52 %53
154 OpBranchConditional %55 %48 %49
155 %48 = OpLabel
156 OpStore %56 %45
157 OpBranch %57
158 %57 = OpLabel
159 OpLoopMerge %59 %60 None
160 OpBranch %61
161 %61 = OpLabel
162 %62 = OpLoad %24 %56
163 %63 = OpSLessThan %54 %62 %53
164 OpBranchConditional %63 %58 %59
165 %58 = OpLabel
166 %64 = OpLoad %25 %27
167 %65 = OpLoad %24 %46
168 %66 = OpLoad %24 %56
169 %67 = OpCompositeConstruct %32 %65 %66
170 %68 = OpImageRead %38 %64 %67
171 %69 = OpCompositeExtract %24 %68 0
172 %70 = OpLoad %24 %44
173 %71 = OpIAdd %24 %70 %69
174 OpStore %44 %71
175 OpBranch %60
176 %60 = OpLabel
177 %72 = OpLoad %24 %56
178 %74 = OpIAdd %24 %72 %73
179 OpStore %56 %74
180 OpBranch %57
181 %59 = OpLabel
182 OpBranch %50
183 %50 = OpLabel
184 %75 = OpLoad %24 %46
185 %76 = OpIAdd %24 %75 %73
186 OpStore %46 %76
187 OpBranch %47
188 %49 = OpLabel
189 OpMemoryBarrier %40 %41
190 OpControlBarrier %40 %40 %42
191 %83 = OpLoad %24 %44
192 %85 = OpAccessChain %84 %82 %53
193 OpStore %85 %83
194 OpReturn
195 OpFunctionEnd
196 %8 = OpFunction %2 None %3
197 %9 = OpLabel
198 %101 = OpVariable %43 Function
199 %92 = OpAccessChain %91 %90 %73
200 %93 = OpLoad %87 %92
201 %95 = OpAccessChain %94 %82 %45
202 %96 = OpLoad %77 %95
203 %97 = OpConvertUToF %86 %96
204 %98 = OpMatrixTimesVector %86 %93 %97
205 %99 = OpConvertFToU %77 %98
206 %100 = OpAccessChain %94 %82 %45
207 OpStore %100 %99
208 OpStore %101 %45
209 OpBranch %102
210 %102 = OpLabel
211 OpLoopMerge %104 %105 None
212 OpBranch %106
213 %106 = OpLabel
214 %107 = OpLoad %24 %101
215 %109 = OpSLessThan %54 %107 %108
216 OpBranchConditional %109 %103 %104
217 %103 = OpLabel
218 %111 = OpAccessChain %110 %82 %73
219 %112 = OpLoad %79 %111
220 %114 = OpAccessChain %113 %90 %53
221 %115 = OpLoad %78 %114
222 %116 = OpVectorTimesScalar %79 %112 %115
223 %117 = OpConvertFToU %13 %116
224 %118 = OpCompositeExtract %10 %117 0
225 %119 = OpCompositeExtract %10 %117 1
226 %120 = OpCompositeExtract %10 %117 2
227 %121 = OpCompositeConstruct %77 %118 %119 %120 %16
228 %122 = OpAccessChain %94 %82 %45
229 %123 = OpLoad %77 %122
230 %124 = OpIAdd %77 %123 %121
231 %125 = OpAccessChain %94 %82 %45
232 OpStore %125 %124
233 OpBranch %105
234 %105 = OpLabel
235 %126 = OpLoad %24 %101
236 %127 = OpIAdd %24 %126 %73
237 OpStore %101 %127
238 OpBranch %102
239 %104 = OpLabel
240 OpMemoryBarrier %40 %41
241 OpControlBarrier %40 %40 %42
242 %128 = OpLoad %25 %27
243 %130 = OpImageRead %38 %128 %129
244 %131 = OpCompositeExtract %24 %130 0
245 %132 = OpConvertSToF %78 %131
246 %133 = OpCompositeConstruct %79 %132 %132 %132
247 %134 = OpAccessChain %110 %82 %73
248 OpStore %134 %133
249 OpReturn
250 OpFunctionEnd
251 )";
252 constexpr char kDst[] = R"( OpCapability Shader
253 %1 = OpExtInstImport "GLSL.std.450"
254 OpMemoryModel Logical GLSL450
255 OpEntryPoint GLCompute %4 "main" %15
256 OpExecutionMode %4 LocalSize 1 1 1
257 OpSource ESSL 310
258 OpName %4 "main"
259 OpName %6 "f1("
260 OpName %8 "f2("
261 OpName %12 "x"
262 OpName %15 "gl_LocalInvocationID"
263 OpName %20 "y"
264 OpName %27 "image"
265 OpName %44 "sum"
266 OpName %46 "i"
267 OpName %56 "j"
268 OpName %80 "BufferOut"
269 OpMemberName %80 0 "o_uv4"
270 OpMemberName %80 1 "o_v3"
271 OpMemberName %80 2 "o_i"
272 OpName %82 ""
273 OpName %88 "BufferIn"
274 OpMemberName %88 0 "i_u"
275 OpMemberName %88 1 "i_v4"
276 OpMemberName %88 2 "i_f"
277 OpName %90 ""
278 OpName %101 "i"
279 OpName %128 "image2"
280 OpDecorate %15 BuiltIn LocalInvocationId
281 OpDecorate %27 DescriptorSet 0
282 OpDecorate %27 Binding 2
283 OpMemberDecorate %80 0 Offset 0
284 OpMemberDecorate %80 1 Offset 16
285 OpMemberDecorate %80 2 Offset 28
286 OpDecorate %80 BufferBlock
287 OpDecorate %82 DescriptorSet 0
288 OpDecorate %82 Binding 1
289 OpMemberDecorate %88 0 Offset 0
290 OpMemberDecorate %88 1 RowMajor
291 OpMemberDecorate %88 1 Offset 16
292 OpMemberDecorate %88 1 MatrixStride 16
293 OpMemberDecorate %88 2 Offset 80
294 OpDecorate %88 Block
295 OpDecorate %90 DescriptorSet 0
296 OpDecorate %90 Binding 0
297 OpDecorate %128 DescriptorSet 0
298 OpDecorate %128 Binding 3
299 %2 = OpTypeVoid
300 %3 = OpTypeFunction %2
301 %10 = OpTypeInt 32 0
302 %11 = OpTypePointer Function %10
303 %13 = OpTypeVector %10 3
304 %14 = OpTypePointer Input %13
305 %15 = OpVariable %14 Input
306 %16 = OpConstant %10 0
307 %17 = OpTypePointer Input %10
308 %21 = OpConstant %10 1
309 %24 = OpTypeInt 32 1
310 %25 = OpTypeImage %24 2D 0 0 0 2 R32i
311 %26 = OpTypePointer UniformConstant %25
312 %27 = OpVariable %26 UniformConstant
313 %29 = OpTypeVector %10 2
314 %32 = OpTypeVector %24 2
315 %38 = OpTypeVector %24 4
316 %40 = OpConstant %10 2
317 %41 = OpConstant %10 3400
318 %42 = OpConstant %10 264
319 %43 = OpTypePointer Function %24
320 %45 = OpConstant %24 0
321 %53 = OpConstant %24 2
322 %54 = OpTypeBool
323 %73 = OpConstant %24 1
324 %77 = OpTypeVector %10 4
325 %78 = OpTypeFloat 32
326 %79 = OpTypeVector %78 3
327 %80 = OpTypeStruct %77 %79 %24
328 %81 = OpTypePointer Uniform %80
329 %82 = OpVariable %81 Uniform
330 %84 = OpTypePointer Uniform %24
331 %86 = OpTypeVector %78 4
332 %87 = OpTypeMatrix %86 4
333 %88 = OpTypeStruct %10 %87 %78
334 %89 = OpTypePointer Uniform %88
335 %90 = OpVariable %89 Uniform
336 %91 = OpTypePointer Uniform %87
337 %94 = OpTypePointer Uniform %77
338 %108 = OpConstant %24 3
339 %110 = OpTypePointer Uniform %79
340 %113 = OpTypePointer Uniform %78
341 %128 = OpVariable %26 UniformConstant
342 %130 = OpConstantComposite %32 %45 %45
343 %4 = OpFunction %2 None %3
344 %5 = OpLabel
345 %136 = OpFunctionCall %2 %6
346 %137 = OpFunctionCall %2 %8
347 OpReturn
348 OpFunctionEnd
349 %6 = OpFunction %2 None %3
350 %7 = OpLabel
351 %12 = OpVariable %11 Function
352 %20 = OpVariable %11 Function
353 %44 = OpVariable %43 Function
354 %46 = OpVariable %43 Function
355 %56 = OpVariable %43 Function
356 %18 = OpAccessChain %17 %15 %16
357 %19 = OpLoad %10 %18
358 OpStore %12 %19
359 %22 = OpAccessChain %17 %15 %21
360 %23 = OpLoad %10 %22
361 OpStore %20 %23
362 %28 = OpLoad %25 %27
363 %30 = OpLoad %13 %15
364 %31 = OpVectorShuffle %29 %30 %30 0 1
365 %33 = OpBitcast %32 %31
366 %34 = OpLoad %10 %12
367 %35 = OpLoad %10 %20
368 %36 = OpIAdd %10 %34 %35
369 %37 = OpBitcast %24 %36
370 %39 = OpCompositeConstruct %38 %37 %37 %37 %37
371 OpImageWrite %28 %33 %39
372 OpMemoryBarrier %40 %41
373 OpControlBarrier %40 %40 %42
374 OpStore %44 %45
375 OpStore %46 %45
376 OpBranch %47
377 %47 = OpLabel
378 OpLoopMerge %49 %50 None
379 OpBranch %51
380 %51 = OpLabel
381 %52 = OpLoad %24 %46
382 %55 = OpSLessThan %54 %52 %53
383 OpBranchConditional %55 %48 %49
384 %48 = OpLabel
385 OpStore %56 %45
386 OpBranch %57
387 %57 = OpLabel
388 OpLoopMerge %59 %60 None
389 OpBranch %61
390 %61 = OpLabel
391 %62 = OpLoad %24 %56
392 %63 = OpSLessThan %54 %62 %53
393 OpBranchConditional %63 %58 %59
394 %58 = OpLabel
395 %64 = OpLoad %25 %27
396 %65 = OpLoad %24 %46
397 %66 = OpLoad %24 %56
398 %67 = OpCompositeConstruct %32 %65 %66
399 %68 = OpImageRead %38 %64 %67
400 %69 = OpCompositeExtract %24 %68 0
401 %70 = OpLoad %24 %44
402 %71 = OpIMul %24 %70 %69
403 OpStore %44 %71
404 OpBranch %60
405 %60 = OpLabel
406 %72 = OpLoad %24 %56
407 %74 = OpIAdd %24 %72 %73
408 OpStore %56 %74
409 OpBranch %57
410 %59 = OpLabel
411 OpBranch %50
412 %50 = OpLabel
413 %75 = OpLoad %24 %46
414 %76 = OpIAdd %24 %75 %73
415 OpStore %46 %76
416 OpBranch %47
417 %49 = OpLabel
418 OpMemoryBarrier %40 %41
419 OpControlBarrier %40 %40 %42
420 %83 = OpLoad %24 %44
421 %85 = OpAccessChain %84 %82 %53
422 OpStore %85 %83
423 OpReturn
424 OpFunctionEnd
425 %8 = OpFunction %2 None %3
426 %9 = OpLabel
427 %101 = OpVariable %43 Function
428 %92 = OpAccessChain %91 %90 %73
429 %93 = OpLoad %87 %92
430 %95 = OpAccessChain %94 %82 %45
431 %96 = OpLoad %77 %95
432 %97 = OpConvertUToF %86 %96
433 %98 = OpMatrixTimesVector %86 %93 %97
434 %99 = OpConvertFToU %77 %98
435 %100 = OpAccessChain %94 %82 %45
436 OpStore %100 %99
437 OpStore %101 %45
438 OpBranch %102
439 %102 = OpLabel
440 OpLoopMerge %104 %105 None
441 OpBranch %106
442 %106 = OpLabel
443 %107 = OpLoad %24 %101
444 %109 = OpSLessThan %54 %107 %108
445 OpBranchConditional %109 %103 %104
446 %103 = OpLabel
447 %111 = OpAccessChain %110 %82 %73
448 %112 = OpLoad %79 %111
449 %114 = OpAccessChain %113 %90 %53
450 %115 = OpLoad %78 %114
451 %116 = OpVectorTimesScalar %79 %112 %115
452 %117 = OpConvertFToU %13 %116
453 %118 = OpCompositeExtract %10 %117 0
454 %119 = OpCompositeExtract %10 %117 1
455 %120 = OpCompositeExtract %10 %117 2
456 %121 = OpCompositeConstruct %77 %118 %119 %120 %16
457 %122 = OpAccessChain %94 %82 %45
458 %123 = OpLoad %77 %122
459 %124 = OpIAdd %77 %123 %121
460 %125 = OpAccessChain %94 %82 %45
461 OpStore %125 %124
462 OpBranch %105
463 %105 = OpLabel
464 %126 = OpLoad %24 %101
465 %127 = OpIAdd %24 %126 %73
466 OpStore %101 %127
467 OpBranch %102
468 %104 = OpLabel
469 OpMemoryBarrier %40 %41
470 OpControlBarrier %40 %40 %42
471 %129 = OpLoad %25 %128
472 %131 = OpImageRead %38 %129 %130
473 %132 = OpCompositeExtract %24 %131 0
474 %133 = OpConvertSToF %78 %132
475 %134 = OpCompositeConstruct %79 %133 %133 %133
476 %135 = OpAccessChain %110 %82 %73
477 OpStore %135 %134
478 OpReturn
479 OpFunctionEnd
480
481 )";
482
TEST(DiffTest,LargeFunctionsSmallDiffs)483 TEST(DiffTest, LargeFunctionsSmallDiffs) {
484 constexpr char kDiff[] = R"( ; SPIR-V
485 ; Version: 1.6
486 ; Generator: Khronos SPIR-V Tools Assembler; 0
487 -; Bound: 137
488 +; Bound: 140
489 ; Schema: 0
490 OpCapability Shader
491 %1 = OpExtInstImport "GLSL.std.450"
492 OpMemoryModel Logical GLSL450
493 OpEntryPoint GLCompute %4 "main" %15
494 OpExecutionMode %4 LocalSize 1 1 1
495 OpSource ESSL 310
496 OpName %4 "main"
497 OpName %6 "f1("
498 OpName %8 "f2("
499 OpName %12 "x"
500 OpName %15 "gl_LocalInvocationID"
501 OpName %20 "y"
502 OpName %27 "image"
503 OpName %44 "sum"
504 OpName %46 "i"
505 OpName %56 "j"
506 OpName %80 "BufferOut"
507 OpMemberName %80 0 "o_uv4"
508 OpMemberName %80 1 "o_v3"
509 OpMemberName %80 2 "o_i"
510 OpName %82 ""
511 OpName %88 "BufferIn"
512 OpMemberName %88 0 "i_u"
513 OpMemberName %88 1 "i_v4"
514 OpMemberName %88 2 "i_f"
515 OpName %90 ""
516 OpName %101 "i"
517 +OpName %138 "image2"
518 OpDecorate %15 BuiltIn LocalInvocationId
519 OpDecorate %27 DescriptorSet 0
520 OpDecorate %27 Binding 2
521 OpMemberDecorate %80 0 Offset 0
522 OpMemberDecorate %80 1 Offset 16
523 OpMemberDecorate %80 2 Offset 28
524 OpDecorate %80 BufferBlock
525 OpDecorate %82 DescriptorSet 0
526 OpDecorate %82 Binding 1
527 OpMemberDecorate %88 0 Offset 0
528 OpMemberDecorate %88 1 RowMajor
529 OpMemberDecorate %88 1 Offset 16
530 OpMemberDecorate %88 1 MatrixStride 16
531 OpMemberDecorate %88 2 Offset 80
532 OpDecorate %88 Block
533 OpDecorate %90 DescriptorSet 0
534 OpDecorate %90 Binding 0
535 +OpDecorate %138 DescriptorSet 0
536 +OpDecorate %138 Binding 3
537 %2 = OpTypeVoid
538 %3 = OpTypeFunction %2
539 %10 = OpTypeInt 32 0
540 %11 = OpTypePointer Function %10
541 %13 = OpTypeVector %10 3
542 %14 = OpTypePointer Input %13
543 %15 = OpVariable %14 Input
544 %16 = OpConstant %10 0
545 %17 = OpTypePointer Input %10
546 %21 = OpConstant %10 1
547 %24 = OpTypeInt 32 1
548 %25 = OpTypeImage %24 2D 0 0 0 2 R32i
549 %26 = OpTypePointer UniformConstant %25
550 %27 = OpVariable %26 UniformConstant
551 %29 = OpTypeVector %10 2
552 %32 = OpTypeVector %24 2
553 %38 = OpTypeVector %24 4
554 %40 = OpConstant %10 2
555 %41 = OpConstant %10 3400
556 %42 = OpConstant %10 264
557 %43 = OpTypePointer Function %24
558 %45 = OpConstant %24 0
559 %53 = OpConstant %24 2
560 %54 = OpTypeBool
561 %73 = OpConstant %24 1
562 %77 = OpTypeVector %10 4
563 %78 = OpTypeFloat 32
564 %79 = OpTypeVector %78 3
565 %80 = OpTypeStruct %77 %79 %24
566 %81 = OpTypePointer Uniform %80
567 %82 = OpVariable %81 Uniform
568 %84 = OpTypePointer Uniform %24
569 %86 = OpTypeVector %78 4
570 %87 = OpTypeMatrix %86 4
571 %88 = OpTypeStruct %10 %87 %78
572 %89 = OpTypePointer Uniform %88
573 %90 = OpVariable %89 Uniform
574 %91 = OpTypePointer Uniform %87
575 %94 = OpTypePointer Uniform %77
576 %108 = OpConstant %24 3
577 %110 = OpTypePointer Uniform %79
578 %113 = OpTypePointer Uniform %78
579 +%138 = OpVariable %26 UniformConstant
580 %129 = OpConstantComposite %32 %45 %45
581 %4 = OpFunction %2 None %3
582 %5 = OpLabel
583 %135 = OpFunctionCall %2 %6
584 %136 = OpFunctionCall %2 %8
585 OpReturn
586 OpFunctionEnd
587 %6 = OpFunction %2 None %3
588 %7 = OpLabel
589 %12 = OpVariable %11 Function
590 %20 = OpVariable %11 Function
591 %44 = OpVariable %43 Function
592 %46 = OpVariable %43 Function
593 %56 = OpVariable %43 Function
594 %18 = OpAccessChain %17 %15 %16
595 %19 = OpLoad %10 %18
596 OpStore %12 %19
597 %22 = OpAccessChain %17 %15 %21
598 %23 = OpLoad %10 %22
599 OpStore %20 %23
600 %28 = OpLoad %25 %27
601 %30 = OpLoad %13 %15
602 %31 = OpVectorShuffle %29 %30 %30 0 1
603 %33 = OpBitcast %32 %31
604 %34 = OpLoad %10 %12
605 %35 = OpLoad %10 %20
606 %36 = OpIAdd %10 %34 %35
607 %37 = OpBitcast %24 %36
608 %39 = OpCompositeConstruct %38 %37 %37 %37 %37
609 OpImageWrite %28 %33 %39
610 OpMemoryBarrier %40 %41
611 OpControlBarrier %40 %40 %42
612 OpStore %44 %45
613 OpStore %46 %45
614 OpBranch %47
615 %47 = OpLabel
616 OpLoopMerge %49 %50 None
617 OpBranch %51
618 %51 = OpLabel
619 %52 = OpLoad %24 %46
620 %55 = OpSLessThan %54 %52 %53
621 OpBranchConditional %55 %48 %49
622 %48 = OpLabel
623 OpStore %56 %45
624 OpBranch %57
625 %57 = OpLabel
626 OpLoopMerge %59 %60 None
627 OpBranch %61
628 %61 = OpLabel
629 %62 = OpLoad %24 %56
630 %63 = OpSLessThan %54 %62 %53
631 OpBranchConditional %63 %58 %59
632 %58 = OpLabel
633 %64 = OpLoad %25 %27
634 %65 = OpLoad %24 %46
635 %66 = OpLoad %24 %56
636 %67 = OpCompositeConstruct %32 %65 %66
637 %68 = OpImageRead %38 %64 %67
638 %69 = OpCompositeExtract %24 %68 0
639 %70 = OpLoad %24 %44
640 -%71 = OpIAdd %24 %70 %69
641 +%137 = OpIMul %24 %70 %69
642 -OpStore %44 %71
643 +OpStore %44 %137
644 OpBranch %60
645 %60 = OpLabel
646 %72 = OpLoad %24 %56
647 %74 = OpIAdd %24 %72 %73
648 OpStore %56 %74
649 OpBranch %57
650 %59 = OpLabel
651 OpBranch %50
652 %50 = OpLabel
653 %75 = OpLoad %24 %46
654 %76 = OpIAdd %24 %75 %73
655 OpStore %46 %76
656 OpBranch %47
657 %49 = OpLabel
658 OpMemoryBarrier %40 %41
659 OpControlBarrier %40 %40 %42
660 %83 = OpLoad %24 %44
661 %85 = OpAccessChain %84 %82 %53
662 OpStore %85 %83
663 OpReturn
664 OpFunctionEnd
665 %8 = OpFunction %2 None %3
666 %9 = OpLabel
667 %101 = OpVariable %43 Function
668 %92 = OpAccessChain %91 %90 %73
669 %93 = OpLoad %87 %92
670 %95 = OpAccessChain %94 %82 %45
671 %96 = OpLoad %77 %95
672 %97 = OpConvertUToF %86 %96
673 %98 = OpMatrixTimesVector %86 %93 %97
674 %99 = OpConvertFToU %77 %98
675 %100 = OpAccessChain %94 %82 %45
676 OpStore %100 %99
677 OpStore %101 %45
678 OpBranch %102
679 %102 = OpLabel
680 OpLoopMerge %104 %105 None
681 OpBranch %106
682 %106 = OpLabel
683 %107 = OpLoad %24 %101
684 %109 = OpSLessThan %54 %107 %108
685 OpBranchConditional %109 %103 %104
686 %103 = OpLabel
687 %111 = OpAccessChain %110 %82 %73
688 %112 = OpLoad %79 %111
689 %114 = OpAccessChain %113 %90 %53
690 %115 = OpLoad %78 %114
691 %116 = OpVectorTimesScalar %79 %112 %115
692 %117 = OpConvertFToU %13 %116
693 %118 = OpCompositeExtract %10 %117 0
694 %119 = OpCompositeExtract %10 %117 1
695 %120 = OpCompositeExtract %10 %117 2
696 %121 = OpCompositeConstruct %77 %118 %119 %120 %16
697 %122 = OpAccessChain %94 %82 %45
698 %123 = OpLoad %77 %122
699 %124 = OpIAdd %77 %123 %121
700 %125 = OpAccessChain %94 %82 %45
701 OpStore %125 %124
702 OpBranch %105
703 %105 = OpLabel
704 %126 = OpLoad %24 %101
705 %127 = OpIAdd %24 %126 %73
706 OpStore %101 %127
707 OpBranch %102
708 %104 = OpLabel
709 OpMemoryBarrier %40 %41
710 OpControlBarrier %40 %40 %42
711 -%128 = OpLoad %25 %27
712 +%139 = OpLoad %25 %138
713 -%130 = OpImageRead %38 %128 %129
714 +%130 = OpImageRead %38 %139 %129
715 %131 = OpCompositeExtract %24 %130 0
716 %132 = OpConvertSToF %78 %131
717 %133 = OpCompositeConstruct %79 %132 %132 %132
718 %134 = OpAccessChain %110 %82 %73
719 OpStore %134 %133
720 OpReturn
721 OpFunctionEnd
722 )";
723 Options options;
724 DoStringDiffTest(kSrc, kDst, kDiff, options);
725 }
726
TEST(DiffTest,LargeFunctionsSmallDiffsNoDebug)727 TEST(DiffTest, LargeFunctionsSmallDiffsNoDebug) {
728 constexpr char kSrcNoDebug[] = R"( OpCapability Shader
729 %1 = OpExtInstImport "GLSL.std.450"
730 OpMemoryModel Logical GLSL450
731 OpEntryPoint GLCompute %4 "main" %15
732 OpExecutionMode %4 LocalSize 1 1 1
733 OpSource ESSL 310
734 OpDecorate %15 BuiltIn LocalInvocationId
735 OpDecorate %27 DescriptorSet 0
736 OpDecorate %27 Binding 2
737 OpMemberDecorate %80 0 Offset 0
738 OpMemberDecorate %80 1 Offset 16
739 OpMemberDecorate %80 2 Offset 28
740 OpDecorate %80 BufferBlock
741 OpDecorate %82 DescriptorSet 0
742 OpDecorate %82 Binding 1
743 OpMemberDecorate %88 0 Offset 0
744 OpMemberDecorate %88 1 RowMajor
745 OpMemberDecorate %88 1 Offset 16
746 OpMemberDecorate %88 1 MatrixStride 16
747 OpMemberDecorate %88 2 Offset 80
748 OpDecorate %88 Block
749 OpDecorate %90 DescriptorSet 0
750 OpDecorate %90 Binding 0
751 %2 = OpTypeVoid
752 %3 = OpTypeFunction %2
753 %10 = OpTypeInt 32 0
754 %11 = OpTypePointer Function %10
755 %13 = OpTypeVector %10 3
756 %14 = OpTypePointer Input %13
757 %15 = OpVariable %14 Input
758 %16 = OpConstant %10 0
759 %17 = OpTypePointer Input %10
760 %21 = OpConstant %10 1
761 %24 = OpTypeInt 32 1
762 %25 = OpTypeImage %24 2D 0 0 0 2 R32i
763 %26 = OpTypePointer UniformConstant %25
764 %27 = OpVariable %26 UniformConstant
765 %29 = OpTypeVector %10 2
766 %32 = OpTypeVector %24 2
767 %38 = OpTypeVector %24 4
768 %40 = OpConstant %10 2
769 %41 = OpConstant %10 3400
770 %42 = OpConstant %10 264
771 %43 = OpTypePointer Function %24
772 %45 = OpConstant %24 0
773 %53 = OpConstant %24 2
774 %54 = OpTypeBool
775 %73 = OpConstant %24 1
776 %77 = OpTypeVector %10 4
777 %78 = OpTypeFloat 32
778 %79 = OpTypeVector %78 3
779 %80 = OpTypeStruct %77 %79 %24
780 %81 = OpTypePointer Uniform %80
781 %82 = OpVariable %81 Uniform
782 %84 = OpTypePointer Uniform %24
783 %86 = OpTypeVector %78 4
784 %87 = OpTypeMatrix %86 4
785 %88 = OpTypeStruct %10 %87 %78
786 %89 = OpTypePointer Uniform %88
787 %90 = OpVariable %89 Uniform
788 %91 = OpTypePointer Uniform %87
789 %94 = OpTypePointer Uniform %77
790 %108 = OpConstant %24 3
791 %110 = OpTypePointer Uniform %79
792 %113 = OpTypePointer Uniform %78
793 %129 = OpConstantComposite %32 %45 %45
794 %4 = OpFunction %2 None %3
795 %5 = OpLabel
796 %135 = OpFunctionCall %2 %6
797 %136 = OpFunctionCall %2 %8
798 OpReturn
799 OpFunctionEnd
800 %6 = OpFunction %2 None %3
801 %7 = OpLabel
802 %12 = OpVariable %11 Function
803 %20 = OpVariable %11 Function
804 %44 = OpVariable %43 Function
805 %46 = OpVariable %43 Function
806 %56 = OpVariable %43 Function
807 %18 = OpAccessChain %17 %15 %16
808 %19 = OpLoad %10 %18
809 OpStore %12 %19
810 %22 = OpAccessChain %17 %15 %21
811 %23 = OpLoad %10 %22
812 OpStore %20 %23
813 %28 = OpLoad %25 %27
814 %30 = OpLoad %13 %15
815 %31 = OpVectorShuffle %29 %30 %30 0 1
816 %33 = OpBitcast %32 %31
817 %34 = OpLoad %10 %12
818 %35 = OpLoad %10 %20
819 %36 = OpIAdd %10 %34 %35
820 %37 = OpBitcast %24 %36
821 %39 = OpCompositeConstruct %38 %37 %37 %37 %37
822 OpImageWrite %28 %33 %39
823 OpMemoryBarrier %40 %41
824 OpControlBarrier %40 %40 %42
825 OpStore %44 %45
826 OpStore %46 %45
827 OpBranch %47
828 %47 = OpLabel
829 OpLoopMerge %49 %50 None
830 OpBranch %51
831 %51 = OpLabel
832 %52 = OpLoad %24 %46
833 %55 = OpSLessThan %54 %52 %53
834 OpBranchConditional %55 %48 %49
835 %48 = OpLabel
836 OpStore %56 %45
837 OpBranch %57
838 %57 = OpLabel
839 OpLoopMerge %59 %60 None
840 OpBranch %61
841 %61 = OpLabel
842 %62 = OpLoad %24 %56
843 %63 = OpSLessThan %54 %62 %53
844 OpBranchConditional %63 %58 %59
845 %58 = OpLabel
846 %64 = OpLoad %25 %27
847 %65 = OpLoad %24 %46
848 %66 = OpLoad %24 %56
849 %67 = OpCompositeConstruct %32 %65 %66
850 %68 = OpImageRead %38 %64 %67
851 %69 = OpCompositeExtract %24 %68 0
852 %70 = OpLoad %24 %44
853 %71 = OpIAdd %24 %70 %69
854 OpStore %44 %71
855 OpBranch %60
856 %60 = OpLabel
857 %72 = OpLoad %24 %56
858 %74 = OpIAdd %24 %72 %73
859 OpStore %56 %74
860 OpBranch %57
861 %59 = OpLabel
862 OpBranch %50
863 %50 = OpLabel
864 %75 = OpLoad %24 %46
865 %76 = OpIAdd %24 %75 %73
866 OpStore %46 %76
867 OpBranch %47
868 %49 = OpLabel
869 OpMemoryBarrier %40 %41
870 OpControlBarrier %40 %40 %42
871 %83 = OpLoad %24 %44
872 %85 = OpAccessChain %84 %82 %53
873 OpStore %85 %83
874 OpReturn
875 OpFunctionEnd
876 %8 = OpFunction %2 None %3
877 %9 = OpLabel
878 %101 = OpVariable %43 Function
879 %92 = OpAccessChain %91 %90 %73
880 %93 = OpLoad %87 %92
881 %95 = OpAccessChain %94 %82 %45
882 %96 = OpLoad %77 %95
883 %97 = OpConvertUToF %86 %96
884 %98 = OpMatrixTimesVector %86 %93 %97
885 %99 = OpConvertFToU %77 %98
886 %100 = OpAccessChain %94 %82 %45
887 OpStore %100 %99
888 OpStore %101 %45
889 OpBranch %102
890 %102 = OpLabel
891 OpLoopMerge %104 %105 None
892 OpBranch %106
893 %106 = OpLabel
894 %107 = OpLoad %24 %101
895 %109 = OpSLessThan %54 %107 %108
896 OpBranchConditional %109 %103 %104
897 %103 = OpLabel
898 %111 = OpAccessChain %110 %82 %73
899 %112 = OpLoad %79 %111
900 %114 = OpAccessChain %113 %90 %53
901 %115 = OpLoad %78 %114
902 %116 = OpVectorTimesScalar %79 %112 %115
903 %117 = OpConvertFToU %13 %116
904 %118 = OpCompositeExtract %10 %117 0
905 %119 = OpCompositeExtract %10 %117 1
906 %120 = OpCompositeExtract %10 %117 2
907 %121 = OpCompositeConstruct %77 %118 %119 %120 %16
908 %122 = OpAccessChain %94 %82 %45
909 %123 = OpLoad %77 %122
910 %124 = OpIAdd %77 %123 %121
911 %125 = OpAccessChain %94 %82 %45
912 OpStore %125 %124
913 OpBranch %105
914 %105 = OpLabel
915 %126 = OpLoad %24 %101
916 %127 = OpIAdd %24 %126 %73
917 OpStore %101 %127
918 OpBranch %102
919 %104 = OpLabel
920 OpMemoryBarrier %40 %41
921 OpControlBarrier %40 %40 %42
922 %128 = OpLoad %25 %27
923 %130 = OpImageRead %38 %128 %129
924 %131 = OpCompositeExtract %24 %130 0
925 %132 = OpConvertSToF %78 %131
926 %133 = OpCompositeConstruct %79 %132 %132 %132
927 %134 = OpAccessChain %110 %82 %73
928 OpStore %134 %133
929 OpReturn
930 OpFunctionEnd
931
932 )";
933 constexpr char kDstNoDebug[] = R"( OpCapability Shader
934 %1 = OpExtInstImport "GLSL.std.450"
935 OpMemoryModel Logical GLSL450
936 OpEntryPoint GLCompute %4 "main" %15
937 OpExecutionMode %4 LocalSize 1 1 1
938 OpSource ESSL 310
939 OpDecorate %15 BuiltIn LocalInvocationId
940 OpDecorate %27 DescriptorSet 0
941 OpDecorate %27 Binding 2
942 OpMemberDecorate %80 0 Offset 0
943 OpMemberDecorate %80 1 Offset 16
944 OpMemberDecorate %80 2 Offset 28
945 OpDecorate %80 BufferBlock
946 OpDecorate %82 DescriptorSet 0
947 OpDecorate %82 Binding 1
948 OpMemberDecorate %88 0 Offset 0
949 OpMemberDecorate %88 1 RowMajor
950 OpMemberDecorate %88 1 Offset 16
951 OpMemberDecorate %88 1 MatrixStride 16
952 OpMemberDecorate %88 2 Offset 80
953 OpDecorate %88 Block
954 OpDecorate %90 DescriptorSet 0
955 OpDecorate %90 Binding 0
956 OpDecorate %128 DescriptorSet 0
957 OpDecorate %128 Binding 3
958 %2 = OpTypeVoid
959 %3 = OpTypeFunction %2
960 %10 = OpTypeInt 32 0
961 %11 = OpTypePointer Function %10
962 %13 = OpTypeVector %10 3
963 %14 = OpTypePointer Input %13
964 %15 = OpVariable %14 Input
965 %16 = OpConstant %10 0
966 %17 = OpTypePointer Input %10
967 %21 = OpConstant %10 1
968 %24 = OpTypeInt 32 1
969 %25 = OpTypeImage %24 2D 0 0 0 2 R32i
970 %26 = OpTypePointer UniformConstant %25
971 %27 = OpVariable %26 UniformConstant
972 %29 = OpTypeVector %10 2
973 %32 = OpTypeVector %24 2
974 %38 = OpTypeVector %24 4
975 %40 = OpConstant %10 2
976 %41 = OpConstant %10 3400
977 %42 = OpConstant %10 264
978 %43 = OpTypePointer Function %24
979 %45 = OpConstant %24 0
980 %53 = OpConstant %24 2
981 %54 = OpTypeBool
982 %73 = OpConstant %24 1
983 %77 = OpTypeVector %10 4
984 %78 = OpTypeFloat 32
985 %79 = OpTypeVector %78 3
986 %80 = OpTypeStruct %77 %79 %24
987 %81 = OpTypePointer Uniform %80
988 %82 = OpVariable %81 Uniform
989 %84 = OpTypePointer Uniform %24
990 %86 = OpTypeVector %78 4
991 %87 = OpTypeMatrix %86 4
992 %88 = OpTypeStruct %10 %87 %78
993 %89 = OpTypePointer Uniform %88
994 %90 = OpVariable %89 Uniform
995 %91 = OpTypePointer Uniform %87
996 %94 = OpTypePointer Uniform %77
997 %108 = OpConstant %24 3
998 %110 = OpTypePointer Uniform %79
999 %113 = OpTypePointer Uniform %78
1000 %128 = OpVariable %26 UniformConstant
1001 %130 = OpConstantComposite %32 %45 %45
1002 %4 = OpFunction %2 None %3
1003 %5 = OpLabel
1004 %136 = OpFunctionCall %2 %6
1005 %137 = OpFunctionCall %2 %8
1006 OpReturn
1007 OpFunctionEnd
1008 %6 = OpFunction %2 None %3
1009 %7 = OpLabel
1010 %12 = OpVariable %11 Function
1011 %20 = OpVariable %11 Function
1012 %44 = OpVariable %43 Function
1013 %46 = OpVariable %43 Function
1014 %56 = OpVariable %43 Function
1015 %18 = OpAccessChain %17 %15 %16
1016 %19 = OpLoad %10 %18
1017 OpStore %12 %19
1018 %22 = OpAccessChain %17 %15 %21
1019 %23 = OpLoad %10 %22
1020 OpStore %20 %23
1021 %28 = OpLoad %25 %27
1022 %30 = OpLoad %13 %15
1023 %31 = OpVectorShuffle %29 %30 %30 0 1
1024 %33 = OpBitcast %32 %31
1025 %34 = OpLoad %10 %12
1026 %35 = OpLoad %10 %20
1027 %36 = OpIAdd %10 %34 %35
1028 %37 = OpBitcast %24 %36
1029 %39 = OpCompositeConstruct %38 %37 %37 %37 %37
1030 OpImageWrite %28 %33 %39
1031 OpMemoryBarrier %40 %41
1032 OpControlBarrier %40 %40 %42
1033 OpStore %44 %45
1034 OpStore %46 %45
1035 OpBranch %47
1036 %47 = OpLabel
1037 OpLoopMerge %49 %50 None
1038 OpBranch %51
1039 %51 = OpLabel
1040 %52 = OpLoad %24 %46
1041 %55 = OpSLessThan %54 %52 %53
1042 OpBranchConditional %55 %48 %49
1043 %48 = OpLabel
1044 OpStore %56 %45
1045 OpBranch %57
1046 %57 = OpLabel
1047 OpLoopMerge %59 %60 None
1048 OpBranch %61
1049 %61 = OpLabel
1050 %62 = OpLoad %24 %56
1051 %63 = OpSLessThan %54 %62 %53
1052 OpBranchConditional %63 %58 %59
1053 %58 = OpLabel
1054 %64 = OpLoad %25 %27
1055 %65 = OpLoad %24 %46
1056 %66 = OpLoad %24 %56
1057 %67 = OpCompositeConstruct %32 %65 %66
1058 %68 = OpImageRead %38 %64 %67
1059 %69 = OpCompositeExtract %24 %68 0
1060 %70 = OpLoad %24 %44
1061 %71 = OpIMul %24 %70 %69
1062 OpStore %44 %71
1063 OpBranch %60
1064 %60 = OpLabel
1065 %72 = OpLoad %24 %56
1066 %74 = OpIAdd %24 %72 %73
1067 OpStore %56 %74
1068 OpBranch %57
1069 %59 = OpLabel
1070 OpBranch %50
1071 %50 = OpLabel
1072 %75 = OpLoad %24 %46
1073 %76 = OpIAdd %24 %75 %73
1074 OpStore %46 %76
1075 OpBranch %47
1076 %49 = OpLabel
1077 OpMemoryBarrier %40 %41
1078 OpControlBarrier %40 %40 %42
1079 %83 = OpLoad %24 %44
1080 %85 = OpAccessChain %84 %82 %53
1081 OpStore %85 %83
1082 OpReturn
1083 OpFunctionEnd
1084 %8 = OpFunction %2 None %3
1085 %9 = OpLabel
1086 %101 = OpVariable %43 Function
1087 %92 = OpAccessChain %91 %90 %73
1088 %93 = OpLoad %87 %92
1089 %95 = OpAccessChain %94 %82 %45
1090 %96 = OpLoad %77 %95
1091 %97 = OpConvertUToF %86 %96
1092 %98 = OpMatrixTimesVector %86 %93 %97
1093 %99 = OpConvertFToU %77 %98
1094 %100 = OpAccessChain %94 %82 %45
1095 OpStore %100 %99
1096 OpStore %101 %45
1097 OpBranch %102
1098 %102 = OpLabel
1099 OpLoopMerge %104 %105 None
1100 OpBranch %106
1101 %106 = OpLabel
1102 %107 = OpLoad %24 %101
1103 %109 = OpSLessThan %54 %107 %108
1104 OpBranchConditional %109 %103 %104
1105 %103 = OpLabel
1106 %111 = OpAccessChain %110 %82 %73
1107 %112 = OpLoad %79 %111
1108 %114 = OpAccessChain %113 %90 %53
1109 %115 = OpLoad %78 %114
1110 %116 = OpVectorTimesScalar %79 %112 %115
1111 %117 = OpConvertFToU %13 %116
1112 %118 = OpCompositeExtract %10 %117 0
1113 %119 = OpCompositeExtract %10 %117 1
1114 %120 = OpCompositeExtract %10 %117 2
1115 %121 = OpCompositeConstruct %77 %118 %119 %120 %16
1116 %122 = OpAccessChain %94 %82 %45
1117 %123 = OpLoad %77 %122
1118 %124 = OpIAdd %77 %123 %121
1119 %125 = OpAccessChain %94 %82 %45
1120 OpStore %125 %124
1121 OpBranch %105
1122 %105 = OpLabel
1123 %126 = OpLoad %24 %101
1124 %127 = OpIAdd %24 %126 %73
1125 OpStore %101 %127
1126 OpBranch %102
1127 %104 = OpLabel
1128 OpMemoryBarrier %40 %41
1129 OpControlBarrier %40 %40 %42
1130 %129 = OpLoad %25 %128
1131 %131 = OpImageRead %38 %129 %130
1132 %132 = OpCompositeExtract %24 %131 0
1133 %133 = OpConvertSToF %78 %132
1134 %134 = OpCompositeConstruct %79 %133 %133 %133
1135 %135 = OpAccessChain %110 %82 %73
1136 OpStore %135 %134
1137 OpReturn
1138 OpFunctionEnd
1139
1140 )";
1141 constexpr char kDiff[] = R"( ; SPIR-V
1142 ; Version: 1.6
1143 ; Generator: Khronos SPIR-V Tools Assembler; 0
1144 -; Bound: 137
1145 +; Bound: 140
1146 ; Schema: 0
1147 OpCapability Shader
1148 %1 = OpExtInstImport "GLSL.std.450"
1149 OpMemoryModel Logical GLSL450
1150 OpEntryPoint GLCompute %4 "main" %15
1151 OpExecutionMode %4 LocalSize 1 1 1
1152 OpSource ESSL 310
1153 OpDecorate %15 BuiltIn LocalInvocationId
1154 OpDecorate %27 DescriptorSet 0
1155 OpDecorate %27 Binding 2
1156 OpMemberDecorate %80 0 Offset 0
1157 OpMemberDecorate %80 1 Offset 16
1158 OpMemberDecorate %80 2 Offset 28
1159 OpDecorate %80 BufferBlock
1160 OpDecorate %82 DescriptorSet 0
1161 OpDecorate %82 Binding 1
1162 OpMemberDecorate %88 0 Offset 0
1163 OpMemberDecorate %88 1 RowMajor
1164 OpMemberDecorate %88 1 Offset 16
1165 OpMemberDecorate %88 1 MatrixStride 16
1166 OpMemberDecorate %88 2 Offset 80
1167 OpDecorate %88 Block
1168 OpDecorate %90 DescriptorSet 0
1169 OpDecorate %90 Binding 0
1170 +OpDecorate %138 DescriptorSet 0
1171 +OpDecorate %138 Binding 3
1172 %2 = OpTypeVoid
1173 %3 = OpTypeFunction %2
1174 %10 = OpTypeInt 32 0
1175 %11 = OpTypePointer Function %10
1176 %13 = OpTypeVector %10 3
1177 %14 = OpTypePointer Input %13
1178 %15 = OpVariable %14 Input
1179 %16 = OpConstant %10 0
1180 %17 = OpTypePointer Input %10
1181 %21 = OpConstant %10 1
1182 %24 = OpTypeInt 32 1
1183 %25 = OpTypeImage %24 2D 0 0 0 2 R32i
1184 %26 = OpTypePointer UniformConstant %25
1185 %27 = OpVariable %26 UniformConstant
1186 %29 = OpTypeVector %10 2
1187 %32 = OpTypeVector %24 2
1188 %38 = OpTypeVector %24 4
1189 %40 = OpConstant %10 2
1190 %41 = OpConstant %10 3400
1191 %42 = OpConstant %10 264
1192 %43 = OpTypePointer Function %24
1193 %45 = OpConstant %24 0
1194 %53 = OpConstant %24 2
1195 %54 = OpTypeBool
1196 %73 = OpConstant %24 1
1197 %77 = OpTypeVector %10 4
1198 %78 = OpTypeFloat 32
1199 %79 = OpTypeVector %78 3
1200 %80 = OpTypeStruct %77 %79 %24
1201 %81 = OpTypePointer Uniform %80
1202 %82 = OpVariable %81 Uniform
1203 %84 = OpTypePointer Uniform %24
1204 %86 = OpTypeVector %78 4
1205 %87 = OpTypeMatrix %86 4
1206 %88 = OpTypeStruct %10 %87 %78
1207 %89 = OpTypePointer Uniform %88
1208 %90 = OpVariable %89 Uniform
1209 %91 = OpTypePointer Uniform %87
1210 %94 = OpTypePointer Uniform %77
1211 %108 = OpConstant %24 3
1212 %110 = OpTypePointer Uniform %79
1213 %113 = OpTypePointer Uniform %78
1214 +%138 = OpVariable %26 UniformConstant
1215 %129 = OpConstantComposite %32 %45 %45
1216 %4 = OpFunction %2 None %3
1217 %5 = OpLabel
1218 %135 = OpFunctionCall %2 %6
1219 %136 = OpFunctionCall %2 %8
1220 OpReturn
1221 OpFunctionEnd
1222 %6 = OpFunction %2 None %3
1223 %7 = OpLabel
1224 %12 = OpVariable %11 Function
1225 %20 = OpVariable %11 Function
1226 %44 = OpVariable %43 Function
1227 %46 = OpVariable %43 Function
1228 %56 = OpVariable %43 Function
1229 %18 = OpAccessChain %17 %15 %16
1230 %19 = OpLoad %10 %18
1231 OpStore %12 %19
1232 %22 = OpAccessChain %17 %15 %21
1233 %23 = OpLoad %10 %22
1234 OpStore %20 %23
1235 %28 = OpLoad %25 %27
1236 %30 = OpLoad %13 %15
1237 %31 = OpVectorShuffle %29 %30 %30 0 1
1238 %33 = OpBitcast %32 %31
1239 %34 = OpLoad %10 %12
1240 %35 = OpLoad %10 %20
1241 %36 = OpIAdd %10 %34 %35
1242 %37 = OpBitcast %24 %36
1243 %39 = OpCompositeConstruct %38 %37 %37 %37 %37
1244 OpImageWrite %28 %33 %39
1245 OpMemoryBarrier %40 %41
1246 OpControlBarrier %40 %40 %42
1247 OpStore %44 %45
1248 OpStore %46 %45
1249 OpBranch %47
1250 %47 = OpLabel
1251 OpLoopMerge %49 %50 None
1252 OpBranch %51
1253 %51 = OpLabel
1254 %52 = OpLoad %24 %46
1255 %55 = OpSLessThan %54 %52 %53
1256 OpBranchConditional %55 %48 %49
1257 %48 = OpLabel
1258 OpStore %56 %45
1259 OpBranch %57
1260 %57 = OpLabel
1261 OpLoopMerge %59 %60 None
1262 OpBranch %61
1263 %61 = OpLabel
1264 %62 = OpLoad %24 %56
1265 %63 = OpSLessThan %54 %62 %53
1266 OpBranchConditional %63 %58 %59
1267 %58 = OpLabel
1268 %64 = OpLoad %25 %27
1269 %65 = OpLoad %24 %46
1270 %66 = OpLoad %24 %56
1271 %67 = OpCompositeConstruct %32 %65 %66
1272 %68 = OpImageRead %38 %64 %67
1273 %69 = OpCompositeExtract %24 %68 0
1274 %70 = OpLoad %24 %44
1275 -%71 = OpIAdd %24 %70 %69
1276 +%137 = OpIMul %24 %70 %69
1277 -OpStore %44 %71
1278 +OpStore %44 %137
1279 OpBranch %60
1280 %60 = OpLabel
1281 %72 = OpLoad %24 %56
1282 %74 = OpIAdd %24 %72 %73
1283 OpStore %56 %74
1284 OpBranch %57
1285 %59 = OpLabel
1286 OpBranch %50
1287 %50 = OpLabel
1288 %75 = OpLoad %24 %46
1289 %76 = OpIAdd %24 %75 %73
1290 OpStore %46 %76
1291 OpBranch %47
1292 %49 = OpLabel
1293 OpMemoryBarrier %40 %41
1294 OpControlBarrier %40 %40 %42
1295 %83 = OpLoad %24 %44
1296 %85 = OpAccessChain %84 %82 %53
1297 OpStore %85 %83
1298 OpReturn
1299 OpFunctionEnd
1300 %8 = OpFunction %2 None %3
1301 %9 = OpLabel
1302 %101 = OpVariable %43 Function
1303 %92 = OpAccessChain %91 %90 %73
1304 %93 = OpLoad %87 %92
1305 %95 = OpAccessChain %94 %82 %45
1306 %96 = OpLoad %77 %95
1307 %97 = OpConvertUToF %86 %96
1308 %98 = OpMatrixTimesVector %86 %93 %97
1309 %99 = OpConvertFToU %77 %98
1310 %100 = OpAccessChain %94 %82 %45
1311 OpStore %100 %99
1312 OpStore %101 %45
1313 OpBranch %102
1314 %102 = OpLabel
1315 OpLoopMerge %104 %105 None
1316 OpBranch %106
1317 %106 = OpLabel
1318 %107 = OpLoad %24 %101
1319 %109 = OpSLessThan %54 %107 %108
1320 OpBranchConditional %109 %103 %104
1321 %103 = OpLabel
1322 %111 = OpAccessChain %110 %82 %73
1323 %112 = OpLoad %79 %111
1324 %114 = OpAccessChain %113 %90 %53
1325 %115 = OpLoad %78 %114
1326 %116 = OpVectorTimesScalar %79 %112 %115
1327 %117 = OpConvertFToU %13 %116
1328 %118 = OpCompositeExtract %10 %117 0
1329 %119 = OpCompositeExtract %10 %117 1
1330 %120 = OpCompositeExtract %10 %117 2
1331 %121 = OpCompositeConstruct %77 %118 %119 %120 %16
1332 %122 = OpAccessChain %94 %82 %45
1333 %123 = OpLoad %77 %122
1334 %124 = OpIAdd %77 %123 %121
1335 %125 = OpAccessChain %94 %82 %45
1336 OpStore %125 %124
1337 OpBranch %105
1338 %105 = OpLabel
1339 %126 = OpLoad %24 %101
1340 %127 = OpIAdd %24 %126 %73
1341 OpStore %101 %127
1342 OpBranch %102
1343 %104 = OpLabel
1344 OpMemoryBarrier %40 %41
1345 OpControlBarrier %40 %40 %42
1346 -%128 = OpLoad %25 %27
1347 +%139 = OpLoad %25 %138
1348 -%130 = OpImageRead %38 %128 %129
1349 +%130 = OpImageRead %38 %139 %129
1350 %131 = OpCompositeExtract %24 %130 0
1351 %132 = OpConvertSToF %78 %131
1352 %133 = OpCompositeConstruct %79 %132 %132 %132
1353 %134 = OpAccessChain %110 %82 %73
1354 OpStore %134 %133
1355 OpReturn
1356 OpFunctionEnd
1357 )";
1358 Options options;
1359 DoStringDiffTest(kSrcNoDebug, kDstNoDebug, kDiff, options);
1360 }
1361
1362 } // namespace
1363 } // namespace diff
1364 } // namespace spvtools
1365