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