|
| 1 | +; RUN: %if spirv-tools %{ spirv-as --target-env spv1.0 %s -o - | mlir-translate --deserialize-spirv - -o - | FileCheck %s %} |
| 2 | + |
| 3 | +; This test is analogous to selection.spv but tests switch op. |
| 4 | + |
| 5 | +; CHECK: spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> { |
| 6 | +; CHECK-NEXT: spirv.func @switch({{%.*}}: si32) "None" { |
| 7 | +; CHECK: {{%.*}} = spirv.Constant 1.000000e+00 : f32 |
| 8 | +; CHECK-NEXT: {{%.*}} = spirv.Undef : vector<3xf32> |
| 9 | +; CHECK-NEXT: {{%.*}} = spirv.CompositeInsert {{%.*}}, {{%.*}}[0 : i32] : f32 into vector<3xf32> |
| 10 | +; CHECK-NEXT: spirv.Branch ^[[bb:.+]] |
| 11 | +; CHECK-NEXT: ^[[bb:.+]]: |
| 12 | +; CHECK-NEXT: {{%.*}} = spirv.mlir.selection -> vector<3xf32> { |
| 13 | +; CHECK-NEXT: spirv.Switch {{%.*}} : si32, [ |
| 14 | +; CHECK-NEXT: default: ^[[bb:.+]]({{%.*}}: vector<3xf32>), |
| 15 | +; CHECK-NEXT: 0: ^[[bb:.+]]({{%.*}}: vector<3xf32>), |
| 16 | +; CHECK-NEXT: 1: ^[[bb:.+]]({{%.*}}: vector<3xf32>) |
| 17 | +; CHECK: ^[[bb:.+]]({{%.*}}: vector<3xf32>): |
| 18 | +; CHECK: spirv.Branch ^[[bb:.+]]({{%.*}}: vector<3xf32>) |
| 19 | +; CHECK-NEXT: ^[[bb:.+]]({{%.*}}: vector<3xf32>): |
| 20 | +; CHECK: spirv.Branch ^[[bb:.+]]({{%.*}}: vector<3xf32>) |
| 21 | +; CHECK-NEXT: ^[[bb:.+]]({{%.*}}: vector<3xf32>): |
| 22 | +; CHECK-NEXT: spirv.mlir.merge %8 : vector<3xf32> |
| 23 | +; CHECK-NEXT } |
| 24 | +; CHECK: spirv.Return |
| 25 | +; CHECK-NEXT: } |
| 26 | +; CHECK: } |
| 27 | + |
| 28 | + OpCapability Shader |
| 29 | + OpMemoryModel Logical GLSL450 |
| 30 | + OpEntryPoint GLCompute %main "main" |
| 31 | + OpExecutionMode %main LocalSize 1 1 1 |
| 32 | + OpName %switch "switch" |
| 33 | + OpName %main "main" |
| 34 | + %void = OpTypeVoid |
| 35 | + %int = OpTypeInt 32 1 |
| 36 | + %1 = OpTypeFunction %void %int |
| 37 | + %float = OpTypeFloat 32 |
| 38 | + %float_1 = OpConstant %float 1 |
| 39 | + %v3float = OpTypeVector %float 3 |
| 40 | + %9 = OpUndef %v3float |
| 41 | + %float_3 = OpConstant %float 3 |
| 42 | + %float_4 = OpConstant %float 4 |
| 43 | + %float_2 = OpConstant %float 2 |
| 44 | + %25 = OpTypeFunction %void |
| 45 | + %switch = OpFunction %void None %1 |
| 46 | + %5 = OpFunctionParameter %int |
| 47 | + %6 = OpLabel |
| 48 | + OpBranch %12 |
| 49 | + %12 = OpLabel |
| 50 | + %11 = OpCompositeInsert %v3float %float_1 %9 0 |
| 51 | + OpSelectionMerge %15 None |
| 52 | + OpSwitch %5 %15 0 %13 1 %14 |
| 53 | + %13 = OpLabel |
| 54 | + %16 = OpPhi %v3float %11 %12 |
| 55 | + %18 = OpCompositeInsert %v3float %float_3 %16 1 |
| 56 | + OpBranch %15 |
| 57 | + %14 = OpLabel |
| 58 | + %19 = OpPhi %v3float %11 %12 |
| 59 | + %21 = OpCompositeInsert %v3float %float_4 %19 1 |
| 60 | + OpBranch %15 |
| 61 | + %15 = OpLabel |
| 62 | + %22 = OpPhi %v3float %21 %14 %18 %13 %11 %12 |
| 63 | + %24 = OpCompositeInsert %v3float %float_2 %22 2 |
| 64 | + OpReturn |
| 65 | + OpFunctionEnd |
| 66 | + %main = OpFunction %void None %25 |
| 67 | + %27 = OpLabel |
| 68 | + OpReturn |
| 69 | + OpFunctionEnd |
0 commit comments