1fd4e5da5Sopenharmony_ci// Copyright (c) 2017 Google Inc.
2fd4e5da5Sopenharmony_ci//
3fd4e5da5Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
4fd4e5da5Sopenharmony_ci// you may not use this file except in compliance with the License.
5fd4e5da5Sopenharmony_ci// You may obtain a copy of the License at
6fd4e5da5Sopenharmony_ci//
7fd4e5da5Sopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
8fd4e5da5Sopenharmony_ci//
9fd4e5da5Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software
10fd4e5da5Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
11fd4e5da5Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fd4e5da5Sopenharmony_ci// See the License for the specific language governing permissions and
13fd4e5da5Sopenharmony_ci// limitations under the License.
14fd4e5da5Sopenharmony_ci
15fd4e5da5Sopenharmony_ci#include <string>
16fd4e5da5Sopenharmony_ci#include <unordered_set>
17fd4e5da5Sopenharmony_ci
18fd4e5da5Sopenharmony_ci#include "test/opt/pass_fixture.h"
19fd4e5da5Sopenharmony_ci#include "test/opt/pass_utils.h"
20fd4e5da5Sopenharmony_ci
21fd4e5da5Sopenharmony_cinamespace spvtools {
22fd4e5da5Sopenharmony_cinamespace opt {
23fd4e5da5Sopenharmony_cinamespace {
24fd4e5da5Sopenharmony_ci
25fd4e5da5Sopenharmony_ciusing Workaround1209Test = PassTest<::testing::Test>;
26fd4e5da5Sopenharmony_ci
27fd4e5da5Sopenharmony_ciTEST_F(Workaround1209Test, RemoveOpUnreachableInLoop) {
28fd4e5da5Sopenharmony_ci  const std::string text = R"(
29fd4e5da5Sopenharmony_ci               OpCapability Shader
30fd4e5da5Sopenharmony_ci          %1 = OpExtInstImport "GLSL.std.450"
31fd4e5da5Sopenharmony_ci               OpMemoryModel Logical GLSL450
32fd4e5da5Sopenharmony_ci               OpEntryPoint Vertex %main "main" %texcoord %gl_VertexIndex %_
33fd4e5da5Sopenharmony_ci               OpSource GLSL 400
34fd4e5da5Sopenharmony_ci               OpSourceExtension "GL_ARB_separate_shader_objects"
35fd4e5da5Sopenharmony_ci               OpSourceExtension "GL_ARB_shading_language_420pack"
36fd4e5da5Sopenharmony_ci               OpName %main "main"
37fd4e5da5Sopenharmony_ci               OpName %texcoord "texcoord"
38fd4e5da5Sopenharmony_ci               OpName %buf "buf"
39fd4e5da5Sopenharmony_ci               OpMemberName %buf 0 "MVP"
40fd4e5da5Sopenharmony_ci               OpMemberName %buf 1 "position"
41fd4e5da5Sopenharmony_ci               OpMemberName %buf 2 "attr"
42fd4e5da5Sopenharmony_ci               OpName %ubuf "ubuf"
43fd4e5da5Sopenharmony_ci               OpName %gl_VertexIndex "gl_VertexIndex"
44fd4e5da5Sopenharmony_ci               OpName %gl_PerVertex "gl_PerVertex"
45fd4e5da5Sopenharmony_ci               OpMemberName %gl_PerVertex 0 "gl_Position"
46fd4e5da5Sopenharmony_ci               OpName %_ ""
47fd4e5da5Sopenharmony_ci               OpDecorate %texcoord Location 0
48fd4e5da5Sopenharmony_ci               OpDecorate %_arr_v4float_uint_72 ArrayStride 16
49fd4e5da5Sopenharmony_ci               OpDecorate %_arr_v4float_uint_72_0 ArrayStride 16
50fd4e5da5Sopenharmony_ci               OpMemberDecorate %buf 0 ColMajor
51fd4e5da5Sopenharmony_ci               OpMemberDecorate %buf 0 Offset 0
52fd4e5da5Sopenharmony_ci               OpMemberDecorate %buf 0 MatrixStride 16
53fd4e5da5Sopenharmony_ci               OpMemberDecorate %buf 1 Offset 64
54fd4e5da5Sopenharmony_ci               OpMemberDecorate %buf 2 Offset 1216
55fd4e5da5Sopenharmony_ci               OpDecorate %buf Block
56fd4e5da5Sopenharmony_ci               OpDecorate %ubuf DescriptorSet 0
57fd4e5da5Sopenharmony_ci               OpDecorate %ubuf Binding 0
58fd4e5da5Sopenharmony_ci               OpDecorate %gl_VertexIndex BuiltIn VertexIndex
59fd4e5da5Sopenharmony_ci               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
60fd4e5da5Sopenharmony_ci               OpDecorate %gl_PerVertex Block
61fd4e5da5Sopenharmony_ci       %void = OpTypeVoid
62fd4e5da5Sopenharmony_ci         %12 = OpTypeFunction %void
63fd4e5da5Sopenharmony_ci      %float = OpTypeFloat 32
64fd4e5da5Sopenharmony_ci    %v4float = OpTypeVector %float 4
65fd4e5da5Sopenharmony_ci%_ptr_Output_v4float = OpTypePointer Output %v4float
66fd4e5da5Sopenharmony_ci   %texcoord = OpVariable %_ptr_Output_v4float Output
67fd4e5da5Sopenharmony_ci%mat4v4float = OpTypeMatrix %v4float 4
68fd4e5da5Sopenharmony_ci       %uint = OpTypeInt 32 0
69fd4e5da5Sopenharmony_ci    %uint_72 = OpConstant %uint 72
70fd4e5da5Sopenharmony_ci%_arr_v4float_uint_72 = OpTypeArray %v4float %uint_72
71fd4e5da5Sopenharmony_ci%_arr_v4float_uint_72_0 = OpTypeArray %v4float %uint_72
72fd4e5da5Sopenharmony_ci        %buf = OpTypeStruct %mat4v4float %_arr_v4float_uint_72 %_arr_v4float_uint_72_0
73fd4e5da5Sopenharmony_ci%_ptr_Uniform_buf = OpTypePointer Uniform %buf
74fd4e5da5Sopenharmony_ci       %ubuf = OpVariable %_ptr_Uniform_buf Uniform
75fd4e5da5Sopenharmony_ci        %int = OpTypeInt 32 1
76fd4e5da5Sopenharmony_ci      %int_2 = OpConstant %int 2
77fd4e5da5Sopenharmony_ci%_ptr_Input_int = OpTypePointer Input %int
78fd4e5da5Sopenharmony_ci%gl_VertexIndex = OpVariable %_ptr_Input_int Input
79fd4e5da5Sopenharmony_ci%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
80fd4e5da5Sopenharmony_ci%gl_PerVertex = OpTypeStruct %v4float
81fd4e5da5Sopenharmony_ci%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
82fd4e5da5Sopenharmony_ci          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
83fd4e5da5Sopenharmony_ci      %int_0 = OpConstant %int 0
84fd4e5da5Sopenharmony_ci      %int_1 = OpConstant %int 1
85fd4e5da5Sopenharmony_ci    %float_1 = OpConstant %float 1
86fd4e5da5Sopenharmony_ci         %28 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
87fd4e5da5Sopenharmony_ci       %main = OpFunction %void None %12
88fd4e5da5Sopenharmony_ci         %29 = OpLabel
89fd4e5da5Sopenharmony_ci               OpBranch %30
90fd4e5da5Sopenharmony_ci         %30 = OpLabel
91fd4e5da5Sopenharmony_ci; CHECK: OpLoopMerge [[merge:%[a-zA-Z_\d]+]]
92fd4e5da5Sopenharmony_ci               OpLoopMerge %31 %32 None
93fd4e5da5Sopenharmony_ci               OpBranch %33
94fd4e5da5Sopenharmony_ci         %33 = OpLabel
95fd4e5da5Sopenharmony_ci; CHECK: OpSelectionMerge [[sel_merge:%[a-zA-Z_\d]+]]
96fd4e5da5Sopenharmony_ci               OpSelectionMerge %34 None
97fd4e5da5Sopenharmony_ci               OpSwitch %int_1 %35
98fd4e5da5Sopenharmony_ci         %35 = OpLabel
99fd4e5da5Sopenharmony_ci         %36 = OpLoad %int %gl_VertexIndex
100fd4e5da5Sopenharmony_ci         %37 = OpAccessChain %_ptr_Uniform_v4float %ubuf %int_2 %36
101fd4e5da5Sopenharmony_ci         %38 = OpLoad %v4float %37
102fd4e5da5Sopenharmony_ci               OpStore %texcoord %38
103fd4e5da5Sopenharmony_ci         %39 = OpAccessChain %_ptr_Output_v4float %_ %int_0
104fd4e5da5Sopenharmony_ci               OpStore %39 %28
105fd4e5da5Sopenharmony_ci               OpBranch %31
106fd4e5da5Sopenharmony_ci; CHECK: [[sel_merge]] = OpLabel
107fd4e5da5Sopenharmony_ci         %34 = OpLabel
108fd4e5da5Sopenharmony_ci; CHECK-NEXT: OpBranch [[merge]]
109fd4e5da5Sopenharmony_ci               OpUnreachable
110fd4e5da5Sopenharmony_ci         %32 = OpLabel
111fd4e5da5Sopenharmony_ci               OpBranch %30
112fd4e5da5Sopenharmony_ci         %31 = OpLabel
113fd4e5da5Sopenharmony_ci               OpReturn
114fd4e5da5Sopenharmony_ci               OpFunctionEnd)";
115fd4e5da5Sopenharmony_ci
116fd4e5da5Sopenharmony_ci  SinglePassRunAndMatch<Workaround1209>(text, false);
117fd4e5da5Sopenharmony_ci}
118fd4e5da5Sopenharmony_ci
119fd4e5da5Sopenharmony_ciTEST_F(Workaround1209Test, RemoveOpUnreachableInNestedLoop) {
120fd4e5da5Sopenharmony_ci  const std::string text = R"(
121fd4e5da5Sopenharmony_ci               OpCapability Shader
122fd4e5da5Sopenharmony_ci          %1 = OpExtInstImport "GLSL.std.450"
123fd4e5da5Sopenharmony_ci               OpMemoryModel Logical GLSL450
124fd4e5da5Sopenharmony_ci               OpEntryPoint Vertex %2 "main" %3 %4 %5
125fd4e5da5Sopenharmony_ci               OpSource GLSL 400
126fd4e5da5Sopenharmony_ci               OpSourceExtension "GL_ARB_separate_shader_objects"
127fd4e5da5Sopenharmony_ci               OpSourceExtension "GL_ARB_shading_language_420pack"
128fd4e5da5Sopenharmony_ci               OpName %2 "main"
129fd4e5da5Sopenharmony_ci               OpName %3 "texcoord"
130fd4e5da5Sopenharmony_ci               OpName %6 "buf"
131fd4e5da5Sopenharmony_ci               OpMemberName %6 0 "MVP"
132fd4e5da5Sopenharmony_ci               OpMemberName %6 1 "position"
133fd4e5da5Sopenharmony_ci               OpMemberName %6 2 "attr"
134fd4e5da5Sopenharmony_ci               OpName %7 "ubuf"
135fd4e5da5Sopenharmony_ci               OpName %4 "gl_VertexIndex"
136fd4e5da5Sopenharmony_ci               OpName %8 "gl_PerVertex"
137fd4e5da5Sopenharmony_ci               OpMemberName %8 0 "gl_Position"
138fd4e5da5Sopenharmony_ci               OpName %5 ""
139fd4e5da5Sopenharmony_ci               OpDecorate %3 Location 0
140fd4e5da5Sopenharmony_ci               OpDecorate %9 ArrayStride 16
141fd4e5da5Sopenharmony_ci               OpDecorate %10 ArrayStride 16
142fd4e5da5Sopenharmony_ci               OpMemberDecorate %6 0 ColMajor
143fd4e5da5Sopenharmony_ci               OpMemberDecorate %6 0 Offset 0
144fd4e5da5Sopenharmony_ci               OpMemberDecorate %6 0 MatrixStride 16
145fd4e5da5Sopenharmony_ci               OpMemberDecorate %6 1 Offset 64
146fd4e5da5Sopenharmony_ci               OpMemberDecorate %6 2 Offset 1216
147fd4e5da5Sopenharmony_ci               OpDecorate %6 Block
148fd4e5da5Sopenharmony_ci               OpDecorate %7 DescriptorSet 0
149fd4e5da5Sopenharmony_ci               OpDecorate %7 Binding 0
150fd4e5da5Sopenharmony_ci               OpDecorate %4 BuiltIn VertexIndex
151fd4e5da5Sopenharmony_ci               OpMemberDecorate %8 0 BuiltIn Position
152fd4e5da5Sopenharmony_ci               OpDecorate %8 Block
153fd4e5da5Sopenharmony_ci         %11 = OpTypeVoid
154fd4e5da5Sopenharmony_ci         %12 = OpTypeFunction %11
155fd4e5da5Sopenharmony_ci         %13 = OpTypeFloat 32
156fd4e5da5Sopenharmony_ci         %14 = OpTypeVector %13 4
157fd4e5da5Sopenharmony_ci         %15 = OpTypePointer Output %14
158fd4e5da5Sopenharmony_ci          %3 = OpVariable %15 Output
159fd4e5da5Sopenharmony_ci         %16 = OpTypeMatrix %14 4
160fd4e5da5Sopenharmony_ci         %17 = OpTypeInt 32 0
161fd4e5da5Sopenharmony_ci         %18 = OpConstant %17 72
162fd4e5da5Sopenharmony_ci          %9 = OpTypeArray %14 %18
163fd4e5da5Sopenharmony_ci         %10 = OpTypeArray %14 %18
164fd4e5da5Sopenharmony_ci          %6 = OpTypeStruct %16 %9 %10
165fd4e5da5Sopenharmony_ci         %19 = OpTypePointer Uniform %6
166fd4e5da5Sopenharmony_ci          %7 = OpVariable %19 Uniform
167fd4e5da5Sopenharmony_ci         %20 = OpTypeInt 32 1
168fd4e5da5Sopenharmony_ci         %21 = OpConstant %20 2
169fd4e5da5Sopenharmony_ci         %22 = OpTypePointer Input %20
170fd4e5da5Sopenharmony_ci          %4 = OpVariable %22 Input
171fd4e5da5Sopenharmony_ci         %23 = OpTypePointer Uniform %14
172fd4e5da5Sopenharmony_ci          %8 = OpTypeStruct %14
173fd4e5da5Sopenharmony_ci         %24 = OpTypePointer Output %8
174fd4e5da5Sopenharmony_ci          %5 = OpVariable %24 Output
175fd4e5da5Sopenharmony_ci         %25 = OpConstant %20 0
176fd4e5da5Sopenharmony_ci         %26 = OpConstant %20 1
177fd4e5da5Sopenharmony_ci         %27 = OpConstant %13 1
178fd4e5da5Sopenharmony_ci         %28 = OpConstantComposite %14 %27 %27 %27 %27
179fd4e5da5Sopenharmony_ci          %2 = OpFunction %11 None %12
180fd4e5da5Sopenharmony_ci         %29 = OpLabel
181fd4e5da5Sopenharmony_ci               OpBranch %31
182fd4e5da5Sopenharmony_ci         %31 = OpLabel
183fd4e5da5Sopenharmony_ci; CHECK: OpLoopMerge
184fd4e5da5Sopenharmony_ci               OpLoopMerge %32 %33 None
185fd4e5da5Sopenharmony_ci               OpBranch %30
186fd4e5da5Sopenharmony_ci         %30 = OpLabel
187fd4e5da5Sopenharmony_ci; CHECK: OpLoopMerge [[merge:%[a-zA-Z_\d]+]]
188fd4e5da5Sopenharmony_ci               OpLoopMerge %34 %35 None
189fd4e5da5Sopenharmony_ci               OpBranch %36
190fd4e5da5Sopenharmony_ci         %36 = OpLabel
191fd4e5da5Sopenharmony_ci; CHECK: OpSelectionMerge [[sel_merge:%[a-zA-Z_\d]+]]
192fd4e5da5Sopenharmony_ci               OpSelectionMerge %37 None
193fd4e5da5Sopenharmony_ci               OpSwitch %26 %38
194fd4e5da5Sopenharmony_ci         %38 = OpLabel
195fd4e5da5Sopenharmony_ci         %39 = OpLoad %20 %4
196fd4e5da5Sopenharmony_ci         %40 = OpAccessChain %23 %7 %21 %39
197fd4e5da5Sopenharmony_ci         %41 = OpLoad %14 %40
198fd4e5da5Sopenharmony_ci               OpStore %3 %41
199fd4e5da5Sopenharmony_ci         %42 = OpAccessChain %15 %5 %25
200fd4e5da5Sopenharmony_ci               OpStore %42 %28
201fd4e5da5Sopenharmony_ci               OpBranch %34
202fd4e5da5Sopenharmony_ci; CHECK: [[sel_merge]] = OpLabel
203fd4e5da5Sopenharmony_ci         %37 = OpLabel
204fd4e5da5Sopenharmony_ci; CHECK-NEXT: OpBranch [[merge]]
205fd4e5da5Sopenharmony_ci               OpUnreachable
206fd4e5da5Sopenharmony_ci         %35 = OpLabel
207fd4e5da5Sopenharmony_ci               OpBranch %30
208fd4e5da5Sopenharmony_ci         %34 = OpLabel
209fd4e5da5Sopenharmony_ci               OpBranch %32
210fd4e5da5Sopenharmony_ci         %33 = OpLabel
211fd4e5da5Sopenharmony_ci               OpBranch %31
212fd4e5da5Sopenharmony_ci         %32 = OpLabel
213fd4e5da5Sopenharmony_ci               OpReturn
214fd4e5da5Sopenharmony_ci               OpFunctionEnd)";
215fd4e5da5Sopenharmony_ci
216fd4e5da5Sopenharmony_ci  SinglePassRunAndMatch<Workaround1209>(text, false);
217fd4e5da5Sopenharmony_ci}
218fd4e5da5Sopenharmony_ci
219fd4e5da5Sopenharmony_ciTEST_F(Workaround1209Test, RemoveOpUnreachableInAdjacentLoops) {
220fd4e5da5Sopenharmony_ci  const std::string text = R"(
221fd4e5da5Sopenharmony_ci               OpCapability Shader
222fd4e5da5Sopenharmony_ci          %1 = OpExtInstImport "GLSL.std.450"
223fd4e5da5Sopenharmony_ci               OpMemoryModel Logical GLSL450
224fd4e5da5Sopenharmony_ci               OpEntryPoint Vertex %2 "main" %3 %4 %5
225fd4e5da5Sopenharmony_ci               OpSource GLSL 400
226fd4e5da5Sopenharmony_ci               OpSourceExtension "GL_ARB_separate_shader_objects"
227fd4e5da5Sopenharmony_ci               OpSourceExtension "GL_ARB_shading_language_420pack"
228fd4e5da5Sopenharmony_ci               OpName %2 "main"
229fd4e5da5Sopenharmony_ci               OpName %3 "texcoord"
230fd4e5da5Sopenharmony_ci               OpName %6 "buf"
231fd4e5da5Sopenharmony_ci               OpMemberName %6 0 "MVP"
232fd4e5da5Sopenharmony_ci               OpMemberName %6 1 "position"
233fd4e5da5Sopenharmony_ci               OpMemberName %6 2 "attr"
234fd4e5da5Sopenharmony_ci               OpName %7 "ubuf"
235fd4e5da5Sopenharmony_ci               OpName %4 "gl_VertexIndex"
236fd4e5da5Sopenharmony_ci               OpName %8 "gl_PerVertex"
237fd4e5da5Sopenharmony_ci               OpMemberName %8 0 "gl_Position"
238fd4e5da5Sopenharmony_ci               OpName %5 ""
239fd4e5da5Sopenharmony_ci               OpDecorate %3 Location 0
240fd4e5da5Sopenharmony_ci               OpDecorate %9 ArrayStride 16
241fd4e5da5Sopenharmony_ci               OpDecorate %10 ArrayStride 16
242fd4e5da5Sopenharmony_ci               OpMemberDecorate %6 0 ColMajor
243fd4e5da5Sopenharmony_ci               OpMemberDecorate %6 0 Offset 0
244fd4e5da5Sopenharmony_ci               OpMemberDecorate %6 0 MatrixStride 16
245fd4e5da5Sopenharmony_ci               OpMemberDecorate %6 1 Offset 64
246fd4e5da5Sopenharmony_ci               OpMemberDecorate %6 2 Offset 1216
247fd4e5da5Sopenharmony_ci               OpDecorate %6 Block
248fd4e5da5Sopenharmony_ci               OpDecorate %7 DescriptorSet 0
249fd4e5da5Sopenharmony_ci               OpDecorate %7 Binding 0
250fd4e5da5Sopenharmony_ci               OpDecorate %4 BuiltIn VertexIndex
251fd4e5da5Sopenharmony_ci               OpMemberDecorate %8 0 BuiltIn Position
252fd4e5da5Sopenharmony_ci               OpDecorate %8 Block
253fd4e5da5Sopenharmony_ci         %11 = OpTypeVoid
254fd4e5da5Sopenharmony_ci         %12 = OpTypeFunction %11
255fd4e5da5Sopenharmony_ci         %13 = OpTypeFloat 32
256fd4e5da5Sopenharmony_ci         %14 = OpTypeVector %13 4
257fd4e5da5Sopenharmony_ci         %15 = OpTypePointer Output %14
258fd4e5da5Sopenharmony_ci          %3 = OpVariable %15 Output
259fd4e5da5Sopenharmony_ci         %16 = OpTypeMatrix %14 4
260fd4e5da5Sopenharmony_ci         %17 = OpTypeInt 32 0
261fd4e5da5Sopenharmony_ci         %18 = OpConstant %17 72
262fd4e5da5Sopenharmony_ci          %9 = OpTypeArray %14 %18
263fd4e5da5Sopenharmony_ci         %10 = OpTypeArray %14 %18
264fd4e5da5Sopenharmony_ci          %6 = OpTypeStruct %16 %9 %10
265fd4e5da5Sopenharmony_ci         %19 = OpTypePointer Uniform %6
266fd4e5da5Sopenharmony_ci          %7 = OpVariable %19 Uniform
267fd4e5da5Sopenharmony_ci         %20 = OpTypeInt 32 1
268fd4e5da5Sopenharmony_ci         %21 = OpConstant %20 2
269fd4e5da5Sopenharmony_ci         %22 = OpTypePointer Input %20
270fd4e5da5Sopenharmony_ci          %4 = OpVariable %22 Input
271fd4e5da5Sopenharmony_ci         %23 = OpTypePointer Uniform %14
272fd4e5da5Sopenharmony_ci          %8 = OpTypeStruct %14
273fd4e5da5Sopenharmony_ci         %24 = OpTypePointer Output %8
274fd4e5da5Sopenharmony_ci          %5 = OpVariable %24 Output
275fd4e5da5Sopenharmony_ci         %25 = OpConstant %20 0
276fd4e5da5Sopenharmony_ci         %26 = OpConstant %20 1
277fd4e5da5Sopenharmony_ci         %27 = OpConstant %13 1
278fd4e5da5Sopenharmony_ci         %28 = OpConstantComposite %14 %27 %27 %27 %27
279fd4e5da5Sopenharmony_ci          %2 = OpFunction %11 None %12
280fd4e5da5Sopenharmony_ci         %29 = OpLabel
281fd4e5da5Sopenharmony_ci               OpBranch %30
282fd4e5da5Sopenharmony_ci         %30 = OpLabel
283fd4e5da5Sopenharmony_ci; CHECK: OpLoopMerge [[merge1:%[a-zA-Z_\d]+]]
284fd4e5da5Sopenharmony_ci               OpLoopMerge %31 %32 None
285fd4e5da5Sopenharmony_ci               OpBranch %33
286fd4e5da5Sopenharmony_ci         %33 = OpLabel
287fd4e5da5Sopenharmony_ci; CHECK: OpSelectionMerge [[sel_merge1:%[a-zA-Z_\d]+]]
288fd4e5da5Sopenharmony_ci               OpSelectionMerge %34 None
289fd4e5da5Sopenharmony_ci               OpSwitch %26 %35
290fd4e5da5Sopenharmony_ci         %35 = OpLabel
291fd4e5da5Sopenharmony_ci         %36 = OpLoad %20 %4
292fd4e5da5Sopenharmony_ci         %37 = OpAccessChain %23 %7 %21 %36
293fd4e5da5Sopenharmony_ci         %38 = OpLoad %14 %37
294fd4e5da5Sopenharmony_ci               OpStore %3 %38
295fd4e5da5Sopenharmony_ci         %39 = OpAccessChain %15 %5 %25
296fd4e5da5Sopenharmony_ci               OpStore %39 %28
297fd4e5da5Sopenharmony_ci               OpBranch %31
298fd4e5da5Sopenharmony_ci; CHECK: [[sel_merge1]] = OpLabel
299fd4e5da5Sopenharmony_ci         %34 = OpLabel
300fd4e5da5Sopenharmony_ci; CHECK-NEXT: OpBranch [[merge1]]
301fd4e5da5Sopenharmony_ci               OpUnreachable
302fd4e5da5Sopenharmony_ci         %32 = OpLabel
303fd4e5da5Sopenharmony_ci               OpBranch %30
304fd4e5da5Sopenharmony_ci         %31 = OpLabel
305fd4e5da5Sopenharmony_ci; CHECK: OpLoopMerge [[merge2:%[a-zA-Z_\d]+]]
306fd4e5da5Sopenharmony_ci               OpLoopMerge %40 %41 None
307fd4e5da5Sopenharmony_ci               OpBranch %42
308fd4e5da5Sopenharmony_ci         %42 = OpLabel
309fd4e5da5Sopenharmony_ci; CHECK: OpSelectionMerge [[sel_merge2:%[a-zA-Z_\d]+]]
310fd4e5da5Sopenharmony_ci               OpSelectionMerge %43 None
311fd4e5da5Sopenharmony_ci               OpSwitch %26 %44
312fd4e5da5Sopenharmony_ci         %44 = OpLabel
313fd4e5da5Sopenharmony_ci         %45 = OpLoad %20 %4
314fd4e5da5Sopenharmony_ci         %46 = OpAccessChain %23 %7 %21 %45
315fd4e5da5Sopenharmony_ci         %47 = OpLoad %14 %46
316fd4e5da5Sopenharmony_ci               OpStore %3 %47
317fd4e5da5Sopenharmony_ci         %48 = OpAccessChain %15 %5 %25
318fd4e5da5Sopenharmony_ci               OpStore %48 %28
319fd4e5da5Sopenharmony_ci               OpBranch %40
320fd4e5da5Sopenharmony_ci; CHECK: [[sel_merge2]] = OpLabel
321fd4e5da5Sopenharmony_ci         %43 = OpLabel
322fd4e5da5Sopenharmony_ci; CHECK-NEXT: OpBranch [[merge2]]
323fd4e5da5Sopenharmony_ci               OpUnreachable
324fd4e5da5Sopenharmony_ci         %41 = OpLabel
325fd4e5da5Sopenharmony_ci               OpBranch %31
326fd4e5da5Sopenharmony_ci         %40 = OpLabel
327fd4e5da5Sopenharmony_ci               OpReturn
328fd4e5da5Sopenharmony_ci               OpFunctionEnd)";
329fd4e5da5Sopenharmony_ci
330fd4e5da5Sopenharmony_ci  SinglePassRunAndMatch<Workaround1209>(text, false);
331fd4e5da5Sopenharmony_ci}
332fd4e5da5Sopenharmony_ci
333fd4e5da5Sopenharmony_ciTEST_F(Workaround1209Test, LeaveUnreachableNotInLoop) {
334fd4e5da5Sopenharmony_ci  const std::string text = R"(
335fd4e5da5Sopenharmony_ci               OpCapability Shader
336fd4e5da5Sopenharmony_ci          %1 = OpExtInstImport "GLSL.std.450"
337fd4e5da5Sopenharmony_ci               OpMemoryModel Logical GLSL450
338fd4e5da5Sopenharmony_ci               OpEntryPoint Vertex %main "main" %texcoord %gl_VertexIndex %_
339fd4e5da5Sopenharmony_ci               OpSource GLSL 400
340fd4e5da5Sopenharmony_ci               OpSourceExtension "GL_ARB_separate_shader_objects"
341fd4e5da5Sopenharmony_ci               OpSourceExtension "GL_ARB_shading_language_420pack"
342fd4e5da5Sopenharmony_ci               OpName %main "main"
343fd4e5da5Sopenharmony_ci               OpName %texcoord "texcoord"
344fd4e5da5Sopenharmony_ci               OpName %buf "buf"
345fd4e5da5Sopenharmony_ci               OpMemberName %buf 0 "MVP"
346fd4e5da5Sopenharmony_ci               OpMemberName %buf 1 "position"
347fd4e5da5Sopenharmony_ci               OpMemberName %buf 2 "attr"
348fd4e5da5Sopenharmony_ci               OpName %ubuf "ubuf"
349fd4e5da5Sopenharmony_ci               OpName %gl_VertexIndex "gl_VertexIndex"
350fd4e5da5Sopenharmony_ci               OpName %gl_PerVertex "gl_PerVertex"
351fd4e5da5Sopenharmony_ci               OpMemberName %gl_PerVertex 0 "gl_Position"
352fd4e5da5Sopenharmony_ci               OpName %_ ""
353fd4e5da5Sopenharmony_ci               OpDecorate %texcoord Location 0
354fd4e5da5Sopenharmony_ci               OpDecorate %_arr_v4float_uint_72 ArrayStride 16
355fd4e5da5Sopenharmony_ci               OpDecorate %_arr_v4float_uint_72_0 ArrayStride 16
356fd4e5da5Sopenharmony_ci               OpMemberDecorate %buf 0 ColMajor
357fd4e5da5Sopenharmony_ci               OpMemberDecorate %buf 0 Offset 0
358fd4e5da5Sopenharmony_ci               OpMemberDecorate %buf 0 MatrixStride 16
359fd4e5da5Sopenharmony_ci               OpMemberDecorate %buf 1 Offset 64
360fd4e5da5Sopenharmony_ci               OpMemberDecorate %buf 2 Offset 1216
361fd4e5da5Sopenharmony_ci               OpDecorate %buf Block
362fd4e5da5Sopenharmony_ci               OpDecorate %ubuf DescriptorSet 0
363fd4e5da5Sopenharmony_ci               OpDecorate %ubuf Binding 0
364fd4e5da5Sopenharmony_ci               OpDecorate %gl_VertexIndex BuiltIn VertexIndex
365fd4e5da5Sopenharmony_ci               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
366fd4e5da5Sopenharmony_ci               OpDecorate %gl_PerVertex Block
367fd4e5da5Sopenharmony_ci       %void = OpTypeVoid
368fd4e5da5Sopenharmony_ci         %12 = OpTypeFunction %void
369fd4e5da5Sopenharmony_ci      %float = OpTypeFloat 32
370fd4e5da5Sopenharmony_ci    %v4float = OpTypeVector %float 4
371fd4e5da5Sopenharmony_ci%_ptr_Output_v4float = OpTypePointer Output %v4float
372fd4e5da5Sopenharmony_ci   %texcoord = OpVariable %_ptr_Output_v4float Output
373fd4e5da5Sopenharmony_ci%mat4v4float = OpTypeMatrix %v4float 4
374fd4e5da5Sopenharmony_ci       %uint = OpTypeInt 32 0
375fd4e5da5Sopenharmony_ci    %uint_72 = OpConstant %uint 72
376fd4e5da5Sopenharmony_ci%_arr_v4float_uint_72 = OpTypeArray %v4float %uint_72
377fd4e5da5Sopenharmony_ci%_arr_v4float_uint_72_0 = OpTypeArray %v4float %uint_72
378fd4e5da5Sopenharmony_ci        %buf = OpTypeStruct %mat4v4float %_arr_v4float_uint_72 %_arr_v4float_uint_72_0
379fd4e5da5Sopenharmony_ci%_ptr_Uniform_buf = OpTypePointer Uniform %buf
380fd4e5da5Sopenharmony_ci       %ubuf = OpVariable %_ptr_Uniform_buf Uniform
381fd4e5da5Sopenharmony_ci        %int = OpTypeInt 32 1
382fd4e5da5Sopenharmony_ci      %int_2 = OpConstant %int 2
383fd4e5da5Sopenharmony_ci%_ptr_Input_int = OpTypePointer Input %int
384fd4e5da5Sopenharmony_ci%gl_VertexIndex = OpVariable %_ptr_Input_int Input
385fd4e5da5Sopenharmony_ci%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
386fd4e5da5Sopenharmony_ci%gl_PerVertex = OpTypeStruct %v4float
387fd4e5da5Sopenharmony_ci%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
388fd4e5da5Sopenharmony_ci          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
389fd4e5da5Sopenharmony_ci      %int_0 = OpConstant %int 0
390fd4e5da5Sopenharmony_ci      %int_1 = OpConstant %int 1
391fd4e5da5Sopenharmony_ci    %float_1 = OpConstant %float 1
392fd4e5da5Sopenharmony_ci         %28 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
393fd4e5da5Sopenharmony_ci       %main = OpFunction %void None %12
394fd4e5da5Sopenharmony_ci         %29 = OpLabel
395fd4e5da5Sopenharmony_ci               OpBranch %30
396fd4e5da5Sopenharmony_ci         %30 = OpLabel
397fd4e5da5Sopenharmony_ci               OpSelectionMerge %34 None
398fd4e5da5Sopenharmony_ci               OpSwitch %int_1 %35
399fd4e5da5Sopenharmony_ci         %35 = OpLabel
400fd4e5da5Sopenharmony_ci         %36 = OpLoad %int %gl_VertexIndex
401fd4e5da5Sopenharmony_ci         %37 = OpAccessChain %_ptr_Uniform_v4float %ubuf %int_2 %36
402fd4e5da5Sopenharmony_ci         %38 = OpLoad %v4float %37
403fd4e5da5Sopenharmony_ci               OpStore %texcoord %38
404fd4e5da5Sopenharmony_ci         %39 = OpAccessChain %_ptr_Output_v4float %_ %int_0
405fd4e5da5Sopenharmony_ci               OpStore %39 %28
406fd4e5da5Sopenharmony_ci               OpReturn
407fd4e5da5Sopenharmony_ci         %34 = OpLabel
408fd4e5da5Sopenharmony_ci; CHECK: OpUnreachable
409fd4e5da5Sopenharmony_ci               OpUnreachable
410fd4e5da5Sopenharmony_ci               OpFunctionEnd)";
411fd4e5da5Sopenharmony_ci
412fd4e5da5Sopenharmony_ci  SinglePassRunAndMatch<Workaround1209>(text, false);
413fd4e5da5Sopenharmony_ci}
414fd4e5da5Sopenharmony_ci
415fd4e5da5Sopenharmony_ci}  // namespace
416fd4e5da5Sopenharmony_ci}  // namespace opt
417fd4e5da5Sopenharmony_ci}  // namespace spvtools
418