349 lines · plain
1// RUN: mlir-translate -no-implicit-module -test-spirv-roundtrip -split-input-file %s | FileCheck %s2 3// RUN: %if spirv-tools %{ rm -rf %t %}4// RUN: %if spirv-tools %{ mkdir %t %}5// RUN: %if spirv-tools %{ mlir-translate --no-implicit-module --serialize-spirv --split-input-file --spirv-save-validation-files-with-prefix=%t/module %s %}6// RUN: %if spirv-tools %{ spirv-val %t %}7 8// Selection with both then and else branches9 10spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {11// CHECK-LABEL: @selection12 spirv.func @selection(%cond: i1) -> () "None" {13// CHECK-NEXT: spirv.Constant 014// CHECK-NEXT: spirv.Variable15// CHECK: spirv.Branch ^[[BB:.+]]16// CHECK-NEXT: ^[[BB]]:17 %zero = spirv.Constant 0: i3218 %one = spirv.Constant 1: i3219 %two = spirv.Constant 2: i3220 %var = spirv.Variable init(%zero) : !spirv.ptr<i32, Function>21 22// CHECK-NEXT: spirv.mlir.selection control(Flatten)23 spirv.mlir.selection control(Flatten) {24// CHECK-NEXT: spirv.BranchConditional %{{.*}} [5, 10], ^[[THEN:.+]], ^[[ELSE:.+]]25 spirv.BranchConditional %cond [5, 10], ^then, ^else26 27// CHECK-NEXT: ^[[THEN]]:28 ^then:29// CHECK-NEXT: spirv.Constant 130// CHECK-NEXT: spirv.Store31 spirv.Store "Function" %var, %one : i3232// CHECK-NEXT: spirv.Branch ^[[MERGE:.+]]33 spirv.Branch ^merge34 35// CHECK-NEXT: ^[[ELSE]]:36 ^else:37// CHECK-NEXT: spirv.Constant 238// CHECK-NEXT: spirv.Store39 spirv.Store "Function" %var, %two : i3240// CHECK-NEXT: spirv.Branch ^[[MERGE]]41 spirv.Branch ^merge42 43// CHECK-NEXT: ^[[MERGE]]:44 ^merge:45// CHECK-NEXT: spirv.mlir.merge46 spirv.mlir.merge47 }48 49 spirv.Return50 }51 52 spirv.func @main() -> () "None" {53 spirv.Return54 }55 spirv.EntryPoint "GLCompute" @main56 spirv.ExecutionMode @main "LocalSize", 1, 1, 157}58 59// -----60 61// Selection with only then branch62// Selection in function entry block63 64spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {65// CHECK-LABEL: spirv.func @selection66// CHECK-SAME: (%[[ARG:.*]]: i1)67 spirv.func @selection(%cond: i1) -> (i32) "None" {68// CHECK: spirv.Branch ^[[BB:.+]]69// CHECK-NEXT: ^[[BB]]:70// CHECK-NEXT: spirv.mlir.selection71 spirv.mlir.selection {72// CHECK-NEXT: spirv.BranchConditional %[[ARG]], ^[[THEN:.+]], ^[[ELSE:.+]]73 spirv.BranchConditional %cond, ^then, ^merge74 75// CHECK: ^[[THEN]]:76 ^then:77 %zero = spirv.Constant 0 : i3278 spirv.ReturnValue %zero : i3279 80// CHECK: ^[[ELSE]]:81 ^merge:82// CHECK-NEXT: spirv.mlir.merge83 spirv.mlir.merge84 }85 86 %one = spirv.Constant 1 : i3287 spirv.ReturnValue %one : i3288 }89 90 spirv.func @main() -> () "None" {91 spirv.Return92 }93 spirv.EntryPoint "GLCompute" @main94 spirv.ExecutionMode @main "LocalSize", 1, 1, 195}96 97// -----98 99// Selection with control flow afterwards100// SSA value def before selection and use after selection101 102spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {103// CHECK-LABEL: @selection_cf()104 spirv.func @selection_cf() -> () "None" {105 %true = spirv.Constant true106 %false = spirv.Constant false107 %zero = spirv.Constant 0 : i32108 %one = spirv.Constant 1 : i32109// CHECK-NEXT: %[[VAR:.+]] = spirv.Variable110 %var = spirv.Variable : !spirv.ptr<i1, Function>111// CHECK-NEXT: spirv.Branch ^[[BB:.+]]112// CHECK-NEXT: ^[[BB]]:113// CHECK: spirv.Branch ^[[BB:.+]]114// CHECK-NEXT: ^[[BB]]:115 116// CHECK-NEXT: spirv.mlir.selection {117 spirv.mlir.selection {118// CHECK: spirv.BranchConditional %{{.+}}, ^[[THEN0:.+]], ^[[ELSE0:.+]]119 spirv.BranchConditional %true, ^then0, ^else0120 121// CHECK-NEXT: ^[[THEN0]]:122// CHECK: spirv.Store "Function" %[[VAR]]123// CHECK-NEXT: spirv.Branch ^[[MERGE:.+]]124 ^then0:125 spirv.Store "Function" %var, %true : i1126 spirv.Branch ^merge127 128// CHECK-NEXT: ^[[ELSE0]]:129// CHECK: spirv.Store "Function" %[[VAR]]130// CHECK-NEXT: spirv.Branch ^[[MERGE]]131 ^else0:132 spirv.Store "Function" %var, %false : i1133 spirv.Branch ^merge134 135// CHECK-NEXT: ^[[MERGE]]:136// CHECK-NEXT: spirv.mlir.merge137 ^merge:138 spirv.mlir.merge139// CHECK-NEXT: }140 }141 142// CHECK-NEXT: spirv.Load "Function" %[[VAR]]143 %cond = spirv.Load "Function" %var : i1144 spirv.mlir.selection {145// CHECK: spirv.BranchConditional %1, ^[[THEN1:.+]](%{{.+}} : i32), ^[[ELSE1:.+]](%{{.+}}, %{{.+}} : i32, i32)146 spirv.BranchConditional %cond, ^then1(%one: i32), ^else1(%zero, %zero: i32, i32)147 148// CHECK-NEXT: ^[[THEN1]](%{{.+}}: i32):149// CHECK-NEXT: spirv.Return150 ^then1(%arg0: i32):151 spirv.Return152 153// CHECK-NEXT: ^[[ELSE1]](%{{.+}}: i32, %{{.+}}: i32):154// CHECK-NEXT: spirv.Return155 ^else1(%arg1: i32, %arg2: i32):156 spirv.Return157 ^merge:158 spirv.mlir.merge159 }160 161 spirv.Return162 }163 164 spirv.func @main() -> () "None" {165 spirv.Return166 }167 spirv.EntryPoint "GLCompute" @main168 spirv.ExecutionMode @main "LocalSize", 1, 1, 1169}170 171// -----172 173// Selection yielding values174 175spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {176// CHECK-LABEL: @selection_yield177 spirv.func @selection_yield(%cond: i1) -> () "None" {178// CHECK-NEXT: spirv.Constant 0179// CHECK-NEXT: spirv.Variable180 %zero = spirv.Constant 0 : i32181 %var = spirv.Variable init(%zero) : !spirv.ptr<i32, Function>182 183// CHECK: spirv.Branch ^[[BB:.+]]184// CHECK-NEXT: ^[[BB]]:185// CHECK-NEXT: {{%.*}} = spirv.mlir.selection -> i32186 %yield = spirv.mlir.selection -> i32 {187// CHECK-NEXT: spirv.BranchConditional %{{.*}} [5, 10], ^[[THEN:.+]], ^[[ELSE:.+]]188 spirv.BranchConditional %cond [5, 10], ^then, ^else189 190// CHECK-NEXT: ^[[THEN]]:191 ^then:192// CHECK-NEXT: spirv.Constant 1193 %one = spirv.Constant 1: i32194 195// CHECK-NEXT: spirv.Branch ^[[MERGE:.+]]({{%.*}} : i32)196 spirv.Branch ^merge(%one : i32)197 198// CHECK-NEXT: ^[[ELSE]]:199 ^else:200// CHECK-NEXT: spirv.Constant 2201 %two = spirv.Constant 2: i32202// CHECK-NEXT: spirv.Branch ^[[MERGE]]({{%.*}} : i32)203 spirv.Branch ^merge(%two : i32)204 205// CHECK-NEXT: ^[[MERGE]]({{%.*}}: i32):206 ^merge(%merged: i32):207// CHECK-NEXT: spirv.mlir.merge {{%.*}} : i32208 spirv.mlir.merge %merged : i32209 }210 211// CHECK: spirv.Store "Function" {{%.*}}, {{%.*}} : i32212 spirv.Store "Function" %var, %yield : i32213 214 spirv.Return215 }216 217 spirv.func @main() -> () "None" {218 spirv.Return219 }220 spirv.EntryPoint "GLCompute" @main221 spirv.ExecutionMode @main "LocalSize", 1, 1, 1222}223 224// -----225 226// Selection with switch227 228spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {229// CHECK-LABEL: @selection_switch230 spirv.func @selection_switch(%selector: i32) -> () "None" {231 %zero = spirv.Constant 0: i32232 %one = spirv.Constant 1: i32233 %two = spirv.Constant 2: i32234 %three = spirv.Constant 3: i32235 %four = spirv.Constant 4: i32236// CHECK: {{%.*}} = spirv.Variable init({{%.*}}) : !spirv.ptr<i32, Function>237 %var = spirv.Variable init(%zero) : !spirv.ptr<i32, Function>238// CHECK: spirv.mlir.selection {239 spirv.mlir.selection {240// CHECK-NEXT: spirv.Switch {{%.*}} : i32, [241// CHECK-NEXT: default: ^[[DEFAULT:.+]],242// CHECK-NEXT: 0: ^[[CASE0:.+]],243// CHECK-NEXT: 1: ^[[CASE1:.+]],244// CHECK-NEXT: 2: ^[[CASE2:.+]]245 spirv.Switch %selector : i32, [246 default: ^default,247 0: ^case0,248 1: ^case1,249 2: ^case2250 ]251// CHECK: ^[[DEFAULT]]252 ^default:253// CHECK: spirv.Store "Function" {{%.*}}, {{%.*}} : i32254 spirv.Store "Function" %var, %one : i32255// CHECK-NEXT: spirv.Branch ^[[MERGE:.+]]256 spirv.Branch ^merge257// CHECK-NEXT: ^[[CASE0]]258 ^case0:259// CHECK: spirv.Store "Function" {{%.*}}, {{%.*}} : i32260 spirv.Store "Function" %var, %two : i32261// CHECK-NEXT: spirv.Branch ^[[MERGE:.+]]262 spirv.Branch ^merge263// CHECK-NEXT: ^[[CASE1]]264 ^case1:265// CHECK: spirv.Store "Function" {{%.*}}, {{%.*}} : i32266 spirv.Store "Function" %var, %three : i32267// CHECK-NEXT: spirv.Branch ^[[MERGE:.+]]268 spirv.Branch ^merge269// CHECK-NEXT: ^[[CASE2]]270 ^case2:271// CHECK: spirv.Store "Function" {{%.*}}, {{%.*}} : i32272 spirv.Store "Function" %var, %four : i32273// CHECK-NEXT: spirv.Branch ^[[MERGE:.+]]274 spirv.Branch ^merge275// CHECK-NEXT: ^[[MERGE]]276 ^merge:277// CHECK-NEXT: spirv.mlir.merge278 spirv.mlir.merge279// CHECK-NEXT: }280 }281// CHECK-NEXT: spirv.Return282 spirv.Return283 }284 285 spirv.func @main() -> () "None" {286 spirv.Return287 }288 spirv.EntryPoint "GLCompute" @main289 spirv.ExecutionMode @main "LocalSize", 1, 1, 1290}291 292// -----293 294// Selection with switch and block operands295 296spirv.module Logical GLSL450 requires #spirv.vce<v1.5, [Shader], []> {297// CHECK-LABEL: @selection_switch_operands298 spirv.func @selection_switch_operands(%selector : si32) "None" {299 %cst1 = spirv.Constant 1.000000e+00 : f32300 %vec0 = spirv.Undef : vector<3xf32>301// CHECK: {{%.*}} = spirv.CompositeInsert {{%.*}}, {{%.*}}[0 : i32] : f32 into vector<3xf32>302 %vec1 = spirv.CompositeInsert %cst1, %vec0[0 : i32] : f32 into vector<3xf32>303 spirv.Branch ^bb1304 ^bb1:305// CHECK: {{%.*}} = spirv.mlir.selection -> vector<3xf32> {306 %vec4 = spirv.mlir.selection -> vector<3xf32> {307// CHECK-NEXT: spirv.Switch {{%.*}} : si32, [308// CHECK-NEXT: default: ^[[DEFAULT:.+]]({{%.*}} : vector<3xf32>),309// CHECK-NEXT: 0: ^[[CASE0:.+]]({{%.*}} : vector<3xf32>),310// CHECK-NEXT: 1: ^[[CASE1:.+]]({{%.*}} : vector<3xf32>)311 spirv.Switch %selector : si32, [312 default: ^bb3(%vec1 : vector<3xf32>),313 0: ^bb1(%vec1 : vector<3xf32>),314 1: ^bb2(%vec1 : vector<3xf32>)315 ]316// CHECK: ^[[CASE0]]({{%.*}}: vector<3xf32>)317 ^bb1(%vecbb1: vector<3xf32>):318 %cst3 = spirv.Constant 3.000000e+00 : f32319// CHECK: {{%.*}} = spirv.CompositeInsert {{%.*}}, {{%.*}}[1 : i32] : f32 into vector<3xf32>320 %vec2 = spirv.CompositeInsert %cst3, %vecbb1[1 : i32] : f32 into vector<3xf32>321// CHECK-NEXT: spirv.Branch ^[[DEFAULT]]({{%.*}} : vector<3xf32>)322 spirv.Branch ^bb3(%vec2 : vector<3xf32>)323// CHECK-NEXT: ^[[CASE1]]({{%.*}}: vector<3xf32>)324 ^bb2(%vecbb2: vector<3xf32>):325 %cst4 = spirv.Constant 4.000000e+00 : f32326// CHECK: {{%.*}} = spirv.CompositeInsert {{%.*}}, {{%.*}}[1 : i32] : f32 into vector<3xf32>327 %vec3 = spirv.CompositeInsert %cst4, %vecbb2[1 : i32] : f32 into vector<3xf32>328// CHECK-NEXT: spirv.Branch ^[[DEFAULT]]({{%.*}} : vector<3xf32>)329 spirv.Branch ^bb3(%vec3 : vector<3xf32>)330// CHECK-NEXT: ^[[DEFAULT]]({{%.*}}: vector<3xf32>)331 ^bb3(%vecbb3: vector<3xf32>):332// CHECK-NEXT: spirv.mlir.merge {{%.*}} : vector<3xf32>333 spirv.mlir.merge %vecbb3 : vector<3xf32>334// CHECK-NEXT: }335 }336 %cst2 = spirv.Constant 2.000000e+00 : f32337// CHECK: {{%.*}} = spirv.CompositeInsert {{%.*}}, {{%.*}}[2 : i32] : f32 into vector<3xf32>338 %vec5 = spirv.CompositeInsert %cst2, %vec4[2 : i32] : f32 into vector<3xf32>339 spirv.Return340 }341 342 spirv.func @main() -> () "None" {343 spirv.Return344 }345 346 spirv.EntryPoint "GLCompute" @main347 spirv.ExecutionMode @main "LocalSize", 1, 1, 1348}349