• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!amber
2
3# Copyright 2020 Google LLC
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9#     http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17
18# A test for a bug found by the GraphicsFuzz project.
19
20# Short description: Equivalent shaders, one extra memory accesses
21
22# The test passes because both shaders render the same image.
23
24SHADER vertex reference_vertex_shader PASSTHROUGH
25
26SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
27; SPIR-V
28; Version: 1.0
29; Generator: Khronos Glslang Reference Front End; 7
30; Bound: 653
31; Schema: 0
32               OpCapability Shader
33          %1 = OpExtInstImport "GLSL.std.450"
34               OpMemoryModel Logical GLSL450
35               OpEntryPoint Fragment %4 "main" %12 %435
36               OpExecutionMode %4 OriginUpperLeft
37               OpSource ESSL 320
38               OpName %4 "main"
39               OpName %12 "gl_FragCoord"
40               OpName %15 "buf0"
41               OpMemberName %15 0 "resolution"
42               OpName %17 ""
43               OpName %55 "map"
44               OpName %435 "_GLF_color"
45               OpDecorate %12 BuiltIn FragCoord
46               OpMemberDecorate %15 0 Offset 0
47               OpDecorate %15 Block
48               OpDecorate %17 DescriptorSet 0
49               OpDecorate %17 Binding 0
50               OpDecorate %435 Location 0
51          %2 = OpTypeVoid
52          %3 = OpTypeFunction %2
53          %6 = OpTypeFloat 32
54          %7 = OpTypeVector %6 2
55         %10 = OpTypeVector %6 4
56         %11 = OpTypePointer Input %10
57         %12 = OpVariable %11 Input
58         %15 = OpTypeStruct %7
59         %16 = OpTypePointer Uniform %15
60         %17 = OpVariable %16 Uniform
61         %18 = OpTypeInt 32 1
62         %19 = OpConstant %18 0
63         %20 = OpTypePointer Uniform %7
64         %24 = OpTypeVector %18 2
65         %27 = OpTypeInt 32 0
66         %28 = OpConstant %27 0
67         %32 = OpConstant %6 16
68         %41 = OpTypePointer Function %18
69         %49 = OpConstant %18 256
70         %50 = OpTypeBool
71         %52 = OpConstant %27 256
72         %53 = OpTypeArray %18 %52
73         %60 = OpConstant %18 1
74         %63 = OpConstantComposite %24 %19 %19
75         %66 = OpConstantTrue %50
76         %82 = OpConstant %18 2
77         %86 = OpConstant %18 16
78        %119 = OpConstant %18 14
79        %162 = OpConstantFalse %50
80        %169 = OpConstant %18 8
81        %434 = OpTypePointer Output %10
82        %435 = OpVariable %434 Output
83        %436 = OpConstant %6 1
84        %437 = OpConstantComposite %10 %436 %436 %436 %436
85        %440 = OpConstant %6 0
86        %441 = OpConstantComposite %10 %440 %440 %440 %436
87        %447 = OpTypePointer Function %53
88        %648 = OpConstant %18 32
89        %649 = OpUndef %24
90          %4 = OpFunction %2 None %3
91          %5 = OpLabel
92         %55 = OpVariable %447 Function
93               OpSelectionMerge %442 None
94               OpSwitch %28 %443
95        %443 = OpLabel
96         %13 = OpLoad %10 %12
97         %14 = OpVectorShuffle %7 %13 %13 0 1
98         %21 = OpAccessChain %20 %17 %19
99         %22 = OpLoad %7 %21
100         %23 = OpFDiv %7 %14 %22
101         %31 = OpCompositeExtract %6 %23 0
102         %33 = OpFMul %6 %31 %32
103         %34 = OpConvertFToS %18 %33
104         %37 = OpCompositeExtract %6 %23 1
105         %38 = OpFMul %6 %37 %32
106         %39 = OpConvertFToS %18 %38
107               OpBranch %43
108         %43 = OpLabel
109        %518 = OpPhi %18 %19 %443 %61 %44
110         %51 = OpSLessThan %50 %518 %49
111               OpLoopMerge %45 %44 None
112               OpBranchConditional %51 %44 %45
113         %44 = OpLabel
114         %58 = OpAccessChain %41 %55 %518
115               OpStore %58 %19
116         %61 = OpIAdd %18 %518 %60
117               OpBranch %43
118         %45 = OpLabel
119               OpBranch %68
120         %68 = OpLabel
121        %591 = OpPhi %50 %66 %45 %569 %71
122        %520 = OpPhi %24 %63 %45 %637 %71
123        %519 = OpPhi %18 %19 %45 %621 %71
124               OpLoopMerge %70 %71 None
125               OpBranch %69
126         %69 = OpLabel
127         %73 = OpIAdd %18 %519 %60
128         %76 = OpCompositeExtract %18 %520 0
129         %77 = OpSGreaterThan %50 %76 %19
130               OpSelectionMerge %79 None
131               OpBranchConditional %77 %78 %79
132         %78 = OpLabel
133         %83 = OpISub %18 %76 %82
134         %85 = OpCompositeExtract %18 %520 1
135         %87 = OpIMul %18 %85 %86
136         %88 = OpIAdd %18 %83 %87
137         %89 = OpAccessChain %41 %55 %88
138         %90 = OpLoad %18 %89
139         %91 = OpIEqual %50 %90 %19
140               OpBranch %79
141         %79 = OpLabel
142         %92 = OpPhi %50 %77 %69 %91 %78
143        %650 = OpSelect %18 %92 %60 %19
144         %98 = OpCompositeExtract %18 %520 1
145         %99 = OpSGreaterThan %50 %98 %19
146               OpSelectionMerge %101 None
147               OpBranchConditional %99 %100 %101
148        %100 = OpLabel
149        %106 = OpISub %18 %98 %82
150        %107 = OpIMul %18 %106 %86
151        %108 = OpIAdd %18 %76 %107
152        %109 = OpAccessChain %41 %55 %108
153        %110 = OpLoad %18 %109
154        %111 = OpIEqual %50 %110 %19
155               OpBranch %101
156        %101 = OpLabel
157        %112 = OpPhi %50 %99 %79 %111 %100
158               OpSelectionMerge %114 None
159               OpBranchConditional %112 %113 %114
160        %113 = OpLabel
161        %116 = OpIAdd %18 %650 %60
162               OpBranch %114
163        %114 = OpLabel
164        %529 = OpPhi %18 %650 %101 %116 %113
165        %120 = OpSLessThan %50 %76 %119
166               OpSelectionMerge %122 None
167               OpBranchConditional %120 %121 %122
168        %121 = OpLabel
169        %125 = OpIAdd %18 %76 %82
170        %128 = OpIMul %18 %98 %86
171        %129 = OpIAdd %18 %125 %128
172        %130 = OpAccessChain %41 %55 %129
173        %131 = OpLoad %18 %130
174        %132 = OpIEqual %50 %131 %19
175               OpBranch %122
176        %122 = OpLabel
177        %133 = OpPhi %50 %120 %114 %132 %121
178               OpSelectionMerge %135 None
179               OpBranchConditional %133 %134 %135
180        %134 = OpLabel
181        %137 = OpIAdd %18 %529 %60
182               OpBranch %135
183        %135 = OpLabel
184        %533 = OpPhi %18 %529 %122 %137 %134
185        %140 = OpSLessThan %50 %98 %119
186               OpSelectionMerge %142 None
187               OpBranchConditional %140 %141 %142
188        %141 = OpLabel
189        %147 = OpIAdd %18 %98 %82
190        %148 = OpIMul %18 %147 %86
191        %149 = OpIAdd %18 %76 %148
192        %150 = OpAccessChain %41 %55 %149
193        %151 = OpLoad %18 %150
194        %152 = OpIEqual %50 %151 %19
195               OpBranch %142
196        %142 = OpLabel
197        %153 = OpPhi %50 %140 %135 %152 %141
198               OpSelectionMerge %155 None
199               OpBranchConditional %153 %154 %155
200        %154 = OpLabel
201        %157 = OpIAdd %18 %533 %60
202               OpBranch %155
203        %155 = OpLabel
204        %534 = OpPhi %18 %533 %142 %157 %154
205        %159 = OpIEqual %50 %534 %19
206               OpSelectionMerge %161 None
207               OpBranchConditional %159 %160 %207
208        %160 = OpLabel
209               OpBranch %163
210        %163 = OpLabel
211        %570 = OpPhi %50 %162 %160 %639 %166
212        %568 = OpPhi %24 %520 %160 %619 %166
213        %567 = OpPhi %18 %19 %160 %199 %166
214        %170 = OpSLessThan %50 %567 %169
215               OpLoopMerge %165 %166 None
216               OpBranchConditional %170 %164 %165
217        %164 = OpLabel
218               OpBranch %172
219        %172 = OpLabel
220        %619 = OpPhi %24 %568 %164 %644 %175
221        %617 = OpPhi %18 %19 %164 %197 %175
222        %639 = OpPhi %50 %570 %164 %651 %175
223        %178 = OpSLessThan %50 %617 %169
224               OpLoopMerge %174 %175 None
225               OpBranchConditional %178 %173 %174
226        %173 = OpLabel
227        %180 = OpIMul %18 %617 %82
228        %182 = OpIMul %18 %567 %82
229        %183 = OpIMul %18 %567 %648
230        %184 = OpIAdd %18 %180 %183
231        %185 = OpAccessChain %41 %55 %184
232        %186 = OpLoad %18 %185
233        %187 = OpIEqual %50 %186 %19
234               OpSelectionMerge %189 None
235               OpBranchConditional %187 %188 %189
236        %188 = OpLabel
237        %463 = OpCompositeInsert %24 %180 %649 0
238        %465 = OpCompositeInsert %24 %182 %463 1
239               OpBranch %189
240        %189 = OpLabel
241        %644 = OpPhi %24 %619 %173 %465 %188
242        %651 = OpSelect %50 %187 %66 %639
243               OpBranch %175
244        %175 = OpLabel
245        %197 = OpIAdd %18 %617 %60
246               OpBranch %172
247        %174 = OpLabel
248               OpBranch %166
249        %166 = OpLabel
250        %199 = OpIAdd %18 %567 %60
251               OpBranch %163
252        %165 = OpLabel
253        %201 = OpCompositeExtract %18 %568 0
254        %203 = OpCompositeExtract %18 %568 1
255        %204 = OpIMul %18 %203 %86
256        %205 = OpIAdd %18 %201 %204
257        %206 = OpAccessChain %41 %55 %205
258               OpStore %206 %60
259               OpBranch %161
260        %207 = OpLabel
261        %211 = OpSMod %18 %73 %534
262        %214 = OpIAdd %18 %73 %534
263        %216 = OpSGreaterThanEqual %50 %211 %19
264        %652 = OpSelect %50 %216 %77 %216
265               OpSelectionMerge %224 None
266               OpBranchConditional %652 %223 %224
267        %223 = OpLabel
268        %227 = OpISub %18 %76 %82
269        %230 = OpIMul %18 %98 %86
270        %231 = OpIAdd %18 %227 %230
271        %232 = OpAccessChain %41 %55 %231
272        %233 = OpLoad %18 %232
273        %234 = OpIEqual %50 %233 %19
274               OpBranch %224
275        %224 = OpLabel
276        %235 = OpPhi %50 %652 %207 %234 %223
277               OpSelectionMerge %237 None
278               OpBranchConditional %235 %236 %237
279        %236 = OpLabel
280        %239 = OpISub %18 %211 %60
281        %244 = OpIMul %18 %98 %86
282        %245 = OpIAdd %18 %76 %244
283        %246 = OpAccessChain %41 %55 %245
284               OpStore %246 %60
285        %249 = OpISub %18 %76 %60
286        %253 = OpIAdd %18 %249 %244
287        %254 = OpAccessChain %41 %55 %253
288               OpStore %254 %60
289        %257 = OpISub %18 %76 %82
290        %261 = OpIAdd %18 %257 %244
291        %262 = OpAccessChain %41 %55 %261
292               OpStore %262 %60
293        %479 = OpCompositeInsert %24 %257 %520 0
294               OpBranch %237
295        %237 = OpLabel
296        %550 = OpPhi %24 %520 %224 %479 %236
297        %549 = OpPhi %18 %211 %224 %239 %236
298        %268 = OpSGreaterThanEqual %50 %549 %19
299               OpSelectionMerge %270 None
300               OpBranchConditional %268 %269 %270
301        %269 = OpLabel
302        %272 = OpCompositeExtract %18 %550 1
303        %273 = OpSGreaterThan %50 %272 %19
304               OpBranch %270
305        %270 = OpLabel
306        %274 = OpPhi %50 %268 %237 %273 %269
307               OpSelectionMerge %276 None
308               OpBranchConditional %274 %275 %276
309        %275 = OpLabel
310        %278 = OpCompositeExtract %18 %550 0
311        %280 = OpCompositeExtract %18 %550 1
312        %281 = OpISub %18 %280 %82
313        %282 = OpIMul %18 %281 %86
314        %283 = OpIAdd %18 %278 %282
315        %284 = OpAccessChain %41 %55 %283
316        %285 = OpLoad %18 %284
317        %286 = OpIEqual %50 %285 %19
318               OpBranch %276
319        %276 = OpLabel
320        %287 = OpPhi %50 %274 %270 %286 %275
321               OpSelectionMerge %289 None
322               OpBranchConditional %287 %288 %289
323        %288 = OpLabel
324        %291 = OpISub %18 %549 %60
325        %293 = OpCompositeExtract %18 %550 0
326        %295 = OpCompositeExtract %18 %550 1
327        %296 = OpIMul %18 %295 %86
328        %297 = OpIAdd %18 %293 %296
329        %298 = OpAccessChain %41 %55 %297
330               OpStore %298 %60
331        %303 = OpISub %18 %295 %60
332        %304 = OpIMul %18 %303 %86
333        %305 = OpIAdd %18 %293 %304
334        %306 = OpAccessChain %41 %55 %305
335               OpStore %306 %60
336        %311 = OpISub %18 %295 %82
337        %312 = OpIMul %18 %311 %86
338        %313 = OpIAdd %18 %293 %312
339        %314 = OpAccessChain %41 %55 %313
340               OpStore %314 %60
341        %491 = OpCompositeInsert %24 %311 %550 1
342               OpBranch %289
343        %289 = OpLabel
344        %556 = OpPhi %24 %550 %276 %491 %288
345        %555 = OpPhi %18 %549 %276 %291 %288
346        %320 = OpSGreaterThanEqual %50 %555 %19
347               OpSelectionMerge %322 None
348               OpBranchConditional %320 %321 %322
349        %321 = OpLabel
350        %324 = OpCompositeExtract %18 %556 0
351        %325 = OpSLessThan %50 %324 %119
352               OpBranch %322
353        %322 = OpLabel
354        %326 = OpPhi %50 %320 %289 %325 %321
355               OpSelectionMerge %328 None
356               OpBranchConditional %326 %327 %328
357        %327 = OpLabel
358        %330 = OpCompositeExtract %18 %556 0
359        %331 = OpIAdd %18 %330 %82
360        %333 = OpCompositeExtract %18 %556 1
361        %334 = OpIMul %18 %333 %86
362        %335 = OpIAdd %18 %331 %334
363        %336 = OpAccessChain %41 %55 %335
364        %337 = OpLoad %18 %336
365        %338 = OpIEqual %50 %337 %19
366               OpBranch %328
367        %328 = OpLabel
368        %339 = OpPhi %50 %326 %322 %338 %327
369               OpSelectionMerge %341 None
370               OpBranchConditional %339 %340 %341
371        %340 = OpLabel
372        %343 = OpISub %18 %555 %60
373        %345 = OpCompositeExtract %18 %556 0
374        %347 = OpCompositeExtract %18 %556 1
375        %348 = OpIMul %18 %347 %86
376        %349 = OpIAdd %18 %345 %348
377        %350 = OpAccessChain %41 %55 %349
378               OpStore %350 %60
379        %353 = OpIAdd %18 %345 %60
380        %357 = OpIAdd %18 %353 %348
381        %358 = OpAccessChain %41 %55 %357
382               OpStore %358 %60
383        %361 = OpIAdd %18 %345 %82
384        %365 = OpIAdd %18 %361 %348
385        %366 = OpAccessChain %41 %55 %365
386               OpStore %366 %60
387        %503 = OpCompositeInsert %24 %361 %556 0
388               OpBranch %341
389        %341 = OpLabel
390        %562 = OpPhi %24 %556 %328 %503 %340
391        %561 = OpPhi %18 %555 %328 %343 %340
392        %372 = OpSGreaterThanEqual %50 %561 %19
393               OpSelectionMerge %374 None
394               OpBranchConditional %372 %373 %374
395        %373 = OpLabel
396        %376 = OpCompositeExtract %18 %562 1
397        %377 = OpSLessThan %50 %376 %119
398               OpBranch %374
399        %374 = OpLabel
400        %378 = OpPhi %50 %372 %341 %377 %373
401               OpSelectionMerge %380 None
402               OpBranchConditional %378 %379 %380
403        %379 = OpLabel
404        %382 = OpCompositeExtract %18 %562 0
405        %384 = OpCompositeExtract %18 %562 1
406        %385 = OpIAdd %18 %384 %82
407        %386 = OpIMul %18 %385 %86
408        %387 = OpIAdd %18 %382 %386
409        %388 = OpAccessChain %41 %55 %387
410        %389 = OpLoad %18 %388
411        %390 = OpIEqual %50 %389 %19
412               OpBranch %380
413        %380 = OpLabel
414        %391 = OpPhi %50 %378 %374 %390 %379
415               OpSelectionMerge %393 None
416               OpBranchConditional %391 %392 %393
417        %392 = OpLabel
418        %397 = OpCompositeExtract %18 %562 0
419        %399 = OpCompositeExtract %18 %562 1
420        %400 = OpIMul %18 %399 %86
421        %401 = OpIAdd %18 %397 %400
422        %402 = OpAccessChain %41 %55 %401
423               OpStore %402 %60
424        %407 = OpIAdd %18 %399 %60
425        %408 = OpIMul %18 %407 %86
426        %409 = OpIAdd %18 %397 %408
427        %410 = OpAccessChain %41 %55 %409
428               OpStore %410 %60
429        %415 = OpIAdd %18 %399 %82
430        %416 = OpIMul %18 %415 %86
431        %417 = OpIAdd %18 %397 %416
432        %418 = OpAccessChain %41 %55 %417
433               OpStore %418 %60
434        %515 = OpCompositeInsert %24 %415 %562 1
435               OpBranch %393
436        %393 = OpLabel
437        %638 = OpPhi %24 %562 %380 %515 %392
438               OpBranch %161
439        %161 = OpLabel
440        %637 = OpPhi %24 %568 %165 %638 %393
441        %621 = OpPhi %18 %73 %165 %214 %393
442        %569 = OpPhi %50 %570 %165 %591 %393
443        %425 = OpIMul %18 %39 %86
444        %428 = OpIAdd %18 %425 %34
445        %429 = OpAccessChain %41 %55 %428
446        %430 = OpLoad %18 %429
447        %431 = OpIEqual %50 %430 %60
448               OpSelectionMerge %433 None
449               OpBranchConditional %431 %432 %433
450        %432 = OpLabel
451               OpStore %435 %437
452               OpBranch %70
453        %433 = OpLabel
454               OpBranch %71
455         %71 = OpLabel
456               OpBranchConditional %569 %68 %70
457         %70 = OpLabel
458        %592 = OpPhi %50 %66 %432 %162 %71
459               OpSelectionMerge %445 None
460               OpBranchConditional %592 %442 %445
461        %445 = OpLabel
462               OpStore %435 %441
463               OpBranch %442
464        %442 = OpLabel
465               OpReturn
466               OpFunctionEnd
467END
468
469# uniforms for reference
470
471# resolution
472BUFFER reference_resolution DATA_TYPE vec2<float> STD140 DATA
473 32.0 32.0
474END
475
476BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
477
478PIPELINE graphics reference_pipeline
479  ATTACH reference_vertex_shader
480  ATTACH reference_fragment_shader
481  FRAMEBUFFER_SIZE 32 32
482  BIND BUFFER reference_framebuffer AS color LOCATION 0
483  BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
484END
485CLEAR_COLOR reference_pipeline 0 0 0 255
486
487CLEAR reference_pipeline
488RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 32 32
489
490
491SHADER vertex variant_vertex_shader PASSTHROUGH
492
493SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
494; SPIR-V
495; Version: 1.0
496; Generator: Khronos Glslang Reference Front End; 7
497; Bound: 822
498; Schema: 0
499               OpCapability Shader
500          %1 = OpExtInstImport "GLSL.std.450"
501               OpMemoryModel Logical GLSL450
502               OpEntryPoint Fragment %4 "main" %12 %435
503               OpExecutionMode %4 OriginUpperLeft
504               OpSource ESSL 320
505               OpName %4 "main"
506               OpName %12 "gl_FragCoord"
507               OpName %15 "buf0"
508               OpMemberName %15 0 "resolution"
509               OpName %17 ""
510               OpName %55 "map"
511               OpName %435 "_GLF_color"
512               OpDecorate %12 BuiltIn FragCoord
513               OpMemberDecorate %15 0 Offset 0
514               OpDecorate %15 Block
515               OpDecorate %17 DescriptorSet 0
516               OpDecorate %17 Binding 0
517               OpDecorate %435 Location 0
518          %2 = OpTypeVoid
519          %3 = OpTypeFunction %2
520          %6 = OpTypeFloat 32
521          %7 = OpTypeVector %6 2
522         %10 = OpTypeVector %6 4
523         %11 = OpTypePointer Input %10
524         %12 = OpVariable %11 Input
525         %15 = OpTypeStruct %7
526         %16 = OpTypePointer Uniform %15
527         %17 = OpVariable %16 Uniform
528         %18 = OpTypeInt 32 1
529         %19 = OpConstant %18 0
530         %20 = OpTypePointer Uniform %7
531         %24 = OpTypeVector %18 2
532         %27 = OpTypeInt 32 0
533         %28 = OpConstant %27 0
534         %32 = OpConstant %6 16
535         %41 = OpTypePointer Function %18
536         %49 = OpConstant %18 256
537         %50 = OpTypeBool
538         %52 = OpConstant %27 256
539         %53 = OpTypeArray %18 %52
540         %60 = OpConstant %18 1
541         %63 = OpConstantComposite %24 %19 %19
542         %66 = OpConstantTrue %50
543         %82 = OpConstant %18 2
544         %86 = OpConstant %18 16
545        %119 = OpConstant %18 14
546        %162 = OpConstantFalse %50
547        %169 = OpConstant %18 8
548        %434 = OpTypePointer Output %10
549        %435 = OpVariable %434 Output
550        %436 = OpConstant %6 1
551        %437 = OpConstantComposite %10 %436 %436 %436 %436
552        %440 = OpConstant %6 0
553        %441 = OpConstantComposite %10 %440 %440 %440 %436
554        %447 = OpTypePointer Function %53
555        %648 = OpConstant %18 32
556        %649 = OpUndef %24
557        %753 = OpTypePointer Private %24
558        %754 = OpVariable %753 Private %63
559        %759 = OpTypePointer Private %18
560          %4 = OpFunction %2 None %3
561          %5 = OpLabel
562         %55 = OpVariable %447 Function
563               OpSelectionMerge %442 None
564               OpSwitch %28 %443
565        %443 = OpLabel
566         %13 = OpLoad %10 %12
567         %14 = OpVectorShuffle %7 %13 %13 0 1
568         %21 = OpAccessChain %20 %17 %19
569         %22 = OpLoad %7 %21
570         %23 = OpFDiv %7 %14 %22
571         %31 = OpCompositeExtract %6 %23 0
572         %33 = OpFMul %6 %31 %32
573         %34 = OpConvertFToS %18 %33
574         %37 = OpCompositeExtract %6 %23 1
575         %38 = OpFMul %6 %37 %32
576         %39 = OpConvertFToS %18 %38
577        %813 = OpULessThanEqual %50 %19 %60
578        %814 = OpSelect %18 %813 %19 %60
579        %815 = OpAccessChain %759 %754 %814
580               OpBranch %43
581         %43 = OpLabel
582        %518 = OpPhi %18 %19 %443 %61 %44
583         %51 = OpSLessThan %50 %518 %49
584               OpLoopMerge %45 %44 None
585               OpBranchConditional %51 %44 %45
586         %44 = OpLabel
587         %58 = OpAccessChain %41 %55 %518
588               OpStore %58 %19
589         %61 = OpIAdd %18 %518 %60
590               OpBranch %43
591         %45 = OpLabel
592               OpBranch %68
593         %68 = OpLabel
594        %591 = OpPhi %50 %66 %45 %569 %71
595        %520 = OpPhi %24 %63 %45 %637 %71
596        %519 = OpPhi %18 %19 %45 %621 %71
597        %821 = OpAccessChain %759 %815
598               OpLoopMerge %70 %71 None
599               OpBranch %69
600         %69 = OpLabel
601         %73 = OpIAdd %18 %519 %60
602               OpStore %754 %520
603        %755 = OpLoad %24 %754
604         %76 = OpCompositeExtract %18 %520 0
605         %77 = OpSGreaterThan %50 %76 %19
606               OpSelectionMerge %79 None
607               OpBranchConditional %77 %78 %79
608         %78 = OpLabel
609         %83 = OpISub %18 %76 %82
610         %85 = OpCompositeExtract %18 %520 1
611         %87 = OpIMul %18 %85 %86
612         %88 = OpIAdd %18 %83 %87
613         %89 = OpAccessChain %41 %55 %88
614         %90 = OpLoad %18 %89
615         %91 = OpIEqual %50 %90 %19
616               OpBranch %79
617         %79 = OpLabel
618         %92 = OpPhi %50 %77 %69 %91 %78
619        %650 = OpSelect %18 %92 %60 %19
620         %98 = OpCompositeExtract %18 %520 1
621         %99 = OpSGreaterThan %50 %98 %19
622               OpSelectionMerge %101 None
623               OpBranchConditional %99 %100 %101
624        %100 = OpLabel
625        %106 = OpISub %18 %98 %82
626        %107 = OpIMul %18 %106 %86
627        %108 = OpIAdd %18 %76 %107
628        %109 = OpAccessChain %41 %55 %108
629        %110 = OpLoad %18 %109
630        %111 = OpIEqual %50 %110 %19
631               OpBranch %101
632        %101 = OpLabel
633        %112 = OpPhi %50 %99 %79 %111 %100
634               OpSelectionMerge %114 None
635               OpBranchConditional %112 %113 %114
636        %113 = OpLabel
637        %116 = OpIAdd %18 %650 %60
638               OpBranch %114
639        %114 = OpLabel
640        %529 = OpPhi %18 %650 %101 %116 %113
641        %120 = OpSLessThan %50 %76 %119
642               OpSelectionMerge %122 None
643               OpBranchConditional %120 %121 %122
644        %121 = OpLabel
645        %125 = OpIAdd %18 %76 %82
646        %128 = OpIMul %18 %98 %86
647        %129 = OpIAdd %18 %125 %128
648        %130 = OpAccessChain %41 %55 %129
649        %131 = OpLoad %18 %130
650        %132 = OpIEqual %50 %131 %19
651               OpBranch %122
652        %122 = OpLabel
653        %133 = OpPhi %50 %120 %114 %132 %121
654               OpSelectionMerge %135 None
655               OpBranchConditional %133 %134 %135
656        %134 = OpLabel
657        %137 = OpIAdd %18 %529 %60
658               OpBranch %135
659        %135 = OpLabel
660        %533 = OpPhi %18 %529 %122 %137 %134
661        %140 = OpSLessThan %50 %98 %119
662               OpSelectionMerge %142 None
663               OpBranchConditional %140 %141 %142
664        %141 = OpLabel
665        %147 = OpIAdd %18 %98 %82
666        %148 = OpIMul %18 %147 %86
667        %149 = OpIAdd %18 %76 %148
668        %150 = OpAccessChain %41 %55 %149
669        %151 = OpLoad %18 %150
670        %152 = OpIEqual %50 %151 %19
671               OpBranch %142
672        %142 = OpLabel
673        %153 = OpPhi %50 %140 %135 %152 %141
674               OpSelectionMerge %155 None
675               OpBranchConditional %153 %154 %155
676        %154 = OpLabel
677        %157 = OpIAdd %18 %533 %60
678               OpBranch %155
679        %155 = OpLabel
680        %534 = OpPhi %18 %533 %142 %157 %154
681        %159 = OpIEqual %50 %534 %19
682               OpSelectionMerge %161 None
683               OpBranchConditional %159 %160 %207
684        %160 = OpLabel
685               OpBranch %163
686        %163 = OpLabel
687        %570 = OpPhi %50 %162 %160 %639 %166
688        %568 = OpPhi %24 %520 %160 %619 %166
689        %567 = OpPhi %18 %19 %160 %199 %166
690        %170 = OpSLessThan %50 %567 %169
691               OpLoopMerge %165 %166 None
692               OpBranchConditional %170 %164 %165
693        %164 = OpLabel
694               OpBranch %172
695        %172 = OpLabel
696        %619 = OpPhi %24 %568 %164 %644 %175
697        %617 = OpPhi %18 %19 %164 %197 %175
698        %639 = OpPhi %50 %570 %164 %651 %175
699        %178 = OpSLessThan %50 %617 %169
700               OpLoopMerge %174 %175 None
701               OpBranchConditional %178 %173 %174
702        %173 = OpLabel
703        %180 = OpIMul %18 %617 %82
704        %182 = OpIMul %18 %567 %82
705        %183 = OpIMul %18 %567 %648
706        %184 = OpIAdd %18 %180 %183
707        %185 = OpAccessChain %41 %55 %184
708        %186 = OpLoad %18 %185
709        %187 = OpIEqual %50 %186 %19
710               OpSelectionMerge %189 None
711               OpBranchConditional %187 %188 %189
712        %188 = OpLabel
713        %463 = OpCompositeInsert %24 %180 %649 0
714        %465 = OpCompositeInsert %24 %182 %463 1
715               OpBranch %189
716        %189 = OpLabel
717        %644 = OpPhi %24 %619 %173 %465 %188
718        %651 = OpSelect %50 %187 %66 %639
719               OpBranch %175
720        %175 = OpLabel
721        %197 = OpIAdd %18 %617 %60
722               OpBranch %172
723        %174 = OpLabel
724               OpBranch %166
725        %166 = OpLabel
726        %199 = OpIAdd %18 %567 %60
727               OpBranch %163
728        %165 = OpLabel
729        %201 = OpCompositeExtract %18 %568 0
730        %203 = OpCompositeExtract %18 %568 1
731        %204 = OpIMul %18 %203 %86
732        %205 = OpIAdd %18 %201 %204
733        %206 = OpAccessChain %41 %55 %205
734               OpStore %206 %60
735               OpBranch %161
736        %207 = OpLabel
737        %211 = OpSMod %18 %73 %534
738        %214 = OpIAdd %18 %73 %534
739        %216 = OpSGreaterThanEqual %50 %211 %19
740        %652 = OpSelect %50 %216 %77 %216
741               OpSelectionMerge %224 None
742               OpBranchConditional %652 %223 %224
743        %223 = OpLabel
744        %227 = OpISub %18 %76 %82
745        %230 = OpIMul %18 %98 %86
746        %231 = OpIAdd %18 %227 %230
747        %232 = OpAccessChain %41 %55 %231
748        %233 = OpLoad %18 %232
749        %234 = OpIEqual %50 %233 %19
750               OpBranch %224
751        %224 = OpLabel
752        %235 = OpPhi %50 %652 %207 %234 %223
753               OpSelectionMerge %237 None
754               OpBranchConditional %235 %236 %237
755        %236 = OpLabel
756        %239 = OpISub %18 %211 %60
757        %244 = OpIMul %18 %98 %86
758        %245 = OpIAdd %18 %76 %244
759        %246 = OpAccessChain %41 %55 %245
760               OpStore %246 %60
761        %249 = OpISub %18 %76 %60
762        %253 = OpIAdd %18 %249 %244
763        %254 = OpAccessChain %41 %55 %253
764               OpStore %254 %60
765        %257 = OpISub %18 %76 %82
766        %261 = OpIAdd %18 %257 %244
767        %262 = OpAccessChain %41 %55 %261
768               OpStore %262 %60
769        %479 = OpCompositeInsert %24 %257 %520 0
770               OpBranch %237
771        %237 = OpLabel
772        %550 = OpPhi %24 %520 %224 %479 %236
773        %549 = OpPhi %18 %211 %224 %239 %236
774        %268 = OpSGreaterThanEqual %50 %549 %19
775               OpSelectionMerge %270 None
776               OpBranchConditional %268 %269 %270
777        %269 = OpLabel
778        %272 = OpCompositeExtract %18 %550 1
779        %273 = OpSGreaterThan %50 %272 %19
780               OpBranch %270
781        %270 = OpLabel
782        %274 = OpPhi %50 %268 %237 %273 %269
783               OpSelectionMerge %276 None
784               OpBranchConditional %274 %275 %276
785        %275 = OpLabel
786        %278 = OpCompositeExtract %18 %550 0
787        %280 = OpCompositeExtract %18 %550 1
788        %281 = OpISub %18 %280 %82
789        %282 = OpIMul %18 %281 %86
790        %283 = OpIAdd %18 %278 %282
791        %284 = OpAccessChain %41 %55 %283
792        %285 = OpLoad %18 %284
793        %286 = OpIEqual %50 %285 %19
794               OpBranch %276
795        %276 = OpLabel
796        %287 = OpPhi %50 %274 %270 %286 %275
797               OpSelectionMerge %289 None
798               OpBranchConditional %287 %288 %289
799        %288 = OpLabel
800        %291 = OpISub %18 %549 %60
801        %293 = OpCompositeExtract %18 %550 0
802        %295 = OpCompositeExtract %18 %550 1
803        %296 = OpIMul %18 %295 %86
804        %297 = OpIAdd %18 %293 %296
805        %298 = OpAccessChain %41 %55 %297
806               OpStore %298 %60
807        %303 = OpISub %18 %295 %60
808        %304 = OpIMul %18 %303 %86
809        %305 = OpIAdd %18 %293 %304
810        %306 = OpAccessChain %41 %55 %305
811               OpStore %306 %60
812        %311 = OpISub %18 %295 %82
813        %312 = OpIMul %18 %311 %86
814        %313 = OpIAdd %18 %293 %312
815        %314 = OpAccessChain %41 %55 %313
816               OpStore %314 %60
817        %491 = OpCompositeInsert %24 %311 %550 1
818               OpBranch %289
819        %289 = OpLabel
820        %556 = OpPhi %24 %550 %276 %491 %288
821        %555 = OpPhi %18 %549 %276 %291 %288
822        %320 = OpSGreaterThanEqual %50 %555 %19
823               OpSelectionMerge %322 None
824               OpBranchConditional %320 %321 %322
825        %321 = OpLabel
826        %324 = OpCompositeExtract %18 %556 0
827        %325 = OpSLessThan %50 %324 %119
828               OpBranch %322
829        %322 = OpLabel
830        %326 = OpPhi %50 %320 %289 %325 %321
831               OpSelectionMerge %328 None
832               OpBranchConditional %326 %327 %328
833        %327 = OpLabel
834        %330 = OpCompositeExtract %18 %556 0
835        %331 = OpIAdd %18 %330 %82
836        %333 = OpCompositeExtract %18 %556 1
837        %334 = OpIMul %18 %333 %86
838        %335 = OpIAdd %18 %331 %334
839        %336 = OpAccessChain %41 %55 %335
840        %337 = OpLoad %18 %336
841        %338 = OpIEqual %50 %337 %19
842               OpBranch %328
843        %328 = OpLabel
844        %339 = OpPhi %50 %326 %322 %338 %327
845               OpSelectionMerge %341 None
846               OpBranchConditional %339 %340 %341
847        %340 = OpLabel
848        %343 = OpISub %18 %555 %60
849        %345 = OpCompositeExtract %18 %556 0
850        %347 = OpCompositeExtract %18 %556 1
851        %348 = OpIMul %18 %347 %86
852        %349 = OpIAdd %18 %345 %348
853        %350 = OpAccessChain %41 %55 %349
854               OpStore %350 %60
855        %353 = OpIAdd %18 %345 %60
856        %357 = OpIAdd %18 %353 %348
857        %358 = OpAccessChain %41 %55 %357
858               OpStore %358 %60
859        %361 = OpIAdd %18 %345 %82
860        %365 = OpIAdd %18 %361 %348
861        %366 = OpAccessChain %41 %55 %365
862               OpStore %366 %60
863        %503 = OpCompositeInsert %24 %361 %556 0
864               OpBranch %341
865        %341 = OpLabel
866        %562 = OpPhi %24 %556 %328 %503 %340
867        %561 = OpPhi %18 %555 %328 %343 %340
868        %372 = OpSGreaterThanEqual %50 %561 %19
869               OpSelectionMerge %374 None
870               OpBranchConditional %372 %373 %374
871        %373 = OpLabel
872        %376 = OpCompositeExtract %18 %562 1
873        %377 = OpSLessThan %50 %376 %119
874               OpBranch %374
875        %374 = OpLabel
876        %378 = OpPhi %50 %372 %341 %377 %373
877               OpSelectionMerge %380 None
878               OpBranchConditional %378 %379 %380
879        %379 = OpLabel
880        %382 = OpCompositeExtract %18 %562 0
881        %384 = OpCompositeExtract %18 %562 1
882        %385 = OpIAdd %18 %384 %82
883        %386 = OpIMul %18 %385 %86
884        %387 = OpIAdd %18 %382 %386
885        %388 = OpAccessChain %41 %55 %387
886        %389 = OpLoad %18 %388
887        %390 = OpIEqual %50 %389 %19
888               OpBranch %380
889        %380 = OpLabel
890        %391 = OpPhi %50 %378 %374 %390 %379
891               OpSelectionMerge %393 None
892               OpBranchConditional %391 %392 %393
893        %392 = OpLabel
894        %397 = OpCompositeExtract %18 %562 0
895        %399 = OpCompositeExtract %18 %562 1
896        %400 = OpIMul %18 %399 %86
897        %401 = OpIAdd %18 %397 %400
898        %402 = OpAccessChain %41 %55 %401
899               OpStore %402 %60
900        %407 = OpIAdd %18 %399 %60
901        %408 = OpIMul %18 %407 %86
902        %409 = OpIAdd %18 %397 %408
903        %410 = OpAccessChain %41 %55 %409
904               OpStore %410 %60
905        %415 = OpIAdd %18 %399 %82
906        %416 = OpIMul %18 %415 %86
907        %417 = OpIAdd %18 %397 %416
908        %418 = OpAccessChain %41 %55 %417
909               OpStore %418 %60
910        %515 = OpCompositeInsert %24 %415 %562 1
911               OpBranch %393
912        %393 = OpLabel
913        %638 = OpPhi %24 %562 %380 %515 %392
914               OpBranch %161
915        %161 = OpLabel
916        %637 = OpPhi %24 %568 %165 %638 %393
917        %621 = OpPhi %18 %73 %165 %214 %393
918        %569 = OpPhi %50 %570 %165 %591 %393
919        %425 = OpIMul %18 %39 %86
920        %428 = OpIAdd %18 %425 %34
921        %429 = OpAccessChain %41 %55 %428
922        %430 = OpLoad %18 %429
923        %431 = OpIEqual %50 %430 %60
924               OpSelectionMerge %433 None
925               OpBranchConditional %431 %432 %433
926        %432 = OpLabel
927               OpStore %435 %437
928               OpBranch %70
929        %433 = OpLabel
930               OpBranch %71
931         %71 = OpLabel
932               OpBranchConditional %569 %68 %70
933         %70 = OpLabel
934        %592 = OpPhi %50 %66 %432 %162 %71
935               OpSelectionMerge %445 None
936               OpBranchConditional %592 %442 %445
937        %445 = OpLabel
938               OpStore %435 %441
939               OpBranch %442
940        %442 = OpLabel
941               OpReturn
942               OpFunctionEnd
943END
944
945# uniforms for variant
946
947# resolution
948BUFFER variant_resolution DATA_TYPE vec2<float> STD140 DATA
949 32.0 32.0
950END
951
952BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
953
954PIPELINE graphics variant_pipeline
955  ATTACH variant_vertex_shader
956  ATTACH variant_fragment_shader
957  FRAMEBUFFER_SIZE 32 32
958  BIND BUFFER variant_framebuffer AS color LOCATION 0
959  BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
960END
961CLEAR_COLOR variant_pipeline 0 0 0 255
962
963CLEAR variant_pipeline
964RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 32 32
965
966EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
967