1e5c31af7Sopenharmony_ci#!amber
2e5c31af7Sopenharmony_ci
3e5c31af7Sopenharmony_ci# Copyright 2020 Google LLC
4e5c31af7Sopenharmony_ci#
5e5c31af7Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
6e5c31af7Sopenharmony_ci# you may not use this file except in compliance with the License.
7e5c31af7Sopenharmony_ci# You may obtain a copy of the License at
8e5c31af7Sopenharmony_ci#
9e5c31af7Sopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
10e5c31af7Sopenharmony_ci#
11e5c31af7Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
12e5c31af7Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
13e5c31af7Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e5c31af7Sopenharmony_ci# See the License for the specific language governing permissions and
15e5c31af7Sopenharmony_ci# limitations under the License.
16e5c31af7Sopenharmony_ci
17e5c31af7Sopenharmony_ci
18e5c31af7Sopenharmony_ci# A test for a coverage-gap found by GraphicsFuzz.
19e5c31af7Sopenharmony_ci
20e5c31af7Sopenharmony_ci# Short description: A fragment shader that covers a specific mem pass code path.
21e5c31af7Sopenharmony_ci
22e5c31af7Sopenharmony_ci# The test passes because shader always writes red.
23e5c31af7Sopenharmony_ci
24e5c31af7Sopenharmony_ci# Optimized using spirv-opt with the following arguments:
25e5c31af7Sopenharmony_ci# '--redundancy-elimination'
26e5c31af7Sopenharmony_ci# '--eliminate-dead-inserts'
27e5c31af7Sopenharmony_ci# '--private-to-local'
28e5c31af7Sopenharmony_ci# '--redundancy-elimination'
29e5c31af7Sopenharmony_ci# '--eliminate-local-multi-store'
30e5c31af7Sopenharmony_ci# '--if-conversion'
31e5c31af7Sopenharmony_ci# '--scalar-replacement=100'
32e5c31af7Sopenharmony_ci# '--combine-access-chains'
33e5c31af7Sopenharmony_ci# '--reduce-load-size'
34e5c31af7Sopenharmony_ci# '--eliminate-dead-branches'
35e5c31af7Sopenharmony_ci# '--merge-return'
36e5c31af7Sopenharmony_ci# '--eliminate-local-single-block'
37e5c31af7Sopenharmony_ci# '--if-conversion'
38e5c31af7Sopenharmony_ci# '--private-to-local'
39e5c31af7Sopenharmony_ci# '--eliminate-dead-inserts'
40e5c31af7Sopenharmony_ci# '--copy-propagate-arrays'
41e5c31af7Sopenharmony_ci# '--inline-entry-points-exhaustive'
42e5c31af7Sopenharmony_ci# '--copy-propagate-arrays'
43e5c31af7Sopenharmony_ci# '--convert-local-access-chains'
44e5c31af7Sopenharmony_ci# spirv-opt commit hash: 9215c1b7df0029f27807e8c8d7ec80532ce90a87
45e5c31af7Sopenharmony_ci
46e5c31af7Sopenharmony_ci
47e5c31af7Sopenharmony_ci
48e5c31af7Sopenharmony_ciSHADER vertex variant_vertex_shader PASSTHROUGH
49e5c31af7Sopenharmony_ci
50e5c31af7Sopenharmony_ci# variant_fragment_shader is derived from the following GLSL:
51e5c31af7Sopenharmony_ci# #version 310 es
52e5c31af7Sopenharmony_ci# precision highp float;
53e5c31af7Sopenharmony_ci# precision highp int;
54e5c31af7Sopenharmony_ci#
55e5c31af7Sopenharmony_ci# layout(location = 0) out vec4 _GLF_color;
56e5c31af7Sopenharmony_ci# layout(set = 0, binding = 0) uniform buf0
57e5c31af7Sopenharmony_ci# {
58e5c31af7Sopenharmony_ci#     int one;
59e5c31af7Sopenharmony_ci# };
60e5c31af7Sopenharmony_ci#
61e5c31af7Sopenharmony_ci# struct S
62e5c31af7Sopenharmony_ci# {
63e5c31af7Sopenharmony_ci#     int a;
64e5c31af7Sopenharmony_ci#     int b;
65e5c31af7Sopenharmony_ci#     int c;
66e5c31af7Sopenharmony_ci# };
67e5c31af7Sopenharmony_ci#
68e5c31af7Sopenharmony_ci# int func(S s, int x)
69e5c31af7Sopenharmony_ci# {
70e5c31af7Sopenharmony_ci#     s.a = x;
71e5c31af7Sopenharmony_ci#
72e5c31af7Sopenharmony_ci#     // Always false.
73e5c31af7Sopenharmony_ci#     if(s.a == 2)
74e5c31af7Sopenharmony_ci#         s.a = 9;
75e5c31af7Sopenharmony_ci#
76e5c31af7Sopenharmony_ci#     s.b = x + 1;
77e5c31af7Sopenharmony_ci#     s.c = x + 2;
78e5c31af7Sopenharmony_ci#
79e5c31af7Sopenharmony_ci#     // Always false.
80e5c31af7Sopenharmony_ci#     if(s.b == 2)
81e5c31af7Sopenharmony_ci#         s.b = 7;
82e5c31af7Sopenharmony_ci#
83e5c31af7Sopenharmony_ci#     return s.a + s.b + s.c;
84e5c31af7Sopenharmony_ci# }
85e5c31af7Sopenharmony_ci#
86e5c31af7Sopenharmony_ci# void main()
87e5c31af7Sopenharmony_ci# {
88e5c31af7Sopenharmony_ci#     S arr[2];
89e5c31af7Sopenharmony_ci#     arr[one].a = 2;
90e5c31af7Sopenharmony_ci#
91e5c31af7Sopenharmony_ci#     // Always false.
92e5c31af7Sopenharmony_ci#     if(arr[1].a < 1)
93e5c31af7Sopenharmony_ci#     {
94e5c31af7Sopenharmony_ci#         _GLF_color = vec4(0);
95e5c31af7Sopenharmony_ci#         return;
96e5c31af7Sopenharmony_ci#     }
97e5c31af7Sopenharmony_ci#     else
98e5c31af7Sopenharmony_ci#     {
99e5c31af7Sopenharmony_ci#         if (func(arr[1], 2 + one) == 12)
100e5c31af7Sopenharmony_ci#             _GLF_color = vec4(1, 0, 0, 1);
101e5c31af7Sopenharmony_ci#         else
102e5c31af7Sopenharmony_ci#             _GLF_color = vec4(0);
103e5c31af7Sopenharmony_ci#     }
104e5c31af7Sopenharmony_ci# }
105e5c31af7Sopenharmony_ciSHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
106e5c31af7Sopenharmony_ci; SPIR-V
107e5c31af7Sopenharmony_ci; Version: 1.0
108e5c31af7Sopenharmony_ci; Generator: Khronos Glslang Reference Front End; 8
109e5c31af7Sopenharmony_ci; Bound: 136
110e5c31af7Sopenharmony_ci; Schema: 0
111e5c31af7Sopenharmony_ci               OpCapability Shader
112e5c31af7Sopenharmony_ci          %1 = OpExtInstImport "GLSL.std.450"
113e5c31af7Sopenharmony_ci               OpMemoryModel Logical GLSL450
114e5c31af7Sopenharmony_ci               OpEntryPoint Fragment %4 "main" %71
115e5c31af7Sopenharmony_ci               OpExecutionMode %4 OriginUpperLeft
116e5c31af7Sopenharmony_ci               OpSource ESSL 310
117e5c31af7Sopenharmony_ci               OpName %4 "main"
118e5c31af7Sopenharmony_ci               OpName %7 "S"
119e5c31af7Sopenharmony_ci               OpMemberName %7 0 "a"
120e5c31af7Sopenharmony_ci               OpMemberName %7 1 "b"
121e5c31af7Sopenharmony_ci               OpMemberName %7 2 "c"
122e5c31af7Sopenharmony_ci               OpName %13 "func(struct-S-i1-i1-i11;i1;"
123e5c31af7Sopenharmony_ci               OpName %11 "s"
124e5c31af7Sopenharmony_ci               OpName %12 "x"
125e5c31af7Sopenharmony_ci               OpName %55 "arr"
126e5c31af7Sopenharmony_ci               OpName %56 "buf0"
127e5c31af7Sopenharmony_ci               OpMemberName %56 0 "one"
128e5c31af7Sopenharmony_ci               OpName %58 ""
129e5c31af7Sopenharmony_ci               OpName %71 "_GLF_color"
130e5c31af7Sopenharmony_ci               OpName %79 "param"
131e5c31af7Sopenharmony_ci               OpName %82 "param"
132e5c31af7Sopenharmony_ci               OpMemberDecorate %56 0 Offset 0
133e5c31af7Sopenharmony_ci               OpDecorate %56 Block
134e5c31af7Sopenharmony_ci               OpDecorate %58 DescriptorSet 0
135e5c31af7Sopenharmony_ci               OpDecorate %58 Binding 0
136e5c31af7Sopenharmony_ci               OpDecorate %71 Location 0
137e5c31af7Sopenharmony_ci          %2 = OpTypeVoid
138e5c31af7Sopenharmony_ci          %3 = OpTypeFunction %2
139e5c31af7Sopenharmony_ci          %6 = OpTypeInt 32 1
140e5c31af7Sopenharmony_ci          %7 = OpTypeStruct %6 %6 %6
141e5c31af7Sopenharmony_ci          %8 = OpTypePointer Function %7
142e5c31af7Sopenharmony_ci          %9 = OpTypePointer Function %6
143e5c31af7Sopenharmony_ci         %10 = OpTypeFunction %6 %8 %9
144e5c31af7Sopenharmony_ci         %15 = OpConstant %6 0
145e5c31af7Sopenharmony_ci         %20 = OpConstant %6 2
146e5c31af7Sopenharmony_ci         %21 = OpTypeBool
147e5c31af7Sopenharmony_ci         %25 = OpConstant %6 9
148e5c31af7Sopenharmony_ci         %27 = OpConstant %6 1
149e5c31af7Sopenharmony_ci         %39 = OpConstant %6 7
150e5c31af7Sopenharmony_ci         %51 = OpTypeInt 32 0
151e5c31af7Sopenharmony_ci         %52 = OpConstant %51 2
152e5c31af7Sopenharmony_ci         %53 = OpTypeArray %7 %52
153e5c31af7Sopenharmony_ci         %54 = OpTypePointer Function %53
154e5c31af7Sopenharmony_ci         %56 = OpTypeStruct %6
155e5c31af7Sopenharmony_ci         %57 = OpTypePointer Uniform %56
156e5c31af7Sopenharmony_ci         %58 = OpVariable %57 Uniform
157e5c31af7Sopenharmony_ci         %59 = OpTypePointer Uniform %6
158e5c31af7Sopenharmony_ci         %68 = OpTypeFloat 32
159e5c31af7Sopenharmony_ci         %69 = OpTypeVector %68 4
160e5c31af7Sopenharmony_ci         %70 = OpTypePointer Output %69
161e5c31af7Sopenharmony_ci         %71 = OpVariable %70 Output
162e5c31af7Sopenharmony_ci         %72 = OpConstant %68 0
163e5c31af7Sopenharmony_ci         %73 = OpConstantComposite %69 %72 %72 %72 %72
164e5c31af7Sopenharmony_ci         %84 = OpConstant %6 12
165e5c31af7Sopenharmony_ci         %88 = OpConstant %68 1
166e5c31af7Sopenharmony_ci         %89 = OpConstantComposite %69 %88 %72 %72 %88
167e5c31af7Sopenharmony_ci         %95 = OpConstantFalse %21
168e5c31af7Sopenharmony_ci         %96 = OpTypePointer Function %21
169e5c31af7Sopenharmony_ci         %98 = OpConstantTrue %21
170e5c31af7Sopenharmony_ci          %4 = OpFunction %2 None %3
171e5c31af7Sopenharmony_ci          %5 = OpLabel
172e5c31af7Sopenharmony_ci         %99 = OpVariable %9 Function
173e5c31af7Sopenharmony_ci         %97 = OpVariable %96 Function %95
174e5c31af7Sopenharmony_ci         %55 = OpVariable %54 Function
175e5c31af7Sopenharmony_ci         %79 = OpVariable %8 Function
176e5c31af7Sopenharmony_ci         %82 = OpVariable %9 Function
177e5c31af7Sopenharmony_ci               OpBranch %92
178e5c31af7Sopenharmony_ci         %92 = OpLabel
179e5c31af7Sopenharmony_ci               OpLoopMerge %91 %94 None
180e5c31af7Sopenharmony_ci               OpBranch %93
181e5c31af7Sopenharmony_ci         %93 = OpLabel
182e5c31af7Sopenharmony_ci         %60 = OpAccessChain %59 %58 %15
183e5c31af7Sopenharmony_ci         %61 = OpLoad %6 %60
184e5c31af7Sopenharmony_ci         %62 = OpAccessChain %9 %55 %61 %15
185e5c31af7Sopenharmony_ci               OpStore %62 %20
186e5c31af7Sopenharmony_ci         %63 = OpAccessChain %9 %55 %27 %15
187e5c31af7Sopenharmony_ci         %64 = OpLoad %6 %63
188e5c31af7Sopenharmony_ci         %65 = OpSLessThan %21 %64 %27
189e5c31af7Sopenharmony_ci               OpSelectionMerge %67 None
190e5c31af7Sopenharmony_ci               OpBranchConditional %65 %66 %75
191e5c31af7Sopenharmony_ci         %66 = OpLabel
192e5c31af7Sopenharmony_ci               OpStore %71 %73
193e5c31af7Sopenharmony_ci               OpStore %97 %98
194e5c31af7Sopenharmony_ci               OpBranch %91
195e5c31af7Sopenharmony_ci         %75 = OpLabel
196e5c31af7Sopenharmony_ci         %78 = OpIAdd %6 %20 %61
197e5c31af7Sopenharmony_ci         %80 = OpAccessChain %8 %55 %27
198e5c31af7Sopenharmony_ci         %81 = OpLoad %7 %80
199e5c31af7Sopenharmony_ci               OpStore %79 %81
200e5c31af7Sopenharmony_ci               OpStore %82 %78
201e5c31af7Sopenharmony_ci        %100 = OpLoad %6 %82
202e5c31af7Sopenharmony_ci        %101 = OpAccessChain %9 %79 %15
203e5c31af7Sopenharmony_ci        %121 = OpLoad %7 %79
204e5c31af7Sopenharmony_ci        %122 = OpCompositeInsert %7 %100 %121 0
205e5c31af7Sopenharmony_ci               OpStore %79 %122
206e5c31af7Sopenharmony_ci        %123 = OpLoad %7 %79
207e5c31af7Sopenharmony_ci        %102 = OpCompositeExtract %6 %123 0
208e5c31af7Sopenharmony_ci        %103 = OpIEqual %21 %102 %20
209e5c31af7Sopenharmony_ci               OpSelectionMerge %104 None
210e5c31af7Sopenharmony_ci               OpBranchConditional %103 %105 %104
211e5c31af7Sopenharmony_ci        %105 = OpLabel
212e5c31af7Sopenharmony_ci        %124 = OpLoad %7 %79
213e5c31af7Sopenharmony_ci        %125 = OpCompositeInsert %7 %25 %124 0
214e5c31af7Sopenharmony_ci               OpStore %79 %125
215e5c31af7Sopenharmony_ci               OpBranch %104
216e5c31af7Sopenharmony_ci        %104 = OpLabel
217e5c31af7Sopenharmony_ci        %106 = OpLoad %6 %82
218e5c31af7Sopenharmony_ci        %107 = OpIAdd %6 %106 %27
219e5c31af7Sopenharmony_ci        %108 = OpAccessChain %9 %79 %27
220e5c31af7Sopenharmony_ci        %126 = OpLoad %7 %79
221e5c31af7Sopenharmony_ci        %127 = OpCompositeInsert %7 %107 %126 1
222e5c31af7Sopenharmony_ci               OpStore %79 %127
223e5c31af7Sopenharmony_ci        %109 = OpLoad %6 %82
224e5c31af7Sopenharmony_ci        %110 = OpIAdd %6 %109 %20
225e5c31af7Sopenharmony_ci        %111 = OpAccessChain %9 %79 %20
226e5c31af7Sopenharmony_ci        %128 = OpLoad %7 %79
227e5c31af7Sopenharmony_ci        %129 = OpCompositeInsert %7 %110 %128 2
228e5c31af7Sopenharmony_ci               OpStore %79 %129
229e5c31af7Sopenharmony_ci        %130 = OpLoad %7 %79
230e5c31af7Sopenharmony_ci        %112 = OpCompositeExtract %6 %130 1
231e5c31af7Sopenharmony_ci        %113 = OpIEqual %21 %112 %20
232e5c31af7Sopenharmony_ci               OpSelectionMerge %114 None
233e5c31af7Sopenharmony_ci               OpBranchConditional %113 %115 %114
234e5c31af7Sopenharmony_ci        %115 = OpLabel
235e5c31af7Sopenharmony_ci        %131 = OpLoad %7 %79
236e5c31af7Sopenharmony_ci        %132 = OpCompositeInsert %7 %39 %131 1
237e5c31af7Sopenharmony_ci               OpStore %79 %132
238e5c31af7Sopenharmony_ci               OpBranch %114
239e5c31af7Sopenharmony_ci        %114 = OpLabel
240e5c31af7Sopenharmony_ci        %133 = OpLoad %7 %79
241e5c31af7Sopenharmony_ci        %116 = OpCompositeExtract %6 %133 0
242e5c31af7Sopenharmony_ci        %134 = OpLoad %7 %79
243e5c31af7Sopenharmony_ci        %117 = OpCompositeExtract %6 %134 1
244e5c31af7Sopenharmony_ci        %118 = OpIAdd %6 %116 %117
245e5c31af7Sopenharmony_ci        %135 = OpLoad %7 %79
246e5c31af7Sopenharmony_ci        %119 = OpCompositeExtract %6 %135 2
247e5c31af7Sopenharmony_ci        %120 = OpIAdd %6 %118 %119
248e5c31af7Sopenharmony_ci               OpStore %99 %120
249e5c31af7Sopenharmony_ci         %83 = OpLoad %6 %99
250e5c31af7Sopenharmony_ci         %85 = OpIEqual %21 %83 %84
251e5c31af7Sopenharmony_ci               OpSelectionMerge %87 None
252e5c31af7Sopenharmony_ci               OpBranchConditional %85 %86 %90
253e5c31af7Sopenharmony_ci         %86 = OpLabel
254e5c31af7Sopenharmony_ci               OpStore %71 %89
255e5c31af7Sopenharmony_ci               OpBranch %87
256e5c31af7Sopenharmony_ci         %90 = OpLabel
257e5c31af7Sopenharmony_ci               OpStore %71 %73
258e5c31af7Sopenharmony_ci               OpBranch %87
259e5c31af7Sopenharmony_ci         %87 = OpLabel
260e5c31af7Sopenharmony_ci               OpBranch %67
261e5c31af7Sopenharmony_ci         %67 = OpLabel
262e5c31af7Sopenharmony_ci               OpStore %97 %98
263e5c31af7Sopenharmony_ci               OpBranch %91
264e5c31af7Sopenharmony_ci         %94 = OpLabel
265e5c31af7Sopenharmony_ci               OpBranch %92
266e5c31af7Sopenharmony_ci         %91 = OpLabel
267e5c31af7Sopenharmony_ci               OpReturn
268e5c31af7Sopenharmony_ci               OpFunctionEnd
269e5c31af7Sopenharmony_ci         %13 = OpFunction %6 None %10
270e5c31af7Sopenharmony_ci         %11 = OpFunctionParameter %8
271e5c31af7Sopenharmony_ci         %12 = OpFunctionParameter %9
272e5c31af7Sopenharmony_ci         %14 = OpLabel
273e5c31af7Sopenharmony_ci         %16 = OpLoad %6 %12
274e5c31af7Sopenharmony_ci         %17 = OpAccessChain %9 %11 %15
275e5c31af7Sopenharmony_ci               OpStore %17 %16
276e5c31af7Sopenharmony_ci         %19 = OpLoad %6 %17
277e5c31af7Sopenharmony_ci         %22 = OpIEqual %21 %19 %20
278e5c31af7Sopenharmony_ci               OpSelectionMerge %24 None
279e5c31af7Sopenharmony_ci               OpBranchConditional %22 %23 %24
280e5c31af7Sopenharmony_ci         %23 = OpLabel
281e5c31af7Sopenharmony_ci               OpStore %17 %25
282e5c31af7Sopenharmony_ci               OpBranch %24
283e5c31af7Sopenharmony_ci         %24 = OpLabel
284e5c31af7Sopenharmony_ci         %28 = OpLoad %6 %12
285e5c31af7Sopenharmony_ci         %29 = OpIAdd %6 %28 %27
286e5c31af7Sopenharmony_ci         %30 = OpAccessChain %9 %11 %27
287e5c31af7Sopenharmony_ci               OpStore %30 %29
288e5c31af7Sopenharmony_ci         %31 = OpLoad %6 %12
289e5c31af7Sopenharmony_ci         %32 = OpIAdd %6 %31 %20
290e5c31af7Sopenharmony_ci         %33 = OpAccessChain %9 %11 %20
291e5c31af7Sopenharmony_ci               OpStore %33 %32
292e5c31af7Sopenharmony_ci         %35 = OpLoad %6 %30
293e5c31af7Sopenharmony_ci         %36 = OpIEqual %21 %35 %20
294e5c31af7Sopenharmony_ci               OpSelectionMerge %38 None
295e5c31af7Sopenharmony_ci               OpBranchConditional %36 %37 %38
296e5c31af7Sopenharmony_ci         %37 = OpLabel
297e5c31af7Sopenharmony_ci               OpStore %30 %39
298e5c31af7Sopenharmony_ci               OpBranch %38
299e5c31af7Sopenharmony_ci         %38 = OpLabel
300e5c31af7Sopenharmony_ci         %42 = OpLoad %6 %17
301e5c31af7Sopenharmony_ci         %44 = OpLoad %6 %30
302e5c31af7Sopenharmony_ci         %45 = OpIAdd %6 %42 %44
303e5c31af7Sopenharmony_ci         %47 = OpLoad %6 %33
304e5c31af7Sopenharmony_ci         %48 = OpIAdd %6 %45 %47
305e5c31af7Sopenharmony_ci               OpReturnValue %48
306e5c31af7Sopenharmony_ci               OpFunctionEnd
307e5c31af7Sopenharmony_ciEND
308e5c31af7Sopenharmony_ci
309e5c31af7Sopenharmony_ci# uniforms for variant
310e5c31af7Sopenharmony_ci
311e5c31af7Sopenharmony_ci# one
312e5c31af7Sopenharmony_ciBUFFER variant_one DATA_TYPE int32 DATA
313e5c31af7Sopenharmony_ci 1
314e5c31af7Sopenharmony_ciEND
315e5c31af7Sopenharmony_ci
316e5c31af7Sopenharmony_ciBUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
317e5c31af7Sopenharmony_ci
318e5c31af7Sopenharmony_ciPIPELINE graphics variant_pipeline
319e5c31af7Sopenharmony_ci  ATTACH variant_vertex_shader
320e5c31af7Sopenharmony_ci  ATTACH variant_fragment_shader
321e5c31af7Sopenharmony_ci  FRAMEBUFFER_SIZE 256 256
322e5c31af7Sopenharmony_ci  BIND BUFFER variant_framebuffer AS color LOCATION 0
323e5c31af7Sopenharmony_ci  BIND BUFFER variant_one AS uniform DESCRIPTOR_SET 0 BINDING 0
324e5c31af7Sopenharmony_ciEND
325e5c31af7Sopenharmony_ciCLEAR_COLOR variant_pipeline 0 0 0 255
326e5c31af7Sopenharmony_ci
327e5c31af7Sopenharmony_ciCLEAR variant_pipeline
328e5c31af7Sopenharmony_ciRUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
329e5c31af7Sopenharmony_ci
330e5c31af7Sopenharmony_ciEXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
331