1fd4e5da5Sopenharmony_ci// Copyright (c) 2019 Google LLC 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 "gtest/gtest.h" 16fd4e5da5Sopenharmony_ci#include "source/fuzz/fuzzer.h" 17fd4e5da5Sopenharmony_ci#include "source/fuzz/fuzzer_util.h" 18fd4e5da5Sopenharmony_ci#include "source/fuzz/pseudo_random_generator.h" 19fd4e5da5Sopenharmony_ci#include "source/fuzz/replayer.h" 20fd4e5da5Sopenharmony_ci#include "source/fuzz/uniform_buffer_element_descriptor.h" 21fd4e5da5Sopenharmony_ci#include "test/fuzz/fuzz_test_util.h" 22fd4e5da5Sopenharmony_ci 23fd4e5da5Sopenharmony_cinamespace spvtools { 24fd4e5da5Sopenharmony_cinamespace fuzz { 25fd4e5da5Sopenharmony_cinamespace { 26fd4e5da5Sopenharmony_ci 27fd4e5da5Sopenharmony_ciconst uint32_t kNumFuzzerRuns = 20; 28fd4e5da5Sopenharmony_ci 29fd4e5da5Sopenharmony_ci// The SPIR-V came from this GLSL: 30fd4e5da5Sopenharmony_ci// 31fd4e5da5Sopenharmony_ci// #version 310 es 32fd4e5da5Sopenharmony_ci// 33fd4e5da5Sopenharmony_ci// void foo() { 34fd4e5da5Sopenharmony_ci// int x; 35fd4e5da5Sopenharmony_ci// x = 2; 36fd4e5da5Sopenharmony_ci// for (int i = 0; i < 100; i++) { 37fd4e5da5Sopenharmony_ci// x += i; 38fd4e5da5Sopenharmony_ci// x = x * 2; 39fd4e5da5Sopenharmony_ci// } 40fd4e5da5Sopenharmony_ci// return; 41fd4e5da5Sopenharmony_ci// } 42fd4e5da5Sopenharmony_ci// 43fd4e5da5Sopenharmony_ci// void main() { 44fd4e5da5Sopenharmony_ci// foo(); 45fd4e5da5Sopenharmony_ci// for (int i = 0; i < 10; i++) { 46fd4e5da5Sopenharmony_ci// int j = 20; 47fd4e5da5Sopenharmony_ci// while(j > 0) { 48fd4e5da5Sopenharmony_ci// foo(); 49fd4e5da5Sopenharmony_ci// j--; 50fd4e5da5Sopenharmony_ci// } 51fd4e5da5Sopenharmony_ci// do { 52fd4e5da5Sopenharmony_ci// i++; 53fd4e5da5Sopenharmony_ci// } while(i < 4); 54fd4e5da5Sopenharmony_ci// } 55fd4e5da5Sopenharmony_ci// } 56fd4e5da5Sopenharmony_ci 57fd4e5da5Sopenharmony_ciconst std::string kTestShader1 = R"( 58fd4e5da5Sopenharmony_ci OpCapability Shader 59fd4e5da5Sopenharmony_ci %1 = OpExtInstImport "GLSL.std.450" 60fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 61fd4e5da5Sopenharmony_ci OpEntryPoint Fragment %4 "main" 62fd4e5da5Sopenharmony_ci OpExecutionMode %4 OriginUpperLeft 63fd4e5da5Sopenharmony_ci OpSource ESSL 310 64fd4e5da5Sopenharmony_ci OpName %4 "main" 65fd4e5da5Sopenharmony_ci OpName %6 "foo(" 66fd4e5da5Sopenharmony_ci OpName %10 "x" 67fd4e5da5Sopenharmony_ci OpName %12 "i" 68fd4e5da5Sopenharmony_ci OpName %33 "i" 69fd4e5da5Sopenharmony_ci OpName %42 "j" 70fd4e5da5Sopenharmony_ci OpDecorate %10 RelaxedPrecision 71fd4e5da5Sopenharmony_ci OpDecorate %12 RelaxedPrecision 72fd4e5da5Sopenharmony_ci OpDecorate %19 RelaxedPrecision 73fd4e5da5Sopenharmony_ci OpDecorate %23 RelaxedPrecision 74fd4e5da5Sopenharmony_ci OpDecorate %24 RelaxedPrecision 75fd4e5da5Sopenharmony_ci OpDecorate %25 RelaxedPrecision 76fd4e5da5Sopenharmony_ci OpDecorate %26 RelaxedPrecision 77fd4e5da5Sopenharmony_ci OpDecorate %27 RelaxedPrecision 78fd4e5da5Sopenharmony_ci OpDecorate %28 RelaxedPrecision 79fd4e5da5Sopenharmony_ci OpDecorate %30 RelaxedPrecision 80fd4e5da5Sopenharmony_ci OpDecorate %33 RelaxedPrecision 81fd4e5da5Sopenharmony_ci OpDecorate %39 RelaxedPrecision 82fd4e5da5Sopenharmony_ci OpDecorate %42 RelaxedPrecision 83fd4e5da5Sopenharmony_ci OpDecorate %49 RelaxedPrecision 84fd4e5da5Sopenharmony_ci OpDecorate %52 RelaxedPrecision 85fd4e5da5Sopenharmony_ci OpDecorate %53 RelaxedPrecision 86fd4e5da5Sopenharmony_ci OpDecorate %58 RelaxedPrecision 87fd4e5da5Sopenharmony_ci OpDecorate %59 RelaxedPrecision 88fd4e5da5Sopenharmony_ci OpDecorate %60 RelaxedPrecision 89fd4e5da5Sopenharmony_ci OpDecorate %63 RelaxedPrecision 90fd4e5da5Sopenharmony_ci OpDecorate %64 RelaxedPrecision 91fd4e5da5Sopenharmony_ci %2 = OpTypeVoid 92fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %2 93fd4e5da5Sopenharmony_ci %8 = OpTypeInt 32 1 94fd4e5da5Sopenharmony_ci %9 = OpTypePointer Function %8 95fd4e5da5Sopenharmony_ci %11 = OpConstant %8 2 96fd4e5da5Sopenharmony_ci %13 = OpConstant %8 0 97fd4e5da5Sopenharmony_ci %20 = OpConstant %8 100 98fd4e5da5Sopenharmony_ci %21 = OpTypeBool 99fd4e5da5Sopenharmony_ci %29 = OpConstant %8 1 100fd4e5da5Sopenharmony_ci %40 = OpConstant %8 10 101fd4e5da5Sopenharmony_ci %43 = OpConstant %8 20 102fd4e5da5Sopenharmony_ci %61 = OpConstant %8 4 103fd4e5da5Sopenharmony_ci %4 = OpFunction %2 None %3 104fd4e5da5Sopenharmony_ci %5 = OpLabel 105fd4e5da5Sopenharmony_ci %33 = OpVariable %9 Function 106fd4e5da5Sopenharmony_ci %42 = OpVariable %9 Function 107fd4e5da5Sopenharmony_ci %32 = OpFunctionCall %2 %6 108fd4e5da5Sopenharmony_ci OpStore %33 %13 109fd4e5da5Sopenharmony_ci OpBranch %34 110fd4e5da5Sopenharmony_ci %34 = OpLabel 111fd4e5da5Sopenharmony_ci OpLoopMerge %36 %37 None 112fd4e5da5Sopenharmony_ci OpBranch %38 113fd4e5da5Sopenharmony_ci %38 = OpLabel 114fd4e5da5Sopenharmony_ci %39 = OpLoad %8 %33 115fd4e5da5Sopenharmony_ci %41 = OpSLessThan %21 %39 %40 116fd4e5da5Sopenharmony_ci OpBranchConditional %41 %35 %36 117fd4e5da5Sopenharmony_ci %35 = OpLabel 118fd4e5da5Sopenharmony_ci OpStore %42 %43 119fd4e5da5Sopenharmony_ci OpBranch %44 120fd4e5da5Sopenharmony_ci %44 = OpLabel 121fd4e5da5Sopenharmony_ci OpLoopMerge %46 %47 None 122fd4e5da5Sopenharmony_ci OpBranch %48 123fd4e5da5Sopenharmony_ci %48 = OpLabel 124fd4e5da5Sopenharmony_ci %49 = OpLoad %8 %42 125fd4e5da5Sopenharmony_ci %50 = OpSGreaterThan %21 %49 %13 126fd4e5da5Sopenharmony_ci OpBranchConditional %50 %45 %46 127fd4e5da5Sopenharmony_ci %45 = OpLabel 128fd4e5da5Sopenharmony_ci %51 = OpFunctionCall %2 %6 129fd4e5da5Sopenharmony_ci %52 = OpLoad %8 %42 130fd4e5da5Sopenharmony_ci %53 = OpISub %8 %52 %29 131fd4e5da5Sopenharmony_ci OpStore %42 %53 132fd4e5da5Sopenharmony_ci OpBranch %47 133fd4e5da5Sopenharmony_ci %47 = OpLabel 134fd4e5da5Sopenharmony_ci OpBranch %44 135fd4e5da5Sopenharmony_ci %46 = OpLabel 136fd4e5da5Sopenharmony_ci OpBranch %54 137fd4e5da5Sopenharmony_ci %54 = OpLabel 138fd4e5da5Sopenharmony_ci OpLoopMerge %56 %57 None 139fd4e5da5Sopenharmony_ci OpBranch %55 140fd4e5da5Sopenharmony_ci %55 = OpLabel 141fd4e5da5Sopenharmony_ci %58 = OpLoad %8 %33 142fd4e5da5Sopenharmony_ci %59 = OpIAdd %8 %58 %29 143fd4e5da5Sopenharmony_ci OpStore %33 %59 144fd4e5da5Sopenharmony_ci OpBranch %57 145fd4e5da5Sopenharmony_ci %57 = OpLabel 146fd4e5da5Sopenharmony_ci %60 = OpLoad %8 %33 147fd4e5da5Sopenharmony_ci %62 = OpSLessThan %21 %60 %61 148fd4e5da5Sopenharmony_ci OpBranchConditional %62 %54 %56 149fd4e5da5Sopenharmony_ci %56 = OpLabel 150fd4e5da5Sopenharmony_ci OpBranch %37 151fd4e5da5Sopenharmony_ci %37 = OpLabel 152fd4e5da5Sopenharmony_ci %63 = OpLoad %8 %33 153fd4e5da5Sopenharmony_ci %64 = OpIAdd %8 %63 %29 154fd4e5da5Sopenharmony_ci OpStore %33 %64 155fd4e5da5Sopenharmony_ci OpBranch %34 156fd4e5da5Sopenharmony_ci %36 = OpLabel 157fd4e5da5Sopenharmony_ci OpReturn 158fd4e5da5Sopenharmony_ci OpFunctionEnd 159fd4e5da5Sopenharmony_ci %6 = OpFunction %2 None %3 160fd4e5da5Sopenharmony_ci %7 = OpLabel 161fd4e5da5Sopenharmony_ci %10 = OpVariable %9 Function 162fd4e5da5Sopenharmony_ci %12 = OpVariable %9 Function 163fd4e5da5Sopenharmony_ci OpStore %10 %11 164fd4e5da5Sopenharmony_ci OpStore %12 %13 165fd4e5da5Sopenharmony_ci OpBranch %14 166fd4e5da5Sopenharmony_ci %14 = OpLabel 167fd4e5da5Sopenharmony_ci OpLoopMerge %16 %17 None 168fd4e5da5Sopenharmony_ci OpBranch %18 169fd4e5da5Sopenharmony_ci %18 = OpLabel 170fd4e5da5Sopenharmony_ci %19 = OpLoad %8 %12 171fd4e5da5Sopenharmony_ci %22 = OpSLessThan %21 %19 %20 172fd4e5da5Sopenharmony_ci OpBranchConditional %22 %15 %16 173fd4e5da5Sopenharmony_ci %15 = OpLabel 174fd4e5da5Sopenharmony_ci %23 = OpLoad %8 %12 175fd4e5da5Sopenharmony_ci %24 = OpLoad %8 %10 176fd4e5da5Sopenharmony_ci %25 = OpIAdd %8 %24 %23 177fd4e5da5Sopenharmony_ci OpStore %10 %25 178fd4e5da5Sopenharmony_ci %26 = OpLoad %8 %10 179fd4e5da5Sopenharmony_ci %27 = OpIMul %8 %26 %11 180fd4e5da5Sopenharmony_ci OpStore %10 %27 181fd4e5da5Sopenharmony_ci OpBranch %17 182fd4e5da5Sopenharmony_ci %17 = OpLabel 183fd4e5da5Sopenharmony_ci %28 = OpLoad %8 %12 184fd4e5da5Sopenharmony_ci %30 = OpIAdd %8 %28 %29 185fd4e5da5Sopenharmony_ci OpStore %12 %30 186fd4e5da5Sopenharmony_ci OpBranch %14 187fd4e5da5Sopenharmony_ci %16 = OpLabel 188fd4e5da5Sopenharmony_ci OpReturn 189fd4e5da5Sopenharmony_ci OpFunctionEnd 190fd4e5da5Sopenharmony_ci )"; 191fd4e5da5Sopenharmony_ci 192fd4e5da5Sopenharmony_ci// The SPIR-V came from this GLSL, which was then optimized using spirv-opt 193fd4e5da5Sopenharmony_ci// with the -O argument: 194fd4e5da5Sopenharmony_ci// 195fd4e5da5Sopenharmony_ci// #version 310 es 196fd4e5da5Sopenharmony_ci// 197fd4e5da5Sopenharmony_ci// precision highp float; 198fd4e5da5Sopenharmony_ci// 199fd4e5da5Sopenharmony_ci// layout(location = 0) out vec4 _GLF_color; 200fd4e5da5Sopenharmony_ci// 201fd4e5da5Sopenharmony_ci// layout(set = 0, binding = 0) uniform buf0 { 202fd4e5da5Sopenharmony_ci// vec2 injectionSwitch; 203fd4e5da5Sopenharmony_ci// }; 204fd4e5da5Sopenharmony_ci// layout(set = 0, binding = 1) uniform buf1 { 205fd4e5da5Sopenharmony_ci// vec2 resolution; 206fd4e5da5Sopenharmony_ci// }; 207fd4e5da5Sopenharmony_ci// bool checkSwap(float a, float b) 208fd4e5da5Sopenharmony_ci// { 209fd4e5da5Sopenharmony_ci// return gl_FragCoord.y < resolution.y / 2.0 ? a > b : a < b; 210fd4e5da5Sopenharmony_ci// } 211fd4e5da5Sopenharmony_ci// void main() 212fd4e5da5Sopenharmony_ci// { 213fd4e5da5Sopenharmony_ci// float data[10]; 214fd4e5da5Sopenharmony_ci// for(int i = 0; i < 10; i++) 215fd4e5da5Sopenharmony_ci// { 216fd4e5da5Sopenharmony_ci// data[i] = float(10 - i) * injectionSwitch.y; 217fd4e5da5Sopenharmony_ci// } 218fd4e5da5Sopenharmony_ci// for(int i = 0; i < 9; i++) 219fd4e5da5Sopenharmony_ci// { 220fd4e5da5Sopenharmony_ci// for(int j = 0; j < 10; j++) 221fd4e5da5Sopenharmony_ci// { 222fd4e5da5Sopenharmony_ci// if(j < i + 1) 223fd4e5da5Sopenharmony_ci// { 224fd4e5da5Sopenharmony_ci// continue; 225fd4e5da5Sopenharmony_ci// } 226fd4e5da5Sopenharmony_ci// bool doSwap = checkSwap(data[i], data[j]); 227fd4e5da5Sopenharmony_ci// if(doSwap) 228fd4e5da5Sopenharmony_ci// { 229fd4e5da5Sopenharmony_ci// float temp = data[i]; 230fd4e5da5Sopenharmony_ci// data[i] = data[j]; 231fd4e5da5Sopenharmony_ci// data[j] = temp; 232fd4e5da5Sopenharmony_ci// } 233fd4e5da5Sopenharmony_ci// } 234fd4e5da5Sopenharmony_ci// } 235fd4e5da5Sopenharmony_ci// if(gl_FragCoord.x < resolution.x / 2.0) 236fd4e5da5Sopenharmony_ci// { 237fd4e5da5Sopenharmony_ci// _GLF_color = vec4(data[0] / 10.0, data[5] / 10.0, data[9] / 10.0, 1.0); 238fd4e5da5Sopenharmony_ci// } 239fd4e5da5Sopenharmony_ci// else 240fd4e5da5Sopenharmony_ci// { 241fd4e5da5Sopenharmony_ci// _GLF_color = vec4(data[5] / 10.0, data[9] / 10.0, data[0] / 10.0, 1.0); 242fd4e5da5Sopenharmony_ci// } 243fd4e5da5Sopenharmony_ci// } 244fd4e5da5Sopenharmony_ci 245fd4e5da5Sopenharmony_ciconst std::string kTestShader2 = R"( 246fd4e5da5Sopenharmony_ci OpCapability Shader 247fd4e5da5Sopenharmony_ci %1 = OpExtInstImport "GLSL.std.450" 248fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 249fd4e5da5Sopenharmony_ci OpEntryPoint Fragment %4 "main" %16 %139 %25 %68 250fd4e5da5Sopenharmony_ci OpExecutionMode %4 OriginUpperLeft 251fd4e5da5Sopenharmony_ci OpSource ESSL 310 252fd4e5da5Sopenharmony_ci OpName %4 "main" 253fd4e5da5Sopenharmony_ci OpName %16 "gl_FragCoord" 254fd4e5da5Sopenharmony_ci OpName %23 "buf1" 255fd4e5da5Sopenharmony_ci OpMemberName %23 0 "resolution" 256fd4e5da5Sopenharmony_ci OpName %25 "" 257fd4e5da5Sopenharmony_ci OpName %61 "data" 258fd4e5da5Sopenharmony_ci OpName %66 "buf0" 259fd4e5da5Sopenharmony_ci OpMemberName %66 0 "injectionSwitch" 260fd4e5da5Sopenharmony_ci OpName %68 "" 261fd4e5da5Sopenharmony_ci OpName %139 "_GLF_color" 262fd4e5da5Sopenharmony_ci OpDecorate %16 BuiltIn FragCoord 263fd4e5da5Sopenharmony_ci OpMemberDecorate %23 0 Offset 0 264fd4e5da5Sopenharmony_ci OpDecorate %23 Block 265fd4e5da5Sopenharmony_ci OpDecorate %25 DescriptorSet 0 266fd4e5da5Sopenharmony_ci OpDecorate %25 Binding 1 267fd4e5da5Sopenharmony_ci OpDecorate %64 RelaxedPrecision 268fd4e5da5Sopenharmony_ci OpMemberDecorate %66 0 Offset 0 269fd4e5da5Sopenharmony_ci OpDecorate %66 Block 270fd4e5da5Sopenharmony_ci OpDecorate %68 DescriptorSet 0 271fd4e5da5Sopenharmony_ci OpDecorate %68 Binding 0 272fd4e5da5Sopenharmony_ci OpDecorate %75 RelaxedPrecision 273fd4e5da5Sopenharmony_ci OpDecorate %95 RelaxedPrecision 274fd4e5da5Sopenharmony_ci OpDecorate %126 RelaxedPrecision 275fd4e5da5Sopenharmony_ci OpDecorate %128 RelaxedPrecision 276fd4e5da5Sopenharmony_ci OpDecorate %139 Location 0 277fd4e5da5Sopenharmony_ci OpDecorate %182 RelaxedPrecision 278fd4e5da5Sopenharmony_ci OpDecorate %183 RelaxedPrecision 279fd4e5da5Sopenharmony_ci OpDecorate %184 RelaxedPrecision 280fd4e5da5Sopenharmony_ci %2 = OpTypeVoid 281fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %2 282fd4e5da5Sopenharmony_ci %6 = OpTypeFloat 32 283fd4e5da5Sopenharmony_ci %7 = OpTypePointer Function %6 284fd4e5da5Sopenharmony_ci %8 = OpTypeBool 285fd4e5da5Sopenharmony_ci %14 = OpTypeVector %6 4 286fd4e5da5Sopenharmony_ci %15 = OpTypePointer Input %14 287fd4e5da5Sopenharmony_ci %16 = OpVariable %15 Input 288fd4e5da5Sopenharmony_ci %17 = OpTypeInt 32 0 289fd4e5da5Sopenharmony_ci %18 = OpConstant %17 1 290fd4e5da5Sopenharmony_ci %19 = OpTypePointer Input %6 291fd4e5da5Sopenharmony_ci %22 = OpTypeVector %6 2 292fd4e5da5Sopenharmony_ci %23 = OpTypeStruct %22 293fd4e5da5Sopenharmony_ci %24 = OpTypePointer Uniform %23 294fd4e5da5Sopenharmony_ci %25 = OpVariable %24 Uniform 295fd4e5da5Sopenharmony_ci %26 = OpTypeInt 32 1 296fd4e5da5Sopenharmony_ci %27 = OpConstant %26 0 297fd4e5da5Sopenharmony_ci %28 = OpTypePointer Uniform %6 298fd4e5da5Sopenharmony_ci %56 = OpConstant %26 10 299fd4e5da5Sopenharmony_ci %58 = OpConstant %17 10 300fd4e5da5Sopenharmony_ci %59 = OpTypeArray %6 %58 301fd4e5da5Sopenharmony_ci %60 = OpTypePointer Function %59 302fd4e5da5Sopenharmony_ci %66 = OpTypeStruct %22 303fd4e5da5Sopenharmony_ci %67 = OpTypePointer Uniform %66 304fd4e5da5Sopenharmony_ci %68 = OpVariable %67 Uniform 305fd4e5da5Sopenharmony_ci %74 = OpConstant %26 1 306fd4e5da5Sopenharmony_ci %83 = OpConstant %26 9 307fd4e5da5Sopenharmony_ci %129 = OpConstant %17 0 308fd4e5da5Sopenharmony_ci %138 = OpTypePointer Output %14 309fd4e5da5Sopenharmony_ci %139 = OpVariable %138 Output 310fd4e5da5Sopenharmony_ci %144 = OpConstant %26 5 311fd4e5da5Sopenharmony_ci %151 = OpConstant %6 1 312fd4e5da5Sopenharmony_ci %194 = OpConstant %6 0.5 313fd4e5da5Sopenharmony_ci %195 = OpConstant %6 0.100000001 314fd4e5da5Sopenharmony_ci %4 = OpFunction %2 None %3 315fd4e5da5Sopenharmony_ci %5 = OpLabel 316fd4e5da5Sopenharmony_ci %61 = OpVariable %60 Function 317fd4e5da5Sopenharmony_ci OpBranch %50 318fd4e5da5Sopenharmony_ci %50 = OpLabel 319fd4e5da5Sopenharmony_ci %182 = OpPhi %26 %27 %5 %75 %51 320fd4e5da5Sopenharmony_ci %57 = OpSLessThan %8 %182 %56 321fd4e5da5Sopenharmony_ci OpLoopMerge %52 %51 None 322fd4e5da5Sopenharmony_ci OpBranchConditional %57 %51 %52 323fd4e5da5Sopenharmony_ci %51 = OpLabel 324fd4e5da5Sopenharmony_ci %64 = OpISub %26 %56 %182 325fd4e5da5Sopenharmony_ci %65 = OpConvertSToF %6 %64 326fd4e5da5Sopenharmony_ci %69 = OpAccessChain %28 %68 %27 %18 327fd4e5da5Sopenharmony_ci %70 = OpLoad %6 %69 328fd4e5da5Sopenharmony_ci %71 = OpFMul %6 %65 %70 329fd4e5da5Sopenharmony_ci %72 = OpAccessChain %7 %61 %182 330fd4e5da5Sopenharmony_ci OpStore %72 %71 331fd4e5da5Sopenharmony_ci %75 = OpIAdd %26 %182 %74 332fd4e5da5Sopenharmony_ci OpBranch %50 333fd4e5da5Sopenharmony_ci %52 = OpLabel 334fd4e5da5Sopenharmony_ci OpBranch %77 335fd4e5da5Sopenharmony_ci %77 = OpLabel 336fd4e5da5Sopenharmony_ci %183 = OpPhi %26 %27 %52 %128 %88 337fd4e5da5Sopenharmony_ci %84 = OpSLessThan %8 %183 %83 338fd4e5da5Sopenharmony_ci OpLoopMerge %79 %88 None 339fd4e5da5Sopenharmony_ci OpBranchConditional %84 %78 %79 340fd4e5da5Sopenharmony_ci %78 = OpLabel 341fd4e5da5Sopenharmony_ci OpBranch %86 342fd4e5da5Sopenharmony_ci %86 = OpLabel 343fd4e5da5Sopenharmony_ci %184 = OpPhi %26 %27 %78 %126 %89 344fd4e5da5Sopenharmony_ci %92 = OpSLessThan %8 %184 %56 345fd4e5da5Sopenharmony_ci OpLoopMerge %1000 %89 None 346fd4e5da5Sopenharmony_ci OpBranchConditional %92 %87 %1000 347fd4e5da5Sopenharmony_ci %87 = OpLabel 348fd4e5da5Sopenharmony_ci %95 = OpIAdd %26 %183 %74 349fd4e5da5Sopenharmony_ci %96 = OpSLessThan %8 %184 %95 350fd4e5da5Sopenharmony_ci OpSelectionMerge %98 None 351fd4e5da5Sopenharmony_ci OpBranchConditional %96 %97 %98 352fd4e5da5Sopenharmony_ci %97 = OpLabel 353fd4e5da5Sopenharmony_ci OpBranch %89 354fd4e5da5Sopenharmony_ci %98 = OpLabel 355fd4e5da5Sopenharmony_ci %104 = OpAccessChain %7 %61 %183 356fd4e5da5Sopenharmony_ci %105 = OpLoad %6 %104 357fd4e5da5Sopenharmony_ci %107 = OpAccessChain %7 %61 %184 358fd4e5da5Sopenharmony_ci %108 = OpLoad %6 %107 359fd4e5da5Sopenharmony_ci %166 = OpAccessChain %19 %16 %18 360fd4e5da5Sopenharmony_ci %167 = OpLoad %6 %166 361fd4e5da5Sopenharmony_ci %168 = OpAccessChain %28 %25 %27 %18 362fd4e5da5Sopenharmony_ci %169 = OpLoad %6 %168 363fd4e5da5Sopenharmony_ci %170 = OpFMul %6 %169 %194 364fd4e5da5Sopenharmony_ci %171 = OpFOrdLessThan %8 %167 %170 365fd4e5da5Sopenharmony_ci OpSelectionMerge %172 None 366fd4e5da5Sopenharmony_ci OpBranchConditional %171 %173 %174 367fd4e5da5Sopenharmony_ci %173 = OpLabel 368fd4e5da5Sopenharmony_ci %177 = OpFOrdGreaterThan %8 %105 %108 369fd4e5da5Sopenharmony_ci OpBranch %172 370fd4e5da5Sopenharmony_ci %174 = OpLabel 371fd4e5da5Sopenharmony_ci %180 = OpFOrdLessThan %8 %105 %108 372fd4e5da5Sopenharmony_ci OpBranch %172 373fd4e5da5Sopenharmony_ci %172 = OpLabel 374fd4e5da5Sopenharmony_ci %186 = OpPhi %8 %177 %173 %180 %174 375fd4e5da5Sopenharmony_ci OpSelectionMerge %112 None 376fd4e5da5Sopenharmony_ci OpBranchConditional %186 %111 %112 377fd4e5da5Sopenharmony_ci %111 = OpLabel 378fd4e5da5Sopenharmony_ci %116 = OpLoad %6 %104 379fd4e5da5Sopenharmony_ci %120 = OpLoad %6 %107 380fd4e5da5Sopenharmony_ci OpStore %104 %120 381fd4e5da5Sopenharmony_ci OpStore %107 %116 382fd4e5da5Sopenharmony_ci OpBranch %112 383fd4e5da5Sopenharmony_ci %112 = OpLabel 384fd4e5da5Sopenharmony_ci OpBranch %89 385fd4e5da5Sopenharmony_ci %89 = OpLabel 386fd4e5da5Sopenharmony_ci %126 = OpIAdd %26 %184 %74 387fd4e5da5Sopenharmony_ci OpBranch %86 388fd4e5da5Sopenharmony_ci %1000 = OpLabel 389fd4e5da5Sopenharmony_ci OpBranch %88 390fd4e5da5Sopenharmony_ci %88 = OpLabel 391fd4e5da5Sopenharmony_ci %128 = OpIAdd %26 %183 %74 392fd4e5da5Sopenharmony_ci OpBranch %77 393fd4e5da5Sopenharmony_ci %79 = OpLabel 394fd4e5da5Sopenharmony_ci %130 = OpAccessChain %19 %16 %129 395fd4e5da5Sopenharmony_ci %131 = OpLoad %6 %130 396fd4e5da5Sopenharmony_ci %132 = OpAccessChain %28 %25 %27 %129 397fd4e5da5Sopenharmony_ci %133 = OpLoad %6 %132 398fd4e5da5Sopenharmony_ci %134 = OpFMul %6 %133 %194 399fd4e5da5Sopenharmony_ci %135 = OpFOrdLessThan %8 %131 %134 400fd4e5da5Sopenharmony_ci OpSelectionMerge %137 None 401fd4e5da5Sopenharmony_ci OpBranchConditional %135 %136 %153 402fd4e5da5Sopenharmony_ci %136 = OpLabel 403fd4e5da5Sopenharmony_ci %140 = OpAccessChain %7 %61 %27 404fd4e5da5Sopenharmony_ci %141 = OpLoad %6 %140 405fd4e5da5Sopenharmony_ci %143 = OpFMul %6 %141 %195 406fd4e5da5Sopenharmony_ci %145 = OpAccessChain %7 %61 %144 407fd4e5da5Sopenharmony_ci %146 = OpLoad %6 %145 408fd4e5da5Sopenharmony_ci %147 = OpFMul %6 %146 %195 409fd4e5da5Sopenharmony_ci %148 = OpAccessChain %7 %61 %83 410fd4e5da5Sopenharmony_ci %149 = OpLoad %6 %148 411fd4e5da5Sopenharmony_ci %150 = OpFMul %6 %149 %195 412fd4e5da5Sopenharmony_ci %152 = OpCompositeConstruct %14 %143 %147 %150 %151 413fd4e5da5Sopenharmony_ci OpStore %139 %152 414fd4e5da5Sopenharmony_ci OpBranch %137 415fd4e5da5Sopenharmony_ci %153 = OpLabel 416fd4e5da5Sopenharmony_ci %154 = OpAccessChain %7 %61 %144 417fd4e5da5Sopenharmony_ci %155 = OpLoad %6 %154 418fd4e5da5Sopenharmony_ci %156 = OpFMul %6 %155 %195 419fd4e5da5Sopenharmony_ci %157 = OpAccessChain %7 %61 %83 420fd4e5da5Sopenharmony_ci %158 = OpLoad %6 %157 421fd4e5da5Sopenharmony_ci %159 = OpFMul %6 %158 %195 422fd4e5da5Sopenharmony_ci %160 = OpAccessChain %7 %61 %27 423fd4e5da5Sopenharmony_ci %161 = OpLoad %6 %160 424fd4e5da5Sopenharmony_ci %162 = OpFMul %6 %161 %195 425fd4e5da5Sopenharmony_ci %163 = OpCompositeConstruct %14 %156 %159 %162 %151 426fd4e5da5Sopenharmony_ci OpStore %139 %163 427fd4e5da5Sopenharmony_ci OpBranch %137 428fd4e5da5Sopenharmony_ci %137 = OpLabel 429fd4e5da5Sopenharmony_ci OpReturn 430fd4e5da5Sopenharmony_ci OpFunctionEnd 431fd4e5da5Sopenharmony_ci )"; 432fd4e5da5Sopenharmony_ci 433fd4e5da5Sopenharmony_ci// The SPIR-V came from this GLSL, which was then optimized using spirv-opt 434fd4e5da5Sopenharmony_ci// with the -O argument: 435fd4e5da5Sopenharmony_ci// 436fd4e5da5Sopenharmony_ci// #version 310 es 437fd4e5da5Sopenharmony_ci// 438fd4e5da5Sopenharmony_ci// precision highp float; 439fd4e5da5Sopenharmony_ci// 440fd4e5da5Sopenharmony_ci// layout(location = 0) out vec4 _GLF_color; 441fd4e5da5Sopenharmony_ci// 442fd4e5da5Sopenharmony_ci// layout(set = 0, binding = 0) uniform buf0 { 443fd4e5da5Sopenharmony_ci// vec2 resolution; 444fd4e5da5Sopenharmony_ci// }; 445fd4e5da5Sopenharmony_ci// void main(void) 446fd4e5da5Sopenharmony_ci// { 447fd4e5da5Sopenharmony_ci// float A[50]; 448fd4e5da5Sopenharmony_ci// for( 449fd4e5da5Sopenharmony_ci// int i = 0; 450fd4e5da5Sopenharmony_ci// i < 200; 451fd4e5da5Sopenharmony_ci// i ++ 452fd4e5da5Sopenharmony_ci// ) 453fd4e5da5Sopenharmony_ci// { 454fd4e5da5Sopenharmony_ci// if(i >= int(resolution.x)) 455fd4e5da5Sopenharmony_ci// { 456fd4e5da5Sopenharmony_ci// break; 457fd4e5da5Sopenharmony_ci// } 458fd4e5da5Sopenharmony_ci// if((4 * (i / 4)) == i) 459fd4e5da5Sopenharmony_ci// { 460fd4e5da5Sopenharmony_ci// A[i / 4] = float(i); 461fd4e5da5Sopenharmony_ci// } 462fd4e5da5Sopenharmony_ci// } 463fd4e5da5Sopenharmony_ci// for( 464fd4e5da5Sopenharmony_ci// int i = 0; 465fd4e5da5Sopenharmony_ci// i < 50; 466fd4e5da5Sopenharmony_ci// i ++ 467fd4e5da5Sopenharmony_ci// ) 468fd4e5da5Sopenharmony_ci// { 469fd4e5da5Sopenharmony_ci// if(i < int(gl_FragCoord.x)) 470fd4e5da5Sopenharmony_ci// { 471fd4e5da5Sopenharmony_ci// break; 472fd4e5da5Sopenharmony_ci// } 473fd4e5da5Sopenharmony_ci// if(i > 0) 474fd4e5da5Sopenharmony_ci// { 475fd4e5da5Sopenharmony_ci// A[i] += A[i - 1]; 476fd4e5da5Sopenharmony_ci// } 477fd4e5da5Sopenharmony_ci// } 478fd4e5da5Sopenharmony_ci// if(int(gl_FragCoord.x) < 20) 479fd4e5da5Sopenharmony_ci// { 480fd4e5da5Sopenharmony_ci// _GLF_color = vec4(A[0] / resolution.x, A[4] / resolution.y, 1.0, 1.0); 481fd4e5da5Sopenharmony_ci// } 482fd4e5da5Sopenharmony_ci// else 483fd4e5da5Sopenharmony_ci// if(int(gl_FragCoord.x) < 40) 484fd4e5da5Sopenharmony_ci// { 485fd4e5da5Sopenharmony_ci// _GLF_color = vec4(A[5] / resolution.x, A[9] / resolution.y, 1.0, 1.0); 486fd4e5da5Sopenharmony_ci// } 487fd4e5da5Sopenharmony_ci// else 488fd4e5da5Sopenharmony_ci// if(int(gl_FragCoord.x) < 60) 489fd4e5da5Sopenharmony_ci// { 490fd4e5da5Sopenharmony_ci// _GLF_color = vec4(A[10] / resolution.x, A[14] / resolution.y, 491fd4e5da5Sopenharmony_ci// 1.0, 1.0); 492fd4e5da5Sopenharmony_ci// } 493fd4e5da5Sopenharmony_ci// else 494fd4e5da5Sopenharmony_ci// if(int(gl_FragCoord.x) < 80) 495fd4e5da5Sopenharmony_ci// { 496fd4e5da5Sopenharmony_ci// _GLF_color = vec4(A[15] / resolution.x, A[19] / resolution.y, 497fd4e5da5Sopenharmony_ci// 1.0, 1.0); 498fd4e5da5Sopenharmony_ci// } 499fd4e5da5Sopenharmony_ci// else 500fd4e5da5Sopenharmony_ci// if(int(gl_FragCoord.x) < 100) 501fd4e5da5Sopenharmony_ci// { 502fd4e5da5Sopenharmony_ci// _GLF_color = vec4(A[20] / resolution.x, A[24] / resolution.y, 503fd4e5da5Sopenharmony_ci// 1.0, 1.0); 504fd4e5da5Sopenharmony_ci// } 505fd4e5da5Sopenharmony_ci// else 506fd4e5da5Sopenharmony_ci// if(int(gl_FragCoord.x) < 120) 507fd4e5da5Sopenharmony_ci// { 508fd4e5da5Sopenharmony_ci// _GLF_color = vec4(A[25] / resolution.x, A[29] / resolution.y, 509fd4e5da5Sopenharmony_ci// 1.0, 1.0); 510fd4e5da5Sopenharmony_ci// } 511fd4e5da5Sopenharmony_ci// else 512fd4e5da5Sopenharmony_ci// if(int(gl_FragCoord.x) < 140) 513fd4e5da5Sopenharmony_ci// { 514fd4e5da5Sopenharmony_ci// _GLF_color = vec4(A[30] / resolution.x, A[34] / resolution.y, 515fd4e5da5Sopenharmony_ci// 1.0, 1.0); 516fd4e5da5Sopenharmony_ci// } 517fd4e5da5Sopenharmony_ci// else 518fd4e5da5Sopenharmony_ci// if(int(gl_FragCoord.x) < 160) 519fd4e5da5Sopenharmony_ci// { 520fd4e5da5Sopenharmony_ci// _GLF_color = vec4(A[35] / resolution.x, A[39] / 521fd4e5da5Sopenharmony_ci// resolution.y, 1.0, 1.0); 522fd4e5da5Sopenharmony_ci// } 523fd4e5da5Sopenharmony_ci// else 524fd4e5da5Sopenharmony_ci// if(int(gl_FragCoord.x) < 180) 525fd4e5da5Sopenharmony_ci// { 526fd4e5da5Sopenharmony_ci// _GLF_color = vec4(A[40] / resolution.x, A[44] / 527fd4e5da5Sopenharmony_ci// resolution.y, 1.0, 1.0); 528fd4e5da5Sopenharmony_ci// } 529fd4e5da5Sopenharmony_ci// else 530fd4e5da5Sopenharmony_ci// if(int(gl_FragCoord.x) < 180) 531fd4e5da5Sopenharmony_ci// { 532fd4e5da5Sopenharmony_ci// _GLF_color = vec4(A[45] / resolution.x, A[49] / 533fd4e5da5Sopenharmony_ci// resolution.y, 1.0, 1.0); 534fd4e5da5Sopenharmony_ci// } 535fd4e5da5Sopenharmony_ci// else 536fd4e5da5Sopenharmony_ci// { 537fd4e5da5Sopenharmony_ci// discard; 538fd4e5da5Sopenharmony_ci// } 539fd4e5da5Sopenharmony_ci// } 540fd4e5da5Sopenharmony_ci 541fd4e5da5Sopenharmony_ciconst std::string kTestShader3 = R"( 542fd4e5da5Sopenharmony_ci OpCapability Shader 543fd4e5da5Sopenharmony_ci %1 = OpExtInstImport "GLSL.std.450" 544fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 545fd4e5da5Sopenharmony_ci OpEntryPoint Fragment %4 "main" %68 %100 %24 546fd4e5da5Sopenharmony_ci OpExecutionMode %4 OriginUpperLeft 547fd4e5da5Sopenharmony_ci OpSource ESSL 310 548fd4e5da5Sopenharmony_ci OpName %4 "main" 549fd4e5da5Sopenharmony_ci OpName %22 "buf0" 550fd4e5da5Sopenharmony_ci OpMemberName %22 0 "resolution" 551fd4e5da5Sopenharmony_ci OpName %24 "" 552fd4e5da5Sopenharmony_ci OpName %46 "A" 553fd4e5da5Sopenharmony_ci OpName %68 "gl_FragCoord" 554fd4e5da5Sopenharmony_ci OpName %100 "_GLF_color" 555fd4e5da5Sopenharmony_ci OpMemberDecorate %22 0 Offset 0 556fd4e5da5Sopenharmony_ci OpDecorate %22 Block 557fd4e5da5Sopenharmony_ci OpDecorate %24 DescriptorSet 0 558fd4e5da5Sopenharmony_ci OpDecorate %24 Binding 0 559fd4e5da5Sopenharmony_ci OpDecorate %37 RelaxedPrecision 560fd4e5da5Sopenharmony_ci OpDecorate %38 RelaxedPrecision 561fd4e5da5Sopenharmony_ci OpDecorate %55 RelaxedPrecision 562fd4e5da5Sopenharmony_ci OpDecorate %68 BuiltIn FragCoord 563fd4e5da5Sopenharmony_ci OpDecorate %83 RelaxedPrecision 564fd4e5da5Sopenharmony_ci OpDecorate %91 RelaxedPrecision 565fd4e5da5Sopenharmony_ci OpDecorate %100 Location 0 566fd4e5da5Sopenharmony_ci OpDecorate %302 RelaxedPrecision 567fd4e5da5Sopenharmony_ci OpDecorate %304 RelaxedPrecision 568fd4e5da5Sopenharmony_ci %2 = OpTypeVoid 569fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %2 570fd4e5da5Sopenharmony_ci %6 = OpTypeInt 32 1 571fd4e5da5Sopenharmony_ci %9 = OpConstant %6 0 572fd4e5da5Sopenharmony_ci %16 = OpConstant %6 200 573fd4e5da5Sopenharmony_ci %17 = OpTypeBool 574fd4e5da5Sopenharmony_ci %20 = OpTypeFloat 32 575fd4e5da5Sopenharmony_ci %21 = OpTypeVector %20 2 576fd4e5da5Sopenharmony_ci %22 = OpTypeStruct %21 577fd4e5da5Sopenharmony_ci %23 = OpTypePointer Uniform %22 578fd4e5da5Sopenharmony_ci %24 = OpVariable %23 Uniform 579fd4e5da5Sopenharmony_ci %25 = OpTypeInt 32 0 580fd4e5da5Sopenharmony_ci %26 = OpConstant %25 0 581fd4e5da5Sopenharmony_ci %27 = OpTypePointer Uniform %20 582fd4e5da5Sopenharmony_ci %35 = OpConstant %6 4 583fd4e5da5Sopenharmony_ci %43 = OpConstant %25 50 584fd4e5da5Sopenharmony_ci %44 = OpTypeArray %20 %43 585fd4e5da5Sopenharmony_ci %45 = OpTypePointer Function %44 586fd4e5da5Sopenharmony_ci %51 = OpTypePointer Function %20 587fd4e5da5Sopenharmony_ci %54 = OpConstant %6 1 588fd4e5da5Sopenharmony_ci %63 = OpConstant %6 50 589fd4e5da5Sopenharmony_ci %66 = OpTypeVector %20 4 590fd4e5da5Sopenharmony_ci %67 = OpTypePointer Input %66 591fd4e5da5Sopenharmony_ci %68 = OpVariable %67 Input 592fd4e5da5Sopenharmony_ci %69 = OpTypePointer Input %20 593fd4e5da5Sopenharmony_ci %95 = OpConstant %6 20 594fd4e5da5Sopenharmony_ci %99 = OpTypePointer Output %66 595fd4e5da5Sopenharmony_ci %100 = OpVariable %99 Output 596fd4e5da5Sopenharmony_ci %108 = OpConstant %25 1 597fd4e5da5Sopenharmony_ci %112 = OpConstant %20 1 598fd4e5da5Sopenharmony_ci %118 = OpConstant %6 40 599fd4e5da5Sopenharmony_ci %122 = OpConstant %6 5 600fd4e5da5Sopenharmony_ci %128 = OpConstant %6 9 601fd4e5da5Sopenharmony_ci %139 = OpConstant %6 60 602fd4e5da5Sopenharmony_ci %143 = OpConstant %6 10 603fd4e5da5Sopenharmony_ci %149 = OpConstant %6 14 604fd4e5da5Sopenharmony_ci %160 = OpConstant %6 80 605fd4e5da5Sopenharmony_ci %164 = OpConstant %6 15 606fd4e5da5Sopenharmony_ci %170 = OpConstant %6 19 607fd4e5da5Sopenharmony_ci %181 = OpConstant %6 100 608fd4e5da5Sopenharmony_ci %190 = OpConstant %6 24 609fd4e5da5Sopenharmony_ci %201 = OpConstant %6 120 610fd4e5da5Sopenharmony_ci %205 = OpConstant %6 25 611fd4e5da5Sopenharmony_ci %211 = OpConstant %6 29 612fd4e5da5Sopenharmony_ci %222 = OpConstant %6 140 613fd4e5da5Sopenharmony_ci %226 = OpConstant %6 30 614fd4e5da5Sopenharmony_ci %232 = OpConstant %6 34 615fd4e5da5Sopenharmony_ci %243 = OpConstant %6 160 616fd4e5da5Sopenharmony_ci %247 = OpConstant %6 35 617fd4e5da5Sopenharmony_ci %253 = OpConstant %6 39 618fd4e5da5Sopenharmony_ci %264 = OpConstant %6 180 619fd4e5da5Sopenharmony_ci %273 = OpConstant %6 44 620fd4e5da5Sopenharmony_ci %287 = OpConstant %6 45 621fd4e5da5Sopenharmony_ci %293 = OpConstant %6 49 622fd4e5da5Sopenharmony_ci %4 = OpFunction %2 None %3 623fd4e5da5Sopenharmony_ci %5 = OpLabel 624fd4e5da5Sopenharmony_ci %46 = OpVariable %45 Function 625fd4e5da5Sopenharmony_ci OpBranch %10 626fd4e5da5Sopenharmony_ci %10 = OpLabel 627fd4e5da5Sopenharmony_ci %302 = OpPhi %6 %9 %5 %55 %42 628fd4e5da5Sopenharmony_ci %18 = OpSLessThan %17 %302 %16 629fd4e5da5Sopenharmony_ci OpLoopMerge %12 %42 None 630fd4e5da5Sopenharmony_ci OpBranchConditional %18 %11 %12 631fd4e5da5Sopenharmony_ci %11 = OpLabel 632fd4e5da5Sopenharmony_ci %28 = OpAccessChain %27 %24 %9 %26 633fd4e5da5Sopenharmony_ci %29 = OpLoad %20 %28 634fd4e5da5Sopenharmony_ci %30 = OpConvertFToS %6 %29 635fd4e5da5Sopenharmony_ci %31 = OpSGreaterThanEqual %17 %302 %30 636fd4e5da5Sopenharmony_ci OpSelectionMerge %33 None 637fd4e5da5Sopenharmony_ci OpBranchConditional %31 %32 %33 638fd4e5da5Sopenharmony_ci %32 = OpLabel 639fd4e5da5Sopenharmony_ci OpBranch %12 640fd4e5da5Sopenharmony_ci %33 = OpLabel 641fd4e5da5Sopenharmony_ci %37 = OpSDiv %6 %302 %35 642fd4e5da5Sopenharmony_ci %38 = OpIMul %6 %35 %37 643fd4e5da5Sopenharmony_ci %40 = OpIEqual %17 %38 %302 644fd4e5da5Sopenharmony_ci OpBranchConditional %40 %41 %42 645fd4e5da5Sopenharmony_ci %41 = OpLabel 646fd4e5da5Sopenharmony_ci %50 = OpConvertSToF %20 %302 647fd4e5da5Sopenharmony_ci %52 = OpAccessChain %51 %46 %37 648fd4e5da5Sopenharmony_ci OpStore %52 %50 649fd4e5da5Sopenharmony_ci OpBranch %42 650fd4e5da5Sopenharmony_ci %42 = OpLabel 651fd4e5da5Sopenharmony_ci %55 = OpIAdd %6 %302 %54 652fd4e5da5Sopenharmony_ci OpBranch %10 653fd4e5da5Sopenharmony_ci %12 = OpLabel 654fd4e5da5Sopenharmony_ci OpBranch %57 655fd4e5da5Sopenharmony_ci %57 = OpLabel 656fd4e5da5Sopenharmony_ci %304 = OpPhi %6 %9 %12 %91 %80 657fd4e5da5Sopenharmony_ci %64 = OpSLessThan %17 %304 %63 658fd4e5da5Sopenharmony_ci OpLoopMerge %59 %80 None 659fd4e5da5Sopenharmony_ci OpBranchConditional %64 %58 %59 660fd4e5da5Sopenharmony_ci %58 = OpLabel 661fd4e5da5Sopenharmony_ci %70 = OpAccessChain %69 %68 %26 662fd4e5da5Sopenharmony_ci %71 = OpLoad %20 %70 663fd4e5da5Sopenharmony_ci %72 = OpConvertFToS %6 %71 664fd4e5da5Sopenharmony_ci %73 = OpSLessThan %17 %304 %72 665fd4e5da5Sopenharmony_ci OpSelectionMerge %75 None 666fd4e5da5Sopenharmony_ci OpBranchConditional %73 %74 %75 667fd4e5da5Sopenharmony_ci %74 = OpLabel 668fd4e5da5Sopenharmony_ci OpBranch %59 669fd4e5da5Sopenharmony_ci %75 = OpLabel 670fd4e5da5Sopenharmony_ci %78 = OpSGreaterThan %17 %304 %9 671fd4e5da5Sopenharmony_ci OpBranchConditional %78 %79 %80 672fd4e5da5Sopenharmony_ci %79 = OpLabel 673fd4e5da5Sopenharmony_ci %83 = OpISub %6 %304 %54 674fd4e5da5Sopenharmony_ci %84 = OpAccessChain %51 %46 %83 675fd4e5da5Sopenharmony_ci %85 = OpLoad %20 %84 676fd4e5da5Sopenharmony_ci %86 = OpAccessChain %51 %46 %304 677fd4e5da5Sopenharmony_ci %87 = OpLoad %20 %86 678fd4e5da5Sopenharmony_ci %88 = OpFAdd %20 %87 %85 679fd4e5da5Sopenharmony_ci OpStore %86 %88 680fd4e5da5Sopenharmony_ci OpBranch %80 681fd4e5da5Sopenharmony_ci %80 = OpLabel 682fd4e5da5Sopenharmony_ci %91 = OpIAdd %6 %304 %54 683fd4e5da5Sopenharmony_ci OpBranch %57 684fd4e5da5Sopenharmony_ci %59 = OpLabel 685fd4e5da5Sopenharmony_ci %92 = OpAccessChain %69 %68 %26 686fd4e5da5Sopenharmony_ci %93 = OpLoad %20 %92 687fd4e5da5Sopenharmony_ci %94 = OpConvertFToS %6 %93 688fd4e5da5Sopenharmony_ci %96 = OpSLessThan %17 %94 %95 689fd4e5da5Sopenharmony_ci OpSelectionMerge %98 None 690fd4e5da5Sopenharmony_ci OpBranchConditional %96 %97 %114 691fd4e5da5Sopenharmony_ci %97 = OpLabel 692fd4e5da5Sopenharmony_ci %101 = OpAccessChain %51 %46 %9 693fd4e5da5Sopenharmony_ci %102 = OpLoad %20 %101 694fd4e5da5Sopenharmony_ci %103 = OpAccessChain %27 %24 %9 %26 695fd4e5da5Sopenharmony_ci %104 = OpLoad %20 %103 696fd4e5da5Sopenharmony_ci %105 = OpFDiv %20 %102 %104 697fd4e5da5Sopenharmony_ci %106 = OpAccessChain %51 %46 %35 698fd4e5da5Sopenharmony_ci %107 = OpLoad %20 %106 699fd4e5da5Sopenharmony_ci %109 = OpAccessChain %27 %24 %9 %108 700fd4e5da5Sopenharmony_ci %110 = OpLoad %20 %109 701fd4e5da5Sopenharmony_ci %111 = OpFDiv %20 %107 %110 702fd4e5da5Sopenharmony_ci %113 = OpCompositeConstruct %66 %105 %111 %112 %112 703fd4e5da5Sopenharmony_ci OpStore %100 %113 704fd4e5da5Sopenharmony_ci OpBranch %98 705fd4e5da5Sopenharmony_ci %114 = OpLabel 706fd4e5da5Sopenharmony_ci %119 = OpSLessThan %17 %94 %118 707fd4e5da5Sopenharmony_ci OpSelectionMerge %121 None 708fd4e5da5Sopenharmony_ci OpBranchConditional %119 %120 %135 709fd4e5da5Sopenharmony_ci %120 = OpLabel 710fd4e5da5Sopenharmony_ci %123 = OpAccessChain %51 %46 %122 711fd4e5da5Sopenharmony_ci %124 = OpLoad %20 %123 712fd4e5da5Sopenharmony_ci %125 = OpAccessChain %27 %24 %9 %26 713fd4e5da5Sopenharmony_ci %126 = OpLoad %20 %125 714fd4e5da5Sopenharmony_ci %127 = OpFDiv %20 %124 %126 715fd4e5da5Sopenharmony_ci %129 = OpAccessChain %51 %46 %128 716fd4e5da5Sopenharmony_ci %130 = OpLoad %20 %129 717fd4e5da5Sopenharmony_ci %131 = OpAccessChain %27 %24 %9 %108 718fd4e5da5Sopenharmony_ci %132 = OpLoad %20 %131 719fd4e5da5Sopenharmony_ci %133 = OpFDiv %20 %130 %132 720fd4e5da5Sopenharmony_ci %134 = OpCompositeConstruct %66 %127 %133 %112 %112 721fd4e5da5Sopenharmony_ci OpStore %100 %134 722fd4e5da5Sopenharmony_ci OpBranch %121 723fd4e5da5Sopenharmony_ci %135 = OpLabel 724fd4e5da5Sopenharmony_ci %140 = OpSLessThan %17 %94 %139 725fd4e5da5Sopenharmony_ci OpSelectionMerge %142 None 726fd4e5da5Sopenharmony_ci OpBranchConditional %140 %141 %156 727fd4e5da5Sopenharmony_ci %141 = OpLabel 728fd4e5da5Sopenharmony_ci %144 = OpAccessChain %51 %46 %143 729fd4e5da5Sopenharmony_ci %145 = OpLoad %20 %144 730fd4e5da5Sopenharmony_ci %146 = OpAccessChain %27 %24 %9 %26 731fd4e5da5Sopenharmony_ci %147 = OpLoad %20 %146 732fd4e5da5Sopenharmony_ci %148 = OpFDiv %20 %145 %147 733fd4e5da5Sopenharmony_ci %150 = OpAccessChain %51 %46 %149 734fd4e5da5Sopenharmony_ci %151 = OpLoad %20 %150 735fd4e5da5Sopenharmony_ci %152 = OpAccessChain %27 %24 %9 %108 736fd4e5da5Sopenharmony_ci %153 = OpLoad %20 %152 737fd4e5da5Sopenharmony_ci %154 = OpFDiv %20 %151 %153 738fd4e5da5Sopenharmony_ci %155 = OpCompositeConstruct %66 %148 %154 %112 %112 739fd4e5da5Sopenharmony_ci OpStore %100 %155 740fd4e5da5Sopenharmony_ci OpBranch %142 741fd4e5da5Sopenharmony_ci %156 = OpLabel 742fd4e5da5Sopenharmony_ci %161 = OpSLessThan %17 %94 %160 743fd4e5da5Sopenharmony_ci OpSelectionMerge %163 None 744fd4e5da5Sopenharmony_ci OpBranchConditional %161 %162 %177 745fd4e5da5Sopenharmony_ci %162 = OpLabel 746fd4e5da5Sopenharmony_ci %165 = OpAccessChain %51 %46 %164 747fd4e5da5Sopenharmony_ci %166 = OpLoad %20 %165 748fd4e5da5Sopenharmony_ci %167 = OpAccessChain %27 %24 %9 %26 749fd4e5da5Sopenharmony_ci %168 = OpLoad %20 %167 750fd4e5da5Sopenharmony_ci %169 = OpFDiv %20 %166 %168 751fd4e5da5Sopenharmony_ci %171 = OpAccessChain %51 %46 %170 752fd4e5da5Sopenharmony_ci %172 = OpLoad %20 %171 753fd4e5da5Sopenharmony_ci %173 = OpAccessChain %27 %24 %9 %108 754fd4e5da5Sopenharmony_ci %174 = OpLoad %20 %173 755fd4e5da5Sopenharmony_ci %175 = OpFDiv %20 %172 %174 756fd4e5da5Sopenharmony_ci %176 = OpCompositeConstruct %66 %169 %175 %112 %112 757fd4e5da5Sopenharmony_ci OpStore %100 %176 758fd4e5da5Sopenharmony_ci OpBranch %163 759fd4e5da5Sopenharmony_ci %177 = OpLabel 760fd4e5da5Sopenharmony_ci %182 = OpSLessThan %17 %94 %181 761fd4e5da5Sopenharmony_ci OpSelectionMerge %184 None 762fd4e5da5Sopenharmony_ci OpBranchConditional %182 %183 %197 763fd4e5da5Sopenharmony_ci %183 = OpLabel 764fd4e5da5Sopenharmony_ci %185 = OpAccessChain %51 %46 %95 765fd4e5da5Sopenharmony_ci %186 = OpLoad %20 %185 766fd4e5da5Sopenharmony_ci %187 = OpAccessChain %27 %24 %9 %26 767fd4e5da5Sopenharmony_ci %188 = OpLoad %20 %187 768fd4e5da5Sopenharmony_ci %189 = OpFDiv %20 %186 %188 769fd4e5da5Sopenharmony_ci %191 = OpAccessChain %51 %46 %190 770fd4e5da5Sopenharmony_ci %192 = OpLoad %20 %191 771fd4e5da5Sopenharmony_ci %193 = OpAccessChain %27 %24 %9 %108 772fd4e5da5Sopenharmony_ci %194 = OpLoad %20 %193 773fd4e5da5Sopenharmony_ci %195 = OpFDiv %20 %192 %194 774fd4e5da5Sopenharmony_ci %196 = OpCompositeConstruct %66 %189 %195 %112 %112 775fd4e5da5Sopenharmony_ci OpStore %100 %196 776fd4e5da5Sopenharmony_ci OpBranch %184 777fd4e5da5Sopenharmony_ci %197 = OpLabel 778fd4e5da5Sopenharmony_ci %202 = OpSLessThan %17 %94 %201 779fd4e5da5Sopenharmony_ci OpSelectionMerge %204 None 780fd4e5da5Sopenharmony_ci OpBranchConditional %202 %203 %218 781fd4e5da5Sopenharmony_ci %203 = OpLabel 782fd4e5da5Sopenharmony_ci %206 = OpAccessChain %51 %46 %205 783fd4e5da5Sopenharmony_ci %207 = OpLoad %20 %206 784fd4e5da5Sopenharmony_ci %208 = OpAccessChain %27 %24 %9 %26 785fd4e5da5Sopenharmony_ci %209 = OpLoad %20 %208 786fd4e5da5Sopenharmony_ci %210 = OpFDiv %20 %207 %209 787fd4e5da5Sopenharmony_ci %212 = OpAccessChain %51 %46 %211 788fd4e5da5Sopenharmony_ci %213 = OpLoad %20 %212 789fd4e5da5Sopenharmony_ci %214 = OpAccessChain %27 %24 %9 %108 790fd4e5da5Sopenharmony_ci %215 = OpLoad %20 %214 791fd4e5da5Sopenharmony_ci %216 = OpFDiv %20 %213 %215 792fd4e5da5Sopenharmony_ci %217 = OpCompositeConstruct %66 %210 %216 %112 %112 793fd4e5da5Sopenharmony_ci OpStore %100 %217 794fd4e5da5Sopenharmony_ci OpBranch %204 795fd4e5da5Sopenharmony_ci %218 = OpLabel 796fd4e5da5Sopenharmony_ci %223 = OpSLessThan %17 %94 %222 797fd4e5da5Sopenharmony_ci OpSelectionMerge %225 None 798fd4e5da5Sopenharmony_ci OpBranchConditional %223 %224 %239 799fd4e5da5Sopenharmony_ci %224 = OpLabel 800fd4e5da5Sopenharmony_ci %227 = OpAccessChain %51 %46 %226 801fd4e5da5Sopenharmony_ci %228 = OpLoad %20 %227 802fd4e5da5Sopenharmony_ci %229 = OpAccessChain %27 %24 %9 %26 803fd4e5da5Sopenharmony_ci %230 = OpLoad %20 %229 804fd4e5da5Sopenharmony_ci %231 = OpFDiv %20 %228 %230 805fd4e5da5Sopenharmony_ci %233 = OpAccessChain %51 %46 %232 806fd4e5da5Sopenharmony_ci %234 = OpLoad %20 %233 807fd4e5da5Sopenharmony_ci %235 = OpAccessChain %27 %24 %9 %108 808fd4e5da5Sopenharmony_ci %236 = OpLoad %20 %235 809fd4e5da5Sopenharmony_ci %237 = OpFDiv %20 %234 %236 810fd4e5da5Sopenharmony_ci %238 = OpCompositeConstruct %66 %231 %237 %112 %112 811fd4e5da5Sopenharmony_ci OpStore %100 %238 812fd4e5da5Sopenharmony_ci OpBranch %225 813fd4e5da5Sopenharmony_ci %239 = OpLabel 814fd4e5da5Sopenharmony_ci %244 = OpSLessThan %17 %94 %243 815fd4e5da5Sopenharmony_ci OpSelectionMerge %246 None 816fd4e5da5Sopenharmony_ci OpBranchConditional %244 %245 %260 817fd4e5da5Sopenharmony_ci %245 = OpLabel 818fd4e5da5Sopenharmony_ci %248 = OpAccessChain %51 %46 %247 819fd4e5da5Sopenharmony_ci %249 = OpLoad %20 %248 820fd4e5da5Sopenharmony_ci %250 = OpAccessChain %27 %24 %9 %26 821fd4e5da5Sopenharmony_ci %251 = OpLoad %20 %250 822fd4e5da5Sopenharmony_ci %252 = OpFDiv %20 %249 %251 823fd4e5da5Sopenharmony_ci %254 = OpAccessChain %51 %46 %253 824fd4e5da5Sopenharmony_ci %255 = OpLoad %20 %254 825fd4e5da5Sopenharmony_ci %256 = OpAccessChain %27 %24 %9 %108 826fd4e5da5Sopenharmony_ci %257 = OpLoad %20 %256 827fd4e5da5Sopenharmony_ci %258 = OpFDiv %20 %255 %257 828fd4e5da5Sopenharmony_ci %259 = OpCompositeConstruct %66 %252 %258 %112 %112 829fd4e5da5Sopenharmony_ci OpStore %100 %259 830fd4e5da5Sopenharmony_ci OpBranch %246 831fd4e5da5Sopenharmony_ci %260 = OpLabel 832fd4e5da5Sopenharmony_ci %265 = OpSLessThan %17 %94 %264 833fd4e5da5Sopenharmony_ci OpSelectionMerge %267 None 834fd4e5da5Sopenharmony_ci OpBranchConditional %265 %266 %280 835fd4e5da5Sopenharmony_ci %266 = OpLabel 836fd4e5da5Sopenharmony_ci %268 = OpAccessChain %51 %46 %118 837fd4e5da5Sopenharmony_ci %269 = OpLoad %20 %268 838fd4e5da5Sopenharmony_ci %270 = OpAccessChain %27 %24 %9 %26 839fd4e5da5Sopenharmony_ci %271 = OpLoad %20 %270 840fd4e5da5Sopenharmony_ci %272 = OpFDiv %20 %269 %271 841fd4e5da5Sopenharmony_ci %274 = OpAccessChain %51 %46 %273 842fd4e5da5Sopenharmony_ci %275 = OpLoad %20 %274 843fd4e5da5Sopenharmony_ci %276 = OpAccessChain %27 %24 %9 %108 844fd4e5da5Sopenharmony_ci %277 = OpLoad %20 %276 845fd4e5da5Sopenharmony_ci %278 = OpFDiv %20 %275 %277 846fd4e5da5Sopenharmony_ci %279 = OpCompositeConstruct %66 %272 %278 %112 %112 847fd4e5da5Sopenharmony_ci OpStore %100 %279 848fd4e5da5Sopenharmony_ci OpBranch %267 849fd4e5da5Sopenharmony_ci %280 = OpLabel 850fd4e5da5Sopenharmony_ci OpSelectionMerge %285 None 851fd4e5da5Sopenharmony_ci OpBranchConditional %265 %285 %300 852fd4e5da5Sopenharmony_ci %285 = OpLabel 853fd4e5da5Sopenharmony_ci %288 = OpAccessChain %51 %46 %287 854fd4e5da5Sopenharmony_ci %289 = OpLoad %20 %288 855fd4e5da5Sopenharmony_ci %290 = OpAccessChain %27 %24 %9 %26 856fd4e5da5Sopenharmony_ci %291 = OpLoad %20 %290 857fd4e5da5Sopenharmony_ci %292 = OpFDiv %20 %289 %291 858fd4e5da5Sopenharmony_ci %294 = OpAccessChain %51 %46 %293 859fd4e5da5Sopenharmony_ci %295 = OpLoad %20 %294 860fd4e5da5Sopenharmony_ci %296 = OpAccessChain %27 %24 %9 %108 861fd4e5da5Sopenharmony_ci %297 = OpLoad %20 %296 862fd4e5da5Sopenharmony_ci %298 = OpFDiv %20 %295 %297 863fd4e5da5Sopenharmony_ci %299 = OpCompositeConstruct %66 %292 %298 %112 %112 864fd4e5da5Sopenharmony_ci OpStore %100 %299 865fd4e5da5Sopenharmony_ci OpBranch %267 866fd4e5da5Sopenharmony_ci %300 = OpLabel 867fd4e5da5Sopenharmony_ci OpKill 868fd4e5da5Sopenharmony_ci %267 = OpLabel 869fd4e5da5Sopenharmony_ci OpBranch %246 870fd4e5da5Sopenharmony_ci %246 = OpLabel 871fd4e5da5Sopenharmony_ci OpBranch %225 872fd4e5da5Sopenharmony_ci %225 = OpLabel 873fd4e5da5Sopenharmony_ci OpBranch %204 874fd4e5da5Sopenharmony_ci %204 = OpLabel 875fd4e5da5Sopenharmony_ci OpBranch %184 876fd4e5da5Sopenharmony_ci %184 = OpLabel 877fd4e5da5Sopenharmony_ci OpBranch %163 878fd4e5da5Sopenharmony_ci %163 = OpLabel 879fd4e5da5Sopenharmony_ci OpBranch %142 880fd4e5da5Sopenharmony_ci %142 = OpLabel 881fd4e5da5Sopenharmony_ci OpBranch %121 882fd4e5da5Sopenharmony_ci %121 = OpLabel 883fd4e5da5Sopenharmony_ci OpBranch %98 884fd4e5da5Sopenharmony_ci %98 = OpLabel 885fd4e5da5Sopenharmony_ci OpReturn 886fd4e5da5Sopenharmony_ci OpFunctionEnd 887fd4e5da5Sopenharmony_ci )"; 888fd4e5da5Sopenharmony_ci 889fd4e5da5Sopenharmony_ci// The SPIR-V comes from the 'matrices_smart_loops' GLSL shader that ships 890fd4e5da5Sopenharmony_ci// with GraphicsFuzz. 891fd4e5da5Sopenharmony_ci 892fd4e5da5Sopenharmony_ciconst std::string kTestShader4 = R"( 893fd4e5da5Sopenharmony_ci OpCapability Shader 894fd4e5da5Sopenharmony_ci %1 = OpExtInstImport "GLSL.std.450" 895fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 896fd4e5da5Sopenharmony_ci OpEntryPoint Fragment %4 "main" %327 %363 %65 %70 %80 %90 %99 %108 %117 %126 %135 %144 %333 897fd4e5da5Sopenharmony_ci OpExecutionMode %4 OriginUpperLeft 898fd4e5da5Sopenharmony_ci OpSource ESSL 310 899fd4e5da5Sopenharmony_ci OpName %4 "main" 900fd4e5da5Sopenharmony_ci OpName %8 "matrix_number" 901fd4e5da5Sopenharmony_ci OpName %12 "cols" 902fd4e5da5Sopenharmony_ci OpName %23 "rows" 903fd4e5da5Sopenharmony_ci OpName %31 "c" 904fd4e5da5Sopenharmony_ci OpName %41 "r" 905fd4e5da5Sopenharmony_ci OpName %65 "m22" 906fd4e5da5Sopenharmony_ci OpName %68 "buf0" 907fd4e5da5Sopenharmony_ci OpMemberName %68 0 "one" 908fd4e5da5Sopenharmony_ci OpName %70 "" 909fd4e5da5Sopenharmony_ci OpName %80 "m23" 910fd4e5da5Sopenharmony_ci OpName %90 "m24" 911fd4e5da5Sopenharmony_ci OpName %99 "m32" 912fd4e5da5Sopenharmony_ci OpName %108 "m33" 913fd4e5da5Sopenharmony_ci OpName %117 "m34" 914fd4e5da5Sopenharmony_ci OpName %126 "m42" 915fd4e5da5Sopenharmony_ci OpName %135 "m43" 916fd4e5da5Sopenharmony_ci OpName %144 "m44" 917fd4e5da5Sopenharmony_ci OpName %164 "sum_index" 918fd4e5da5Sopenharmony_ci OpName %165 "cols" 919fd4e5da5Sopenharmony_ci OpName %173 "rows" 920fd4e5da5Sopenharmony_ci OpName %184 "sums" 921fd4e5da5Sopenharmony_ci OpName %189 "c" 922fd4e5da5Sopenharmony_ci OpName %198 "r" 923fd4e5da5Sopenharmony_ci OpName %325 "region_x" 924fd4e5da5Sopenharmony_ci OpName %327 "gl_FragCoord" 925fd4e5da5Sopenharmony_ci OpName %331 "buf1" 926fd4e5da5Sopenharmony_ci OpMemberName %331 0 "resolution" 927fd4e5da5Sopenharmony_ci OpName %333 "" 928fd4e5da5Sopenharmony_ci OpName %340 "region_y" 929fd4e5da5Sopenharmony_ci OpName %348 "overall_region" 930fd4e5da5Sopenharmony_ci OpName %363 "_GLF_color" 931fd4e5da5Sopenharmony_ci OpDecorate %8 RelaxedPrecision 932fd4e5da5Sopenharmony_ci OpDecorate %12 RelaxedPrecision 933fd4e5da5Sopenharmony_ci OpDecorate %19 RelaxedPrecision 934fd4e5da5Sopenharmony_ci OpDecorate %23 RelaxedPrecision 935fd4e5da5Sopenharmony_ci OpDecorate %29 RelaxedPrecision 936fd4e5da5Sopenharmony_ci OpDecorate %31 RelaxedPrecision 937fd4e5da5Sopenharmony_ci OpDecorate %38 RelaxedPrecision 938fd4e5da5Sopenharmony_ci OpDecorate %39 RelaxedPrecision 939fd4e5da5Sopenharmony_ci OpDecorate %41 RelaxedPrecision 940fd4e5da5Sopenharmony_ci OpDecorate %47 RelaxedPrecision 941fd4e5da5Sopenharmony_ci OpDecorate %48 RelaxedPrecision 942fd4e5da5Sopenharmony_ci OpDecorate %50 RelaxedPrecision 943fd4e5da5Sopenharmony_ci OpDecorate %66 RelaxedPrecision 944fd4e5da5Sopenharmony_ci OpDecorate %67 RelaxedPrecision 945fd4e5da5Sopenharmony_ci OpMemberDecorate %68 0 Offset 0 946fd4e5da5Sopenharmony_ci OpDecorate %68 Block 947fd4e5da5Sopenharmony_ci OpDecorate %70 DescriptorSet 0 948fd4e5da5Sopenharmony_ci OpDecorate %70 Binding 0 949fd4e5da5Sopenharmony_ci OpDecorate %81 RelaxedPrecision 950fd4e5da5Sopenharmony_ci OpDecorate %82 RelaxedPrecision 951fd4e5da5Sopenharmony_ci OpDecorate %91 RelaxedPrecision 952fd4e5da5Sopenharmony_ci OpDecorate %92 RelaxedPrecision 953fd4e5da5Sopenharmony_ci OpDecorate %100 RelaxedPrecision 954fd4e5da5Sopenharmony_ci OpDecorate %101 RelaxedPrecision 955fd4e5da5Sopenharmony_ci OpDecorate %109 RelaxedPrecision 956fd4e5da5Sopenharmony_ci OpDecorate %110 RelaxedPrecision 957fd4e5da5Sopenharmony_ci OpDecorate %118 RelaxedPrecision 958fd4e5da5Sopenharmony_ci OpDecorate %119 RelaxedPrecision 959fd4e5da5Sopenharmony_ci OpDecorate %127 RelaxedPrecision 960fd4e5da5Sopenharmony_ci OpDecorate %128 RelaxedPrecision 961fd4e5da5Sopenharmony_ci OpDecorate %136 RelaxedPrecision 962fd4e5da5Sopenharmony_ci OpDecorate %137 RelaxedPrecision 963fd4e5da5Sopenharmony_ci OpDecorate %145 RelaxedPrecision 964fd4e5da5Sopenharmony_ci OpDecorate %146 RelaxedPrecision 965fd4e5da5Sopenharmony_ci OpDecorate %152 RelaxedPrecision 966fd4e5da5Sopenharmony_ci OpDecorate %154 RelaxedPrecision 967fd4e5da5Sopenharmony_ci OpDecorate %155 RelaxedPrecision 968fd4e5da5Sopenharmony_ci OpDecorate %156 RelaxedPrecision 969fd4e5da5Sopenharmony_ci OpDecorate %157 RelaxedPrecision 970fd4e5da5Sopenharmony_ci OpDecorate %159 RelaxedPrecision 971fd4e5da5Sopenharmony_ci OpDecorate %160 RelaxedPrecision 972fd4e5da5Sopenharmony_ci OpDecorate %161 RelaxedPrecision 973fd4e5da5Sopenharmony_ci OpDecorate %162 RelaxedPrecision 974fd4e5da5Sopenharmony_ci OpDecorate %163 RelaxedPrecision 975fd4e5da5Sopenharmony_ci OpDecorate %164 RelaxedPrecision 976fd4e5da5Sopenharmony_ci OpDecorate %165 RelaxedPrecision 977fd4e5da5Sopenharmony_ci OpDecorate %171 RelaxedPrecision 978fd4e5da5Sopenharmony_ci OpDecorate %173 RelaxedPrecision 979fd4e5da5Sopenharmony_ci OpDecorate %179 RelaxedPrecision 980fd4e5da5Sopenharmony_ci OpDecorate %185 RelaxedPrecision 981fd4e5da5Sopenharmony_ci OpDecorate %189 RelaxedPrecision 982fd4e5da5Sopenharmony_ci OpDecorate %195 RelaxedPrecision 983fd4e5da5Sopenharmony_ci OpDecorate %196 RelaxedPrecision 984fd4e5da5Sopenharmony_ci OpDecorate %198 RelaxedPrecision 985fd4e5da5Sopenharmony_ci OpDecorate %204 RelaxedPrecision 986fd4e5da5Sopenharmony_ci OpDecorate %205 RelaxedPrecision 987fd4e5da5Sopenharmony_ci OpDecorate %207 RelaxedPrecision 988fd4e5da5Sopenharmony_ci OpDecorate %218 RelaxedPrecision 989fd4e5da5Sopenharmony_ci OpDecorate %219 RelaxedPrecision 990fd4e5da5Sopenharmony_ci OpDecorate %220 RelaxedPrecision 991fd4e5da5Sopenharmony_ci OpDecorate %228 RelaxedPrecision 992fd4e5da5Sopenharmony_ci OpDecorate %229 RelaxedPrecision 993fd4e5da5Sopenharmony_ci OpDecorate %230 RelaxedPrecision 994fd4e5da5Sopenharmony_ci OpDecorate %238 RelaxedPrecision 995fd4e5da5Sopenharmony_ci OpDecorate %239 RelaxedPrecision 996fd4e5da5Sopenharmony_ci OpDecorate %240 RelaxedPrecision 997fd4e5da5Sopenharmony_ci OpDecorate %248 RelaxedPrecision 998fd4e5da5Sopenharmony_ci OpDecorate %249 RelaxedPrecision 999fd4e5da5Sopenharmony_ci OpDecorate %250 RelaxedPrecision 1000fd4e5da5Sopenharmony_ci OpDecorate %258 RelaxedPrecision 1001fd4e5da5Sopenharmony_ci OpDecorate %259 RelaxedPrecision 1002fd4e5da5Sopenharmony_ci OpDecorate %260 RelaxedPrecision 1003fd4e5da5Sopenharmony_ci OpDecorate %268 RelaxedPrecision 1004fd4e5da5Sopenharmony_ci OpDecorate %269 RelaxedPrecision 1005fd4e5da5Sopenharmony_ci OpDecorate %270 RelaxedPrecision 1006fd4e5da5Sopenharmony_ci OpDecorate %278 RelaxedPrecision 1007fd4e5da5Sopenharmony_ci OpDecorate %279 RelaxedPrecision 1008fd4e5da5Sopenharmony_ci OpDecorate %280 RelaxedPrecision 1009fd4e5da5Sopenharmony_ci OpDecorate %288 RelaxedPrecision 1010fd4e5da5Sopenharmony_ci OpDecorate %289 RelaxedPrecision 1011fd4e5da5Sopenharmony_ci OpDecorate %290 RelaxedPrecision 1012fd4e5da5Sopenharmony_ci OpDecorate %298 RelaxedPrecision 1013fd4e5da5Sopenharmony_ci OpDecorate %299 RelaxedPrecision 1014fd4e5da5Sopenharmony_ci OpDecorate %300 RelaxedPrecision 1015fd4e5da5Sopenharmony_ci OpDecorate %309 RelaxedPrecision 1016fd4e5da5Sopenharmony_ci OpDecorate %310 RelaxedPrecision 1017fd4e5da5Sopenharmony_ci OpDecorate %311 RelaxedPrecision 1018fd4e5da5Sopenharmony_ci OpDecorate %312 RelaxedPrecision 1019fd4e5da5Sopenharmony_ci OpDecorate %313 RelaxedPrecision 1020fd4e5da5Sopenharmony_ci OpDecorate %319 RelaxedPrecision 1021fd4e5da5Sopenharmony_ci OpDecorate %320 RelaxedPrecision 1022fd4e5da5Sopenharmony_ci OpDecorate %321 RelaxedPrecision 1023fd4e5da5Sopenharmony_ci OpDecorate %322 RelaxedPrecision 1024fd4e5da5Sopenharmony_ci OpDecorate %323 RelaxedPrecision 1025fd4e5da5Sopenharmony_ci OpDecorate %324 RelaxedPrecision 1026fd4e5da5Sopenharmony_ci OpDecorate %325 RelaxedPrecision 1027fd4e5da5Sopenharmony_ci OpDecorate %327 BuiltIn FragCoord 1028fd4e5da5Sopenharmony_ci OpMemberDecorate %331 0 Offset 0 1029fd4e5da5Sopenharmony_ci OpDecorate %331 Block 1030fd4e5da5Sopenharmony_ci OpDecorate %333 DescriptorSet 0 1031fd4e5da5Sopenharmony_ci OpDecorate %333 Binding 1 1032fd4e5da5Sopenharmony_ci OpDecorate %339 RelaxedPrecision 1033fd4e5da5Sopenharmony_ci OpDecorate %340 RelaxedPrecision 1034fd4e5da5Sopenharmony_ci OpDecorate %347 RelaxedPrecision 1035fd4e5da5Sopenharmony_ci OpDecorate %348 RelaxedPrecision 1036fd4e5da5Sopenharmony_ci OpDecorate %349 RelaxedPrecision 1037fd4e5da5Sopenharmony_ci OpDecorate %351 RelaxedPrecision 1038fd4e5da5Sopenharmony_ci OpDecorate %352 RelaxedPrecision 1039fd4e5da5Sopenharmony_ci OpDecorate %353 RelaxedPrecision 1040fd4e5da5Sopenharmony_ci OpDecorate %354 RelaxedPrecision 1041fd4e5da5Sopenharmony_ci OpDecorate %356 RelaxedPrecision 1042fd4e5da5Sopenharmony_ci OpDecorate %363 Location 0 1043fd4e5da5Sopenharmony_ci OpDecorate %364 RelaxedPrecision 1044fd4e5da5Sopenharmony_ci %2 = OpTypeVoid 1045fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %2 1046fd4e5da5Sopenharmony_ci %6 = OpTypeInt 32 0 1047fd4e5da5Sopenharmony_ci %7 = OpTypePointer Function %6 1048fd4e5da5Sopenharmony_ci %9 = OpConstant %6 0 1049fd4e5da5Sopenharmony_ci %10 = OpTypeInt 32 1 1050fd4e5da5Sopenharmony_ci %11 = OpTypePointer Function %10 1051fd4e5da5Sopenharmony_ci %13 = OpConstant %10 2 1052fd4e5da5Sopenharmony_ci %20 = OpConstant %10 4 1053fd4e5da5Sopenharmony_ci %21 = OpTypeBool 1054fd4e5da5Sopenharmony_ci %32 = OpConstant %10 0 1055fd4e5da5Sopenharmony_ci %61 = OpTypeFloat 32 1056fd4e5da5Sopenharmony_ci %62 = OpTypeVector %61 2 1057fd4e5da5Sopenharmony_ci %63 = OpTypeMatrix %62 2 1058fd4e5da5Sopenharmony_ci %64 = OpTypePointer Private %63 1059fd4e5da5Sopenharmony_ci %65 = OpVariable %64 Private 1060fd4e5da5Sopenharmony_ci %68 = OpTypeStruct %61 1061fd4e5da5Sopenharmony_ci %69 = OpTypePointer Uniform %68 1062fd4e5da5Sopenharmony_ci %70 = OpVariable %69 Uniform 1063fd4e5da5Sopenharmony_ci %71 = OpTypePointer Uniform %61 1064fd4e5da5Sopenharmony_ci %74 = OpTypePointer Private %61 1065fd4e5da5Sopenharmony_ci %77 = OpTypeVector %61 3 1066fd4e5da5Sopenharmony_ci %78 = OpTypeMatrix %77 2 1067fd4e5da5Sopenharmony_ci %79 = OpTypePointer Private %78 1068fd4e5da5Sopenharmony_ci %80 = OpVariable %79 Private 1069fd4e5da5Sopenharmony_ci %87 = OpTypeVector %61 4 1070fd4e5da5Sopenharmony_ci %88 = OpTypeMatrix %87 2 1071fd4e5da5Sopenharmony_ci %89 = OpTypePointer Private %88 1072fd4e5da5Sopenharmony_ci %90 = OpVariable %89 Private 1073fd4e5da5Sopenharmony_ci %97 = OpTypeMatrix %62 3 1074fd4e5da5Sopenharmony_ci %98 = OpTypePointer Private %97 1075fd4e5da5Sopenharmony_ci %99 = OpVariable %98 Private 1076fd4e5da5Sopenharmony_ci %106 = OpTypeMatrix %77 3 1077fd4e5da5Sopenharmony_ci %107 = OpTypePointer Private %106 1078fd4e5da5Sopenharmony_ci %108 = OpVariable %107 Private 1079fd4e5da5Sopenharmony_ci %115 = OpTypeMatrix %87 3 1080fd4e5da5Sopenharmony_ci %116 = OpTypePointer Private %115 1081fd4e5da5Sopenharmony_ci %117 = OpVariable %116 Private 1082fd4e5da5Sopenharmony_ci %124 = OpTypeMatrix %62 4 1083fd4e5da5Sopenharmony_ci %125 = OpTypePointer Private %124 1084fd4e5da5Sopenharmony_ci %126 = OpVariable %125 Private 1085fd4e5da5Sopenharmony_ci %133 = OpTypeMatrix %77 4 1086fd4e5da5Sopenharmony_ci %134 = OpTypePointer Private %133 1087fd4e5da5Sopenharmony_ci %135 = OpVariable %134 Private 1088fd4e5da5Sopenharmony_ci %142 = OpTypeMatrix %87 4 1089fd4e5da5Sopenharmony_ci %143 = OpTypePointer Private %142 1090fd4e5da5Sopenharmony_ci %144 = OpVariable %143 Private 1091fd4e5da5Sopenharmony_ci %153 = OpConstant %10 1 1092fd4e5da5Sopenharmony_ci %158 = OpConstant %6 1 1093fd4e5da5Sopenharmony_ci %181 = OpConstant %6 9 1094fd4e5da5Sopenharmony_ci %182 = OpTypeArray %61 %181 1095fd4e5da5Sopenharmony_ci %183 = OpTypePointer Function %182 1096fd4e5da5Sopenharmony_ci %186 = OpConstant %61 0 1097fd4e5da5Sopenharmony_ci %187 = OpTypePointer Function %61 1098fd4e5da5Sopenharmony_ci %314 = OpConstant %61 16 1099fd4e5da5Sopenharmony_ci %326 = OpTypePointer Input %87 1100fd4e5da5Sopenharmony_ci %327 = OpVariable %326 Input 1101fd4e5da5Sopenharmony_ci %328 = OpTypePointer Input %61 1102fd4e5da5Sopenharmony_ci %331 = OpTypeStruct %62 1103fd4e5da5Sopenharmony_ci %332 = OpTypePointer Uniform %331 1104fd4e5da5Sopenharmony_ci %333 = OpVariable %332 Uniform 1105fd4e5da5Sopenharmony_ci %336 = OpConstant %61 3 1106fd4e5da5Sopenharmony_ci %350 = OpConstant %10 3 1107fd4e5da5Sopenharmony_ci %357 = OpConstant %10 9 1108fd4e5da5Sopenharmony_ci %362 = OpTypePointer Output %87 1109fd4e5da5Sopenharmony_ci %363 = OpVariable %362 Output 1110fd4e5da5Sopenharmony_ci %368 = OpConstant %61 1 1111fd4e5da5Sopenharmony_ci %374 = OpConstantComposite %87 %186 %186 %186 %368 1112fd4e5da5Sopenharmony_ci %4 = OpFunction %2 None %3 1113fd4e5da5Sopenharmony_ci %5 = OpLabel 1114fd4e5da5Sopenharmony_ci %8 = OpVariable %7 Function 1115fd4e5da5Sopenharmony_ci %12 = OpVariable %11 Function 1116fd4e5da5Sopenharmony_ci %23 = OpVariable %11 Function 1117fd4e5da5Sopenharmony_ci %31 = OpVariable %11 Function 1118fd4e5da5Sopenharmony_ci %41 = OpVariable %11 Function 1119fd4e5da5Sopenharmony_ci %164 = OpVariable %11 Function 1120fd4e5da5Sopenharmony_ci %165 = OpVariable %11 Function 1121fd4e5da5Sopenharmony_ci %173 = OpVariable %11 Function 1122fd4e5da5Sopenharmony_ci %184 = OpVariable %183 Function 1123fd4e5da5Sopenharmony_ci %189 = OpVariable %11 Function 1124fd4e5da5Sopenharmony_ci %198 = OpVariable %11 Function 1125fd4e5da5Sopenharmony_ci %325 = OpVariable %11 Function 1126fd4e5da5Sopenharmony_ci %340 = OpVariable %11 Function 1127fd4e5da5Sopenharmony_ci %348 = OpVariable %11 Function 1128fd4e5da5Sopenharmony_ci OpStore %8 %9 1129fd4e5da5Sopenharmony_ci OpStore %12 %13 1130fd4e5da5Sopenharmony_ci OpBranch %14 1131fd4e5da5Sopenharmony_ci %14 = OpLabel 1132fd4e5da5Sopenharmony_ci OpLoopMerge %16 %17 None 1133fd4e5da5Sopenharmony_ci OpBranch %18 1134fd4e5da5Sopenharmony_ci %18 = OpLabel 1135fd4e5da5Sopenharmony_ci %19 = OpLoad %10 %12 1136fd4e5da5Sopenharmony_ci %22 = OpSLessThanEqual %21 %19 %20 1137fd4e5da5Sopenharmony_ci OpBranchConditional %22 %15 %16 1138fd4e5da5Sopenharmony_ci %15 = OpLabel 1139fd4e5da5Sopenharmony_ci OpStore %23 %13 1140fd4e5da5Sopenharmony_ci OpBranch %24 1141fd4e5da5Sopenharmony_ci %24 = OpLabel 1142fd4e5da5Sopenharmony_ci OpLoopMerge %26 %27 None 1143fd4e5da5Sopenharmony_ci OpBranch %28 1144fd4e5da5Sopenharmony_ci %28 = OpLabel 1145fd4e5da5Sopenharmony_ci %29 = OpLoad %10 %23 1146fd4e5da5Sopenharmony_ci %30 = OpSLessThanEqual %21 %29 %20 1147fd4e5da5Sopenharmony_ci OpBranchConditional %30 %25 %26 1148fd4e5da5Sopenharmony_ci %25 = OpLabel 1149fd4e5da5Sopenharmony_ci OpStore %31 %32 1150fd4e5da5Sopenharmony_ci OpBranch %33 1151fd4e5da5Sopenharmony_ci %33 = OpLabel 1152fd4e5da5Sopenharmony_ci OpLoopMerge %35 %36 None 1153fd4e5da5Sopenharmony_ci OpBranch %37 1154fd4e5da5Sopenharmony_ci %37 = OpLabel 1155fd4e5da5Sopenharmony_ci %38 = OpLoad %10 %31 1156fd4e5da5Sopenharmony_ci %39 = OpLoad %10 %12 1157fd4e5da5Sopenharmony_ci %40 = OpSLessThan %21 %38 %39 1158fd4e5da5Sopenharmony_ci OpBranchConditional %40 %34 %35 1159fd4e5da5Sopenharmony_ci %34 = OpLabel 1160fd4e5da5Sopenharmony_ci OpStore %41 %32 1161fd4e5da5Sopenharmony_ci OpBranch %42 1162fd4e5da5Sopenharmony_ci %42 = OpLabel 1163fd4e5da5Sopenharmony_ci OpLoopMerge %44 %45 None 1164fd4e5da5Sopenharmony_ci OpBranch %46 1165fd4e5da5Sopenharmony_ci %46 = OpLabel 1166fd4e5da5Sopenharmony_ci %47 = OpLoad %10 %41 1167fd4e5da5Sopenharmony_ci %48 = OpLoad %10 %23 1168fd4e5da5Sopenharmony_ci %49 = OpSLessThan %21 %47 %48 1169fd4e5da5Sopenharmony_ci OpBranchConditional %49 %43 %44 1170fd4e5da5Sopenharmony_ci %43 = OpLabel 1171fd4e5da5Sopenharmony_ci %50 = OpLoad %6 %8 1172fd4e5da5Sopenharmony_ci OpSelectionMerge %60 None 1173fd4e5da5Sopenharmony_ci OpSwitch %50 %60 0 %51 1 %52 2 %53 3 %54 4 %55 5 %56 6 %57 7 %58 8 %59 1174fd4e5da5Sopenharmony_ci %51 = OpLabel 1175fd4e5da5Sopenharmony_ci %66 = OpLoad %10 %31 1176fd4e5da5Sopenharmony_ci %67 = OpLoad %10 %41 1177fd4e5da5Sopenharmony_ci %72 = OpAccessChain %71 %70 %32 1178fd4e5da5Sopenharmony_ci %73 = OpLoad %61 %72 1179fd4e5da5Sopenharmony_ci %75 = OpAccessChain %74 %65 %66 %67 1180fd4e5da5Sopenharmony_ci OpStore %75 %73 1181fd4e5da5Sopenharmony_ci OpBranch %60 1182fd4e5da5Sopenharmony_ci %52 = OpLabel 1183fd4e5da5Sopenharmony_ci %81 = OpLoad %10 %31 1184fd4e5da5Sopenharmony_ci %82 = OpLoad %10 %41 1185fd4e5da5Sopenharmony_ci %83 = OpAccessChain %71 %70 %32 1186fd4e5da5Sopenharmony_ci %84 = OpLoad %61 %83 1187fd4e5da5Sopenharmony_ci %85 = OpAccessChain %74 %80 %81 %82 1188fd4e5da5Sopenharmony_ci OpStore %85 %84 1189fd4e5da5Sopenharmony_ci OpBranch %60 1190fd4e5da5Sopenharmony_ci %53 = OpLabel 1191fd4e5da5Sopenharmony_ci %91 = OpLoad %10 %31 1192fd4e5da5Sopenharmony_ci %92 = OpLoad %10 %41 1193fd4e5da5Sopenharmony_ci %93 = OpAccessChain %71 %70 %32 1194fd4e5da5Sopenharmony_ci %94 = OpLoad %61 %93 1195fd4e5da5Sopenharmony_ci %95 = OpAccessChain %74 %90 %91 %92 1196fd4e5da5Sopenharmony_ci OpStore %95 %94 1197fd4e5da5Sopenharmony_ci OpBranch %60 1198fd4e5da5Sopenharmony_ci %54 = OpLabel 1199fd4e5da5Sopenharmony_ci %100 = OpLoad %10 %31 1200fd4e5da5Sopenharmony_ci %101 = OpLoad %10 %41 1201fd4e5da5Sopenharmony_ci %102 = OpAccessChain %71 %70 %32 1202fd4e5da5Sopenharmony_ci %103 = OpLoad %61 %102 1203fd4e5da5Sopenharmony_ci %104 = OpAccessChain %74 %99 %100 %101 1204fd4e5da5Sopenharmony_ci OpStore %104 %103 1205fd4e5da5Sopenharmony_ci OpBranch %60 1206fd4e5da5Sopenharmony_ci %55 = OpLabel 1207fd4e5da5Sopenharmony_ci %109 = OpLoad %10 %31 1208fd4e5da5Sopenharmony_ci %110 = OpLoad %10 %41 1209fd4e5da5Sopenharmony_ci %111 = OpAccessChain %71 %70 %32 1210fd4e5da5Sopenharmony_ci %112 = OpLoad %61 %111 1211fd4e5da5Sopenharmony_ci %113 = OpAccessChain %74 %108 %109 %110 1212fd4e5da5Sopenharmony_ci OpStore %113 %112 1213fd4e5da5Sopenharmony_ci OpBranch %60 1214fd4e5da5Sopenharmony_ci %56 = OpLabel 1215fd4e5da5Sopenharmony_ci %118 = OpLoad %10 %31 1216fd4e5da5Sopenharmony_ci %119 = OpLoad %10 %41 1217fd4e5da5Sopenharmony_ci %120 = OpAccessChain %71 %70 %32 1218fd4e5da5Sopenharmony_ci %121 = OpLoad %61 %120 1219fd4e5da5Sopenharmony_ci %122 = OpAccessChain %74 %117 %118 %119 1220fd4e5da5Sopenharmony_ci OpStore %122 %121 1221fd4e5da5Sopenharmony_ci OpBranch %60 1222fd4e5da5Sopenharmony_ci %57 = OpLabel 1223fd4e5da5Sopenharmony_ci %127 = OpLoad %10 %31 1224fd4e5da5Sopenharmony_ci %128 = OpLoad %10 %41 1225fd4e5da5Sopenharmony_ci %129 = OpAccessChain %71 %70 %32 1226fd4e5da5Sopenharmony_ci %130 = OpLoad %61 %129 1227fd4e5da5Sopenharmony_ci %131 = OpAccessChain %74 %126 %127 %128 1228fd4e5da5Sopenharmony_ci OpStore %131 %130 1229fd4e5da5Sopenharmony_ci OpBranch %60 1230fd4e5da5Sopenharmony_ci %58 = OpLabel 1231fd4e5da5Sopenharmony_ci %136 = OpLoad %10 %31 1232fd4e5da5Sopenharmony_ci %137 = OpLoad %10 %41 1233fd4e5da5Sopenharmony_ci %138 = OpAccessChain %71 %70 %32 1234fd4e5da5Sopenharmony_ci %139 = OpLoad %61 %138 1235fd4e5da5Sopenharmony_ci %140 = OpAccessChain %74 %135 %136 %137 1236fd4e5da5Sopenharmony_ci OpStore %140 %139 1237fd4e5da5Sopenharmony_ci OpBranch %60 1238fd4e5da5Sopenharmony_ci %59 = OpLabel 1239fd4e5da5Sopenharmony_ci %145 = OpLoad %10 %31 1240fd4e5da5Sopenharmony_ci %146 = OpLoad %10 %41 1241fd4e5da5Sopenharmony_ci %147 = OpAccessChain %71 %70 %32 1242fd4e5da5Sopenharmony_ci %148 = OpLoad %61 %147 1243fd4e5da5Sopenharmony_ci %149 = OpAccessChain %74 %144 %145 %146 1244fd4e5da5Sopenharmony_ci OpStore %149 %148 1245fd4e5da5Sopenharmony_ci OpBranch %60 1246fd4e5da5Sopenharmony_ci %60 = OpLabel 1247fd4e5da5Sopenharmony_ci OpBranch %45 1248fd4e5da5Sopenharmony_ci %45 = OpLabel 1249fd4e5da5Sopenharmony_ci %152 = OpLoad %10 %41 1250fd4e5da5Sopenharmony_ci %154 = OpIAdd %10 %152 %153 1251fd4e5da5Sopenharmony_ci OpStore %41 %154 1252fd4e5da5Sopenharmony_ci OpBranch %42 1253fd4e5da5Sopenharmony_ci %44 = OpLabel 1254fd4e5da5Sopenharmony_ci OpBranch %36 1255fd4e5da5Sopenharmony_ci %36 = OpLabel 1256fd4e5da5Sopenharmony_ci %155 = OpLoad %10 %31 1257fd4e5da5Sopenharmony_ci %156 = OpIAdd %10 %155 %153 1258fd4e5da5Sopenharmony_ci OpStore %31 %156 1259fd4e5da5Sopenharmony_ci OpBranch %33 1260fd4e5da5Sopenharmony_ci %35 = OpLabel 1261fd4e5da5Sopenharmony_ci %157 = OpLoad %6 %8 1262fd4e5da5Sopenharmony_ci %159 = OpIAdd %6 %157 %158 1263fd4e5da5Sopenharmony_ci OpStore %8 %159 1264fd4e5da5Sopenharmony_ci OpBranch %27 1265fd4e5da5Sopenharmony_ci %27 = OpLabel 1266fd4e5da5Sopenharmony_ci %160 = OpLoad %10 %23 1267fd4e5da5Sopenharmony_ci %161 = OpIAdd %10 %160 %153 1268fd4e5da5Sopenharmony_ci OpStore %23 %161 1269fd4e5da5Sopenharmony_ci OpBranch %24 1270fd4e5da5Sopenharmony_ci %26 = OpLabel 1271fd4e5da5Sopenharmony_ci OpBranch %17 1272fd4e5da5Sopenharmony_ci %17 = OpLabel 1273fd4e5da5Sopenharmony_ci %162 = OpLoad %10 %12 1274fd4e5da5Sopenharmony_ci %163 = OpIAdd %10 %162 %153 1275fd4e5da5Sopenharmony_ci OpStore %12 %163 1276fd4e5da5Sopenharmony_ci OpBranch %14 1277fd4e5da5Sopenharmony_ci %16 = OpLabel 1278fd4e5da5Sopenharmony_ci OpStore %164 %32 1279fd4e5da5Sopenharmony_ci OpStore %165 %13 1280fd4e5da5Sopenharmony_ci OpBranch %166 1281fd4e5da5Sopenharmony_ci %166 = OpLabel 1282fd4e5da5Sopenharmony_ci OpLoopMerge %168 %169 None 1283fd4e5da5Sopenharmony_ci OpBranch %170 1284fd4e5da5Sopenharmony_ci %170 = OpLabel 1285fd4e5da5Sopenharmony_ci %171 = OpLoad %10 %165 1286fd4e5da5Sopenharmony_ci %172 = OpSLessThanEqual %21 %171 %20 1287fd4e5da5Sopenharmony_ci OpBranchConditional %172 %167 %168 1288fd4e5da5Sopenharmony_ci %167 = OpLabel 1289fd4e5da5Sopenharmony_ci OpStore %173 %13 1290fd4e5da5Sopenharmony_ci OpBranch %174 1291fd4e5da5Sopenharmony_ci %174 = OpLabel 1292fd4e5da5Sopenharmony_ci OpLoopMerge %176 %177 None 1293fd4e5da5Sopenharmony_ci OpBranch %178 1294fd4e5da5Sopenharmony_ci %178 = OpLabel 1295fd4e5da5Sopenharmony_ci %179 = OpLoad %10 %173 1296fd4e5da5Sopenharmony_ci %180 = OpSLessThanEqual %21 %179 %20 1297fd4e5da5Sopenharmony_ci OpBranchConditional %180 %175 %176 1298fd4e5da5Sopenharmony_ci %175 = OpLabel 1299fd4e5da5Sopenharmony_ci %185 = OpLoad %10 %164 1300fd4e5da5Sopenharmony_ci %188 = OpAccessChain %187 %184 %185 1301fd4e5da5Sopenharmony_ci OpStore %188 %186 1302fd4e5da5Sopenharmony_ci OpStore %189 %32 1303fd4e5da5Sopenharmony_ci OpBranch %190 1304fd4e5da5Sopenharmony_ci %190 = OpLabel 1305fd4e5da5Sopenharmony_ci OpLoopMerge %192 %193 None 1306fd4e5da5Sopenharmony_ci OpBranch %194 1307fd4e5da5Sopenharmony_ci %194 = OpLabel 1308fd4e5da5Sopenharmony_ci %195 = OpLoad %10 %189 1309fd4e5da5Sopenharmony_ci %196 = OpLoad %10 %165 1310fd4e5da5Sopenharmony_ci %197 = OpSLessThan %21 %195 %196 1311fd4e5da5Sopenharmony_ci OpBranchConditional %197 %191 %192 1312fd4e5da5Sopenharmony_ci %191 = OpLabel 1313fd4e5da5Sopenharmony_ci OpStore %198 %32 1314fd4e5da5Sopenharmony_ci OpBranch %199 1315fd4e5da5Sopenharmony_ci %199 = OpLabel 1316fd4e5da5Sopenharmony_ci OpLoopMerge %201 %202 None 1317fd4e5da5Sopenharmony_ci OpBranch %203 1318fd4e5da5Sopenharmony_ci %203 = OpLabel 1319fd4e5da5Sopenharmony_ci %204 = OpLoad %10 %198 1320fd4e5da5Sopenharmony_ci %205 = OpLoad %10 %173 1321fd4e5da5Sopenharmony_ci %206 = OpSLessThan %21 %204 %205 1322fd4e5da5Sopenharmony_ci OpBranchConditional %206 %200 %201 1323fd4e5da5Sopenharmony_ci %200 = OpLabel 1324fd4e5da5Sopenharmony_ci %207 = OpLoad %10 %164 1325fd4e5da5Sopenharmony_ci OpSelectionMerge %217 None 1326fd4e5da5Sopenharmony_ci OpSwitch %207 %217 0 %208 1 %209 2 %210 3 %211 4 %212 5 %213 6 %214 7 %215 8 %216 1327fd4e5da5Sopenharmony_ci %208 = OpLabel 1328fd4e5da5Sopenharmony_ci %218 = OpLoad %10 %164 1329fd4e5da5Sopenharmony_ci %219 = OpLoad %10 %189 1330fd4e5da5Sopenharmony_ci %220 = OpLoad %10 %198 1331fd4e5da5Sopenharmony_ci %221 = OpAccessChain %74 %65 %219 %220 1332fd4e5da5Sopenharmony_ci %222 = OpLoad %61 %221 1333fd4e5da5Sopenharmony_ci %223 = OpAccessChain %187 %184 %218 1334fd4e5da5Sopenharmony_ci %224 = OpLoad %61 %223 1335fd4e5da5Sopenharmony_ci %225 = OpFAdd %61 %224 %222 1336fd4e5da5Sopenharmony_ci %226 = OpAccessChain %187 %184 %218 1337fd4e5da5Sopenharmony_ci OpStore %226 %225 1338fd4e5da5Sopenharmony_ci OpBranch %217 1339fd4e5da5Sopenharmony_ci %209 = OpLabel 1340fd4e5da5Sopenharmony_ci %228 = OpLoad %10 %164 1341fd4e5da5Sopenharmony_ci %229 = OpLoad %10 %189 1342fd4e5da5Sopenharmony_ci %230 = OpLoad %10 %198 1343fd4e5da5Sopenharmony_ci %231 = OpAccessChain %74 %80 %229 %230 1344fd4e5da5Sopenharmony_ci %232 = OpLoad %61 %231 1345fd4e5da5Sopenharmony_ci %233 = OpAccessChain %187 %184 %228 1346fd4e5da5Sopenharmony_ci %234 = OpLoad %61 %233 1347fd4e5da5Sopenharmony_ci %235 = OpFAdd %61 %234 %232 1348fd4e5da5Sopenharmony_ci %236 = OpAccessChain %187 %184 %228 1349fd4e5da5Sopenharmony_ci OpStore %236 %235 1350fd4e5da5Sopenharmony_ci OpBranch %217 1351fd4e5da5Sopenharmony_ci %210 = OpLabel 1352fd4e5da5Sopenharmony_ci %238 = OpLoad %10 %164 1353fd4e5da5Sopenharmony_ci %239 = OpLoad %10 %189 1354fd4e5da5Sopenharmony_ci %240 = OpLoad %10 %198 1355fd4e5da5Sopenharmony_ci %241 = OpAccessChain %74 %90 %239 %240 1356fd4e5da5Sopenharmony_ci %242 = OpLoad %61 %241 1357fd4e5da5Sopenharmony_ci %243 = OpAccessChain %187 %184 %238 1358fd4e5da5Sopenharmony_ci %244 = OpLoad %61 %243 1359fd4e5da5Sopenharmony_ci %245 = OpFAdd %61 %244 %242 1360fd4e5da5Sopenharmony_ci %246 = OpAccessChain %187 %184 %238 1361fd4e5da5Sopenharmony_ci OpStore %246 %245 1362fd4e5da5Sopenharmony_ci OpBranch %217 1363fd4e5da5Sopenharmony_ci %211 = OpLabel 1364fd4e5da5Sopenharmony_ci %248 = OpLoad %10 %164 1365fd4e5da5Sopenharmony_ci %249 = OpLoad %10 %189 1366fd4e5da5Sopenharmony_ci %250 = OpLoad %10 %198 1367fd4e5da5Sopenharmony_ci %251 = OpAccessChain %74 %99 %249 %250 1368fd4e5da5Sopenharmony_ci %252 = OpLoad %61 %251 1369fd4e5da5Sopenharmony_ci %253 = OpAccessChain %187 %184 %248 1370fd4e5da5Sopenharmony_ci %254 = OpLoad %61 %253 1371fd4e5da5Sopenharmony_ci %255 = OpFAdd %61 %254 %252 1372fd4e5da5Sopenharmony_ci %256 = OpAccessChain %187 %184 %248 1373fd4e5da5Sopenharmony_ci OpStore %256 %255 1374fd4e5da5Sopenharmony_ci OpBranch %217 1375fd4e5da5Sopenharmony_ci %212 = OpLabel 1376fd4e5da5Sopenharmony_ci %258 = OpLoad %10 %164 1377fd4e5da5Sopenharmony_ci %259 = OpLoad %10 %189 1378fd4e5da5Sopenharmony_ci %260 = OpLoad %10 %198 1379fd4e5da5Sopenharmony_ci %261 = OpAccessChain %74 %108 %259 %260 1380fd4e5da5Sopenharmony_ci %262 = OpLoad %61 %261 1381fd4e5da5Sopenharmony_ci %263 = OpAccessChain %187 %184 %258 1382fd4e5da5Sopenharmony_ci %264 = OpLoad %61 %263 1383fd4e5da5Sopenharmony_ci %265 = OpFAdd %61 %264 %262 1384fd4e5da5Sopenharmony_ci %266 = OpAccessChain %187 %184 %258 1385fd4e5da5Sopenharmony_ci OpStore %266 %265 1386fd4e5da5Sopenharmony_ci OpBranch %217 1387fd4e5da5Sopenharmony_ci %213 = OpLabel 1388fd4e5da5Sopenharmony_ci %268 = OpLoad %10 %164 1389fd4e5da5Sopenharmony_ci %269 = OpLoad %10 %189 1390fd4e5da5Sopenharmony_ci %270 = OpLoad %10 %198 1391fd4e5da5Sopenharmony_ci %271 = OpAccessChain %74 %117 %269 %270 1392fd4e5da5Sopenharmony_ci %272 = OpLoad %61 %271 1393fd4e5da5Sopenharmony_ci %273 = OpAccessChain %187 %184 %268 1394fd4e5da5Sopenharmony_ci %274 = OpLoad %61 %273 1395fd4e5da5Sopenharmony_ci %275 = OpFAdd %61 %274 %272 1396fd4e5da5Sopenharmony_ci %276 = OpAccessChain %187 %184 %268 1397fd4e5da5Sopenharmony_ci OpStore %276 %275 1398fd4e5da5Sopenharmony_ci OpBranch %217 1399fd4e5da5Sopenharmony_ci %214 = OpLabel 1400fd4e5da5Sopenharmony_ci %278 = OpLoad %10 %164 1401fd4e5da5Sopenharmony_ci %279 = OpLoad %10 %189 1402fd4e5da5Sopenharmony_ci %280 = OpLoad %10 %198 1403fd4e5da5Sopenharmony_ci %281 = OpAccessChain %74 %126 %279 %280 1404fd4e5da5Sopenharmony_ci %282 = OpLoad %61 %281 1405fd4e5da5Sopenharmony_ci %283 = OpAccessChain %187 %184 %278 1406fd4e5da5Sopenharmony_ci %284 = OpLoad %61 %283 1407fd4e5da5Sopenharmony_ci %285 = OpFAdd %61 %284 %282 1408fd4e5da5Sopenharmony_ci %286 = OpAccessChain %187 %184 %278 1409fd4e5da5Sopenharmony_ci OpStore %286 %285 1410fd4e5da5Sopenharmony_ci OpBranch %217 1411fd4e5da5Sopenharmony_ci %215 = OpLabel 1412fd4e5da5Sopenharmony_ci %288 = OpLoad %10 %164 1413fd4e5da5Sopenharmony_ci %289 = OpLoad %10 %189 1414fd4e5da5Sopenharmony_ci %290 = OpLoad %10 %198 1415fd4e5da5Sopenharmony_ci %291 = OpAccessChain %74 %135 %289 %290 1416fd4e5da5Sopenharmony_ci %292 = OpLoad %61 %291 1417fd4e5da5Sopenharmony_ci %293 = OpAccessChain %187 %184 %288 1418fd4e5da5Sopenharmony_ci %294 = OpLoad %61 %293 1419fd4e5da5Sopenharmony_ci %295 = OpFAdd %61 %294 %292 1420fd4e5da5Sopenharmony_ci %296 = OpAccessChain %187 %184 %288 1421fd4e5da5Sopenharmony_ci OpStore %296 %295 1422fd4e5da5Sopenharmony_ci OpBranch %217 1423fd4e5da5Sopenharmony_ci %216 = OpLabel 1424fd4e5da5Sopenharmony_ci %298 = OpLoad %10 %164 1425fd4e5da5Sopenharmony_ci %299 = OpLoad %10 %189 1426fd4e5da5Sopenharmony_ci %300 = OpLoad %10 %198 1427fd4e5da5Sopenharmony_ci %301 = OpAccessChain %74 %144 %299 %300 1428fd4e5da5Sopenharmony_ci %302 = OpLoad %61 %301 1429fd4e5da5Sopenharmony_ci %303 = OpAccessChain %187 %184 %298 1430fd4e5da5Sopenharmony_ci %304 = OpLoad %61 %303 1431fd4e5da5Sopenharmony_ci %305 = OpFAdd %61 %304 %302 1432fd4e5da5Sopenharmony_ci %306 = OpAccessChain %187 %184 %298 1433fd4e5da5Sopenharmony_ci OpStore %306 %305 1434fd4e5da5Sopenharmony_ci OpBranch %217 1435fd4e5da5Sopenharmony_ci %217 = OpLabel 1436fd4e5da5Sopenharmony_ci OpBranch %202 1437fd4e5da5Sopenharmony_ci %202 = OpLabel 1438fd4e5da5Sopenharmony_ci %309 = OpLoad %10 %198 1439fd4e5da5Sopenharmony_ci %310 = OpIAdd %10 %309 %153 1440fd4e5da5Sopenharmony_ci OpStore %198 %310 1441fd4e5da5Sopenharmony_ci OpBranch %199 1442fd4e5da5Sopenharmony_ci %201 = OpLabel 1443fd4e5da5Sopenharmony_ci OpBranch %193 1444fd4e5da5Sopenharmony_ci %193 = OpLabel 1445fd4e5da5Sopenharmony_ci %311 = OpLoad %10 %189 1446fd4e5da5Sopenharmony_ci %312 = OpIAdd %10 %311 %153 1447fd4e5da5Sopenharmony_ci OpStore %189 %312 1448fd4e5da5Sopenharmony_ci OpBranch %190 1449fd4e5da5Sopenharmony_ci %192 = OpLabel 1450fd4e5da5Sopenharmony_ci %313 = OpLoad %10 %164 1451fd4e5da5Sopenharmony_ci %315 = OpAccessChain %187 %184 %313 1452fd4e5da5Sopenharmony_ci %316 = OpLoad %61 %315 1453fd4e5da5Sopenharmony_ci %317 = OpFDiv %61 %316 %314 1454fd4e5da5Sopenharmony_ci %318 = OpAccessChain %187 %184 %313 1455fd4e5da5Sopenharmony_ci OpStore %318 %317 1456fd4e5da5Sopenharmony_ci %319 = OpLoad %10 %164 1457fd4e5da5Sopenharmony_ci %320 = OpIAdd %10 %319 %153 1458fd4e5da5Sopenharmony_ci OpStore %164 %320 1459fd4e5da5Sopenharmony_ci OpBranch %177 1460fd4e5da5Sopenharmony_ci %177 = OpLabel 1461fd4e5da5Sopenharmony_ci %321 = OpLoad %10 %173 1462fd4e5da5Sopenharmony_ci %322 = OpIAdd %10 %321 %153 1463fd4e5da5Sopenharmony_ci OpStore %173 %322 1464fd4e5da5Sopenharmony_ci OpBranch %174 1465fd4e5da5Sopenharmony_ci %176 = OpLabel 1466fd4e5da5Sopenharmony_ci OpBranch %169 1467fd4e5da5Sopenharmony_ci %169 = OpLabel 1468fd4e5da5Sopenharmony_ci %323 = OpLoad %10 %165 1469fd4e5da5Sopenharmony_ci %324 = OpIAdd %10 %323 %153 1470fd4e5da5Sopenharmony_ci OpStore %165 %324 1471fd4e5da5Sopenharmony_ci OpBranch %166 1472fd4e5da5Sopenharmony_ci %168 = OpLabel 1473fd4e5da5Sopenharmony_ci %329 = OpAccessChain %328 %327 %9 1474fd4e5da5Sopenharmony_ci %330 = OpLoad %61 %329 1475fd4e5da5Sopenharmony_ci %334 = OpAccessChain %71 %333 %32 %9 1476fd4e5da5Sopenharmony_ci %335 = OpLoad %61 %334 1477fd4e5da5Sopenharmony_ci %337 = OpFDiv %61 %335 %336 1478fd4e5da5Sopenharmony_ci %338 = OpFDiv %61 %330 %337 1479fd4e5da5Sopenharmony_ci %339 = OpConvertFToS %10 %338 1480fd4e5da5Sopenharmony_ci OpStore %325 %339 1481fd4e5da5Sopenharmony_ci %341 = OpAccessChain %328 %327 %158 1482fd4e5da5Sopenharmony_ci %342 = OpLoad %61 %341 1483fd4e5da5Sopenharmony_ci %343 = OpAccessChain %71 %333 %32 %9 1484fd4e5da5Sopenharmony_ci %344 = OpLoad %61 %343 1485fd4e5da5Sopenharmony_ci %345 = OpFDiv %61 %344 %336 1486fd4e5da5Sopenharmony_ci %346 = OpFDiv %61 %342 %345 1487fd4e5da5Sopenharmony_ci %347 = OpConvertFToS %10 %346 1488fd4e5da5Sopenharmony_ci OpStore %340 %347 1489fd4e5da5Sopenharmony_ci %349 = OpLoad %10 %340 1490fd4e5da5Sopenharmony_ci %351 = OpIMul %10 %349 %350 1491fd4e5da5Sopenharmony_ci %352 = OpLoad %10 %325 1492fd4e5da5Sopenharmony_ci %353 = OpIAdd %10 %351 %352 1493fd4e5da5Sopenharmony_ci OpStore %348 %353 1494fd4e5da5Sopenharmony_ci %354 = OpLoad %10 %348 1495fd4e5da5Sopenharmony_ci %355 = OpSGreaterThan %21 %354 %32 1496fd4e5da5Sopenharmony_ci %356 = OpLoad %10 %348 1497fd4e5da5Sopenharmony_ci %358 = OpSLessThan %21 %356 %357 1498fd4e5da5Sopenharmony_ci %359 = OpLogicalAnd %21 %355 %358 1499fd4e5da5Sopenharmony_ci OpSelectionMerge %361 None 1500fd4e5da5Sopenharmony_ci OpBranchConditional %359 %360 %373 1501fd4e5da5Sopenharmony_ci %360 = OpLabel 1502fd4e5da5Sopenharmony_ci %364 = OpLoad %10 %348 1503fd4e5da5Sopenharmony_ci %365 = OpAccessChain %187 %184 %364 1504fd4e5da5Sopenharmony_ci %366 = OpLoad %61 %365 1505fd4e5da5Sopenharmony_ci %367 = OpCompositeConstruct %77 %366 %366 %366 1506fd4e5da5Sopenharmony_ci %369 = OpCompositeExtract %61 %367 0 1507fd4e5da5Sopenharmony_ci %370 = OpCompositeExtract %61 %367 1 1508fd4e5da5Sopenharmony_ci %371 = OpCompositeExtract %61 %367 2 1509fd4e5da5Sopenharmony_ci %372 = OpCompositeConstruct %87 %369 %370 %371 %368 1510fd4e5da5Sopenharmony_ci OpStore %363 %372 1511fd4e5da5Sopenharmony_ci OpBranch %361 1512fd4e5da5Sopenharmony_ci %373 = OpLabel 1513fd4e5da5Sopenharmony_ci OpStore %363 %374 1514fd4e5da5Sopenharmony_ci OpBranch %361 1515fd4e5da5Sopenharmony_ci %361 = OpLabel 1516fd4e5da5Sopenharmony_ci OpReturn 1517fd4e5da5Sopenharmony_ci OpFunctionEnd 1518fd4e5da5Sopenharmony_ci )"; 1519fd4e5da5Sopenharmony_ci 1520fd4e5da5Sopenharmony_ci// The SPIR-V comes from the following GLSL: 1521fd4e5da5Sopenharmony_ci// 1522fd4e5da5Sopenharmony_ci// #version 310 es 1523fd4e5da5Sopenharmony_ci// precision highp float; 1524fd4e5da5Sopenharmony_ci// 1525fd4e5da5Sopenharmony_ci// layout(location = 0) out vec4 color; 1526fd4e5da5Sopenharmony_ci// 1527fd4e5da5Sopenharmony_ci// void main() 1528fd4e5da5Sopenharmony_ci// { 1529fd4e5da5Sopenharmony_ci// color = vec4(1.0, 0.0, 0.0, 1.0); 1530fd4e5da5Sopenharmony_ci// } 1531fd4e5da5Sopenharmony_ci 1532fd4e5da5Sopenharmony_ciconst std::string kTestShader5 = R"( 1533fd4e5da5Sopenharmony_ci OpCapability Shader 1534fd4e5da5Sopenharmony_ci %1 = OpExtInstImport "GLSL.std.450" 1535fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1536fd4e5da5Sopenharmony_ci OpEntryPoint Fragment %4 "main" %9 1537fd4e5da5Sopenharmony_ci OpExecutionMode %4 OriginUpperLeft 1538fd4e5da5Sopenharmony_ci OpSource ESSL 310 1539fd4e5da5Sopenharmony_ci OpName %4 "main" 1540fd4e5da5Sopenharmony_ci OpName %9 "color" 1541fd4e5da5Sopenharmony_ci OpDecorate %9 Location 0 1542fd4e5da5Sopenharmony_ci %2 = OpTypeVoid 1543fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %2 1544fd4e5da5Sopenharmony_ci %6 = OpTypeFloat 32 1545fd4e5da5Sopenharmony_ci %7 = OpTypeVector %6 4 1546fd4e5da5Sopenharmony_ci %8 = OpTypePointer Output %7 1547fd4e5da5Sopenharmony_ci %9 = OpVariable %8 Output 1548fd4e5da5Sopenharmony_ci %10 = OpConstant %6 1 1549fd4e5da5Sopenharmony_ci %11 = OpConstant %6 0 1550fd4e5da5Sopenharmony_ci %12 = OpConstantComposite %7 %10 %11 %11 %10 1551fd4e5da5Sopenharmony_ci %4 = OpFunction %2 None %3 1552fd4e5da5Sopenharmony_ci %5 = OpLabel 1553fd4e5da5Sopenharmony_ci OpStore %9 %12 1554fd4e5da5Sopenharmony_ci OpReturn 1555fd4e5da5Sopenharmony_ci OpFunctionEnd 1556fd4e5da5Sopenharmony_ci )"; 1557fd4e5da5Sopenharmony_ci 1558fd4e5da5Sopenharmony_ci// Some miscellaneous SPIR-V. 1559fd4e5da5Sopenharmony_ci 1560fd4e5da5Sopenharmony_ciconst std::string kTestShader6 = R"( 1561fd4e5da5Sopenharmony_ci OpCapability Shader 1562fd4e5da5Sopenharmony_ci OpCapability SampledBuffer 1563fd4e5da5Sopenharmony_ci OpCapability ImageBuffer 1564fd4e5da5Sopenharmony_ci %1 = OpExtInstImport "GLSL.std.450" 1565fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1566fd4e5da5Sopenharmony_ci OpEntryPoint Fragment %2 "main" %40 %41 1567fd4e5da5Sopenharmony_ci OpExecutionMode %2 OriginUpperLeft 1568fd4e5da5Sopenharmony_ci OpSource GLSL 450 1569fd4e5da5Sopenharmony_ci OpDecorate %40 DescriptorSet 0 1570fd4e5da5Sopenharmony_ci OpDecorate %40 Binding 69 1571fd4e5da5Sopenharmony_ci OpDecorate %41 DescriptorSet 0 1572fd4e5da5Sopenharmony_ci OpDecorate %41 Binding 1 1573fd4e5da5Sopenharmony_ci %54 = OpTypeFloat 32 1574fd4e5da5Sopenharmony_ci %76 = OpTypeVector %54 4 1575fd4e5da5Sopenharmony_ci %55 = OpConstant %54 0 1576fd4e5da5Sopenharmony_ci %56 = OpTypeVector %54 3 1577fd4e5da5Sopenharmony_ci %94 = OpTypeVector %54 2 1578fd4e5da5Sopenharmony_ci %112 = OpConstantComposite %94 %55 %55 1579fd4e5da5Sopenharmony_ci %57 = OpConstantComposite %56 %55 %55 %55 1580fd4e5da5Sopenharmony_ci %15 = OpTypeImage %54 2D 2 0 0 1 Unknown 1581fd4e5da5Sopenharmony_ci %114 = OpTypePointer UniformConstant %15 1582fd4e5da5Sopenharmony_ci %38 = OpTypeSampler 1583fd4e5da5Sopenharmony_ci %125 = OpTypePointer UniformConstant %38 1584fd4e5da5Sopenharmony_ci %132 = OpTypeVoid 1585fd4e5da5Sopenharmony_ci %133 = OpTypeFunction %132 1586fd4e5da5Sopenharmony_ci %45 = OpTypeSampledImage %15 1587fd4e5da5Sopenharmony_ci %40 = OpVariable %114 UniformConstant 1588fd4e5da5Sopenharmony_ci %41 = OpVariable %125 UniformConstant 1589fd4e5da5Sopenharmony_ci %2 = OpFunction %132 None %133 1590fd4e5da5Sopenharmony_ci %164 = OpLabel 1591fd4e5da5Sopenharmony_ci %184 = OpLoad %15 %40 1592fd4e5da5Sopenharmony_ci %213 = OpLoad %38 %41 1593fd4e5da5Sopenharmony_ci %216 = OpSampledImage %45 %184 %213 1594fd4e5da5Sopenharmony_ci %217 = OpImageSampleImplicitLod %76 %216 %112 Bias %55 1595fd4e5da5Sopenharmony_ci OpReturn 1596fd4e5da5Sopenharmony_ci OpFunctionEnd 1597fd4e5da5Sopenharmony_ci )"; 1598fd4e5da5Sopenharmony_ci 1599fd4e5da5Sopenharmony_ci// A virtually empty piece of SPIR-V. 1600fd4e5da5Sopenharmony_ci 1601fd4e5da5Sopenharmony_ciconst std::string kTestShader7 = R"( 1602fd4e5da5Sopenharmony_ci OpCapability Shader 1603fd4e5da5Sopenharmony_ci %1 = OpExtInstImport "GLSL.std.450" 1604fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1605fd4e5da5Sopenharmony_ci OpEntryPoint Fragment %4 "main" 1606fd4e5da5Sopenharmony_ci OpExecutionMode %4 OriginUpperLeft 1607fd4e5da5Sopenharmony_ci OpSource ESSL 320 1608fd4e5da5Sopenharmony_ci %2 = OpTypeVoid 1609fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %2 1610fd4e5da5Sopenharmony_ci %4 = OpFunction %2 None %3 1611fd4e5da5Sopenharmony_ci %5 = OpLabel 1612fd4e5da5Sopenharmony_ci OpReturn 1613fd4e5da5Sopenharmony_ci OpFunctionEnd 1614fd4e5da5Sopenharmony_ci )"; 1615fd4e5da5Sopenharmony_ci 1616fd4e5da5Sopenharmony_civoid AddConstantUniformFact(protobufs::FactSequence* facts, 1617fd4e5da5Sopenharmony_ci uint32_t descriptor_set, uint32_t binding, 1618fd4e5da5Sopenharmony_ci std::vector<uint32_t>&& indices, uint32_t value) { 1619fd4e5da5Sopenharmony_ci protobufs::FactConstantUniform fact; 1620fd4e5da5Sopenharmony_ci *fact.mutable_uniform_buffer_element_descriptor() = 1621fd4e5da5Sopenharmony_ci MakeUniformBufferElementDescriptor(descriptor_set, binding, 1622fd4e5da5Sopenharmony_ci std::move(indices)); 1623fd4e5da5Sopenharmony_ci *fact.mutable_constant_word()->Add() = value; 1624fd4e5da5Sopenharmony_ci protobufs::Fact temp; 1625fd4e5da5Sopenharmony_ci *temp.mutable_constant_uniform_fact() = fact; 1626fd4e5da5Sopenharmony_ci *facts->mutable_fact()->Add() = temp; 1627fd4e5da5Sopenharmony_ci} 1628fd4e5da5Sopenharmony_ci 1629fd4e5da5Sopenharmony_ci// Reinterpret the bits of |value| as a 32-bit unsigned int 1630fd4e5da5Sopenharmony_ciuint32_t FloatBitsAsUint(float value) { 1631fd4e5da5Sopenharmony_ci uint32_t result; 1632fd4e5da5Sopenharmony_ci memcpy(&result, &value, sizeof(float)); 1633fd4e5da5Sopenharmony_ci return result; 1634fd4e5da5Sopenharmony_ci} 1635fd4e5da5Sopenharmony_ci 1636fd4e5da5Sopenharmony_ci// Assembles the given |shader| text, and then runs the fuzzer |num_runs| 1637fd4e5da5Sopenharmony_ci// times, using successive seeds starting from |initial_seed|. Checks that 1638fd4e5da5Sopenharmony_ci// the binary produced after each fuzzer run is valid, and that replaying 1639fd4e5da5Sopenharmony_ci// the transformations that were applied during fuzzing leads to an 1640fd4e5da5Sopenharmony_ci// identical binary. 1641fd4e5da5Sopenharmony_civoid RunFuzzerAndReplayer(const std::string& shader, 1642fd4e5da5Sopenharmony_ci const protobufs::FactSequence& initial_facts, 1643fd4e5da5Sopenharmony_ci uint32_t initial_seed, uint32_t num_runs) { 1644fd4e5da5Sopenharmony_ci const auto env = SPV_ENV_UNIVERSAL_1_5; 1645fd4e5da5Sopenharmony_ci 1646fd4e5da5Sopenharmony_ci std::vector<uint32_t> binary_in; 1647fd4e5da5Sopenharmony_ci SpirvTools t(env); 1648fd4e5da5Sopenharmony_ci t.SetMessageConsumer(kConsoleMessageConsumer); 1649fd4e5da5Sopenharmony_ci ASSERT_TRUE(t.Assemble(shader, &binary_in, kFuzzAssembleOption)); 1650fd4e5da5Sopenharmony_ci ASSERT_TRUE(t.Validate(binary_in)); 1651fd4e5da5Sopenharmony_ci 1652fd4e5da5Sopenharmony_ci std::vector<fuzzerutil::ModuleSupplier> donor_suppliers; 1653fd4e5da5Sopenharmony_ci for (auto donor : {&kTestShader1, &kTestShader2, &kTestShader3, &kTestShader4, 1654fd4e5da5Sopenharmony_ci &kTestShader5, &kTestShader6}) { 1655fd4e5da5Sopenharmony_ci donor_suppliers.emplace_back([donor]() { 1656fd4e5da5Sopenharmony_ci return BuildModule(env, kConsoleMessageConsumer, *donor, 1657fd4e5da5Sopenharmony_ci kFuzzAssembleOption); 1658fd4e5da5Sopenharmony_ci }); 1659fd4e5da5Sopenharmony_ci } 1660fd4e5da5Sopenharmony_ci 1661fd4e5da5Sopenharmony_ci std::vector<RepeatedPassStrategy> strategies{ 1662fd4e5da5Sopenharmony_ci RepeatedPassStrategy::kSimple, 1663fd4e5da5Sopenharmony_ci RepeatedPassStrategy::kLoopedWithRecommendations, 1664fd4e5da5Sopenharmony_ci RepeatedPassStrategy::kRandomWithRecommendations}; 1665fd4e5da5Sopenharmony_ci uint32_t strategy_index = 0; 1666fd4e5da5Sopenharmony_ci for (uint32_t seed = initial_seed; seed < initial_seed + num_runs; seed++) { 1667fd4e5da5Sopenharmony_ci spvtools::ValidatorOptions validator_options; 1668fd4e5da5Sopenharmony_ci 1669fd4e5da5Sopenharmony_ci std::unique_ptr<opt::IRContext> ir_context; 1670fd4e5da5Sopenharmony_ci ASSERT_TRUE(fuzzerutil::BuildIRContext(env, kConsoleMessageConsumer, 1671fd4e5da5Sopenharmony_ci binary_in, validator_options, 1672fd4e5da5Sopenharmony_ci &ir_context)); 1673fd4e5da5Sopenharmony_ci 1674fd4e5da5Sopenharmony_ci auto fuzzer_context = MakeUnique<FuzzerContext>( 1675fd4e5da5Sopenharmony_ci MakeUnique<PseudoRandomGenerator>(seed), 1676fd4e5da5Sopenharmony_ci FuzzerContext::GetMinFreshId(ir_context.get()), false); 1677fd4e5da5Sopenharmony_ci 1678fd4e5da5Sopenharmony_ci auto transformation_context = MakeUnique<TransformationContext>( 1679fd4e5da5Sopenharmony_ci MakeUnique<FactManager>(ir_context.get()), validator_options); 1680fd4e5da5Sopenharmony_ci transformation_context->GetFactManager()->AddInitialFacts( 1681fd4e5da5Sopenharmony_ci kConsoleMessageConsumer, initial_facts); 1682fd4e5da5Sopenharmony_ci 1683fd4e5da5Sopenharmony_ci // Every 4th time we run the fuzzer, enable all fuzzer passes. 1684fd4e5da5Sopenharmony_ci bool enable_all_passes = (seed % 4) == 0; 1685fd4e5da5Sopenharmony_ci Fuzzer fuzzer(std::move(ir_context), std::move(transformation_context), 1686fd4e5da5Sopenharmony_ci std::move(fuzzer_context), kConsoleMessageConsumer, 1687fd4e5da5Sopenharmony_ci donor_suppliers, enable_all_passes, 1688fd4e5da5Sopenharmony_ci strategies[strategy_index], true, validator_options, false); 1689fd4e5da5Sopenharmony_ci auto fuzzer_result = fuzzer.Run(0); 1690fd4e5da5Sopenharmony_ci 1691fd4e5da5Sopenharmony_ci // Cycle the repeated pass strategy so that we try a different one next time 1692fd4e5da5Sopenharmony_ci // we run the fuzzer. 1693fd4e5da5Sopenharmony_ci strategy_index = 1694fd4e5da5Sopenharmony_ci (strategy_index + 1) % static_cast<uint32_t>(strategies.size()); 1695fd4e5da5Sopenharmony_ci 1696fd4e5da5Sopenharmony_ci ASSERT_NE(Fuzzer::Status::kFuzzerPassLedToInvalidModule, 1697fd4e5da5Sopenharmony_ci fuzzer_result.status); 1698fd4e5da5Sopenharmony_ci std::vector<uint32_t> transformed_binary; 1699fd4e5da5Sopenharmony_ci fuzzer.GetIRContext()->module()->ToBinary(&transformed_binary, true); 1700fd4e5da5Sopenharmony_ci ASSERT_TRUE(t.Validate(transformed_binary)); 1701fd4e5da5Sopenharmony_ci 1702fd4e5da5Sopenharmony_ci auto replayer_result = 1703fd4e5da5Sopenharmony_ci Replayer(env, kConsoleMessageConsumer, binary_in, initial_facts, 1704fd4e5da5Sopenharmony_ci fuzzer.GetTransformationSequence(), 1705fd4e5da5Sopenharmony_ci static_cast<uint32_t>( 1706fd4e5da5Sopenharmony_ci fuzzer.GetTransformationSequence().transformation_size()), 1707fd4e5da5Sopenharmony_ci false, validator_options) 1708fd4e5da5Sopenharmony_ci .Run(); 1709fd4e5da5Sopenharmony_ci ASSERT_EQ(Replayer::ReplayerResultStatus::kComplete, 1710fd4e5da5Sopenharmony_ci replayer_result.status); 1711fd4e5da5Sopenharmony_ci 1712fd4e5da5Sopenharmony_ci // After replaying the transformations applied by the fuzzer, exactly those 1713fd4e5da5Sopenharmony_ci // transformations should have been applied, and the binary resulting from 1714fd4e5da5Sopenharmony_ci // replay should be identical to that which resulted from fuzzing. 1715fd4e5da5Sopenharmony_ci std::string fuzzer_transformations_string; 1716fd4e5da5Sopenharmony_ci std::string replayer_transformations_string; 1717fd4e5da5Sopenharmony_ci fuzzer.GetTransformationSequence().SerializeToString( 1718fd4e5da5Sopenharmony_ci &fuzzer_transformations_string); 1719fd4e5da5Sopenharmony_ci replayer_result.applied_transformations.SerializeToString( 1720fd4e5da5Sopenharmony_ci &replayer_transformations_string); 1721fd4e5da5Sopenharmony_ci ASSERT_EQ(fuzzer_transformations_string, replayer_transformations_string); 1722fd4e5da5Sopenharmony_ci ASSERT_TRUE(IsEqual(env, transformed_binary, 1723fd4e5da5Sopenharmony_ci replayer_result.transformed_module.get())); 1724fd4e5da5Sopenharmony_ci } 1725fd4e5da5Sopenharmony_ci} 1726fd4e5da5Sopenharmony_ci 1727fd4e5da5Sopenharmony_ciTEST(FuzzerReplayerTest, Miscellaneous1) { 1728fd4e5da5Sopenharmony_ci // Do some fuzzer runs, starting from an initial seed of 0 (seed value chosen 1729fd4e5da5Sopenharmony_ci // arbitrarily). 1730fd4e5da5Sopenharmony_ci RunFuzzerAndReplayer(kTestShader1, protobufs::FactSequence(), 0, 1731fd4e5da5Sopenharmony_ci kNumFuzzerRuns); 1732fd4e5da5Sopenharmony_ci} 1733fd4e5da5Sopenharmony_ci 1734fd4e5da5Sopenharmony_ciTEST(FuzzerReplayerTest, Miscellaneous2) { 1735fd4e5da5Sopenharmony_ci // Do some fuzzer runs, starting from an initial seed of 10 (seed value chosen 1736fd4e5da5Sopenharmony_ci // arbitrarily). 1737fd4e5da5Sopenharmony_ci RunFuzzerAndReplayer(kTestShader2, protobufs::FactSequence(), 10, 1738fd4e5da5Sopenharmony_ci kNumFuzzerRuns); 1739fd4e5da5Sopenharmony_ci} 1740fd4e5da5Sopenharmony_ci 1741fd4e5da5Sopenharmony_ciTEST(FuzzerReplayerTest, Miscellaneous3) { 1742fd4e5da5Sopenharmony_ci // Add the facts "resolution.x == 250" and "resolution.y == 100". 1743fd4e5da5Sopenharmony_ci protobufs::FactSequence facts; 1744fd4e5da5Sopenharmony_ci AddConstantUniformFact(&facts, 0, 0, {0, 0}, 250); 1745fd4e5da5Sopenharmony_ci AddConstantUniformFact(&facts, 0, 0, {0, 1}, 100); 1746fd4e5da5Sopenharmony_ci 1747fd4e5da5Sopenharmony_ci // Do some fuzzer runs, starting from an initial seed of 94 (seed value chosen 1748fd4e5da5Sopenharmony_ci // arbitrarily). 1749fd4e5da5Sopenharmony_ci RunFuzzerAndReplayer(kTestShader3, facts, 94, kNumFuzzerRuns); 1750fd4e5da5Sopenharmony_ci} 1751fd4e5da5Sopenharmony_ci 1752fd4e5da5Sopenharmony_ciTEST(FuzzerReplayerTest, Miscellaneous4) { 1753fd4e5da5Sopenharmony_ci // Add the facts: 1754fd4e5da5Sopenharmony_ci // - "one == 1.0" 1755fd4e5da5Sopenharmony_ci // - "resolution.y == 256.0", 1756fd4e5da5Sopenharmony_ci protobufs::FactSequence facts; 1757fd4e5da5Sopenharmony_ci AddConstantUniformFact(&facts, 0, 0, {0}, FloatBitsAsUint(1.0)); 1758fd4e5da5Sopenharmony_ci AddConstantUniformFact(&facts, 0, 1, {0, 0}, FloatBitsAsUint(256.0)); 1759fd4e5da5Sopenharmony_ci AddConstantUniformFact(&facts, 0, 1, {0, 1}, FloatBitsAsUint(256.0)); 1760fd4e5da5Sopenharmony_ci 1761fd4e5da5Sopenharmony_ci // Do some fuzzer runs, starting from an initial seed of 14 (seed value chosen 1762fd4e5da5Sopenharmony_ci // arbitrarily). 1763fd4e5da5Sopenharmony_ci RunFuzzerAndReplayer(kTestShader4, facts, 14, kNumFuzzerRuns); 1764fd4e5da5Sopenharmony_ci} 1765fd4e5da5Sopenharmony_ci 1766fd4e5da5Sopenharmony_ciTEST(FuzzerReplayerTest, Miscellaneous5) { 1767fd4e5da5Sopenharmony_ci // Do some fuzzer runs, starting from an initial seed of 29 (seed value chosen 1768fd4e5da5Sopenharmony_ci // arbitrarily). 1769fd4e5da5Sopenharmony_ci RunFuzzerAndReplayer(kTestShader5, protobufs::FactSequence(), 29, 1770fd4e5da5Sopenharmony_ci kNumFuzzerRuns); 1771fd4e5da5Sopenharmony_ci} 1772fd4e5da5Sopenharmony_ci 1773fd4e5da5Sopenharmony_ciTEST(FuzzerReplayerTest, Miscellaneous6) { 1774fd4e5da5Sopenharmony_ci // Do some fuzzer runs, starting from an initial seed of 57 (seed value chosen 1775fd4e5da5Sopenharmony_ci // arbitrarily). 1776fd4e5da5Sopenharmony_ci RunFuzzerAndReplayer(kTestShader6, protobufs::FactSequence(), 57, 1777fd4e5da5Sopenharmony_ci kNumFuzzerRuns); 1778fd4e5da5Sopenharmony_ci} 1779fd4e5da5Sopenharmony_ci 1780fd4e5da5Sopenharmony_ciTEST(FuzzerReplayerTest, Miscellaneous7) { 1781fd4e5da5Sopenharmony_ci // Do some fuzzer runs, starting from an initial seed of 1 (seed value chosen 1782fd4e5da5Sopenharmony_ci // arbitrarily). 1783fd4e5da5Sopenharmony_ci RunFuzzerAndReplayer(kTestShader7, protobufs::FactSequence(), 1, 1784fd4e5da5Sopenharmony_ci kNumFuzzerRuns); 1785fd4e5da5Sopenharmony_ci} 1786fd4e5da5Sopenharmony_ci 1787fd4e5da5Sopenharmony_ci} // namespace 1788fd4e5da5Sopenharmony_ci} // namespace fuzz 1789fd4e5da5Sopenharmony_ci} // namespace spvtools 1790