brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.8 KiB · d0ad118 Raw
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