| ; RUN: %if spirv-tools %{ spirv-as --target-env spv1.0 %s -o - | mlir-translate --deserialize-spirv - -o - | FileCheck %s %} |
| |
| ; COM: The purpose of this test is to check that a variable (in this case %color) that |
| ; COM: is defined before a selection region and used both in the selection region and |
| ; COM: after it, is not sunk into that selection region by the deserializer. If the |
| ; COM: variable is sunk, then it cannot be accessed outside the region and causes |
| ; COM: control-flow structurization to fail. |
| |
| ; CHECK: spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> { |
| ; CHECK: spirv.func @main() "None" { |
| ; CHECK: spirv.Variable : !spirv.ptr<vector<4xf32>, Function> |
| ; CHECK: spirv.mlir.selection { |
| ; CHECK-NEXT: spirv.BranchConditional {{.*}}, ^[[bb:.+]], ^[[bb:.+]] |
| ; CHECK-NEXT: ^[[bb:.+]] |
| ; CHECK: spirv.Branch ^[[bb:.+]] |
| ; CHECK-NEXT: ^[[bb:.+]]: |
| ; CHECK-NEXT: spirv.mlir.merge |
| ; CHECK-NEXT: } |
| ; CHECK: spirv.Return |
| ; CHECK-NEXT: } |
| ; CHECK: } |
| |
| OpCapability Shader |
| %2 = OpExtInstImport "GLSL.std.450" |
| OpMemoryModel Logical GLSL450 |
| OpEntryPoint Fragment %main "main" %colorOut |
| OpExecutionMode %main OriginUpperLeft |
| OpDecorate %colorOut Location 0 |
| %void = OpTypeVoid |
| %4 = OpTypeFunction %void |
| %float = OpTypeFloat 32 |
| %v4float = OpTypeVector %float 4 |
| %fun_v4float = OpTypePointer Function %v4float |
| %float_1 = OpConstant %float 1 |
| %float_0 = OpConstant %float 0 |
| %13 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1 |
| %out_v4float = OpTypePointer Output %v4float |
| %colorOut = OpVariable %out_v4float Output |
| %uint = OpTypeInt 32 0 |
| %uint_0 = OpConstant %uint 0 |
| %out_float = OpTypePointer Output %float |
| %bool = OpTypeBool |
| %25 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1 |
| %main = OpFunction %void None %4 |
| %6 = OpLabel |
| %color = OpVariable %fun_v4float Function |
| OpStore %color %13 |
| %19 = OpAccessChain %out_float %colorOut %uint_0 |
| %20 = OpLoad %float %19 |
| %22 = OpFOrdEqual %bool %20 %float_1 |
| OpSelectionMerge %24 None |
| OpBranchConditional %22 %23 %24 |
| %23 = OpLabel |
| OpStore %color %25 |
| OpBranch %24 |
| %24 = OpLabel |
| %26 = OpLoad %v4float %color |
| OpStore %colorOut %26 |
| OpReturn |
| OpFunctionEnd |