• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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