brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.7 KiB · e71b545 Raw
329 lines · plain
1// RUN: mlir-opt -split-input-file -verify-diagnostics %s | FileCheck %s2 3//===----------------------------------------------------------------------===//4// spirv.CompositeConstruct5//===----------------------------------------------------------------------===//6 7// CHECK-LABEL: func @composite_construct_vector8func.func @composite_construct_vector(%arg0: f32, %arg1: f32, %arg2 : f32) -> vector<3xf32> {9  // CHECK: spirv.CompositeConstruct {{%.*}}, {{%.*}}, {{%.*}} : (f32, f32, f32) -> vector<3xf32>10  %0 = spirv.CompositeConstruct %arg0, %arg1, %arg2 : (f32, f32, f32) -> vector<3xf32>11  return %0: vector<3xf32>12}13 14// CHECK-LABEL: func @composite_construct_bf16_vector15func.func @composite_construct_bf16_vector(%arg0: bf16, %arg1: bf16, %arg2 : bf16) -> vector<3xbf16> {16  // CHECK: spirv.CompositeConstruct {{%.*}}, {{%.*}}, {{%.*}} : (bf16, bf16, bf16) -> vector<3xbf16>17  %0 = spirv.CompositeConstruct %arg0, %arg1, %arg2 : (bf16, bf16, bf16) -> vector<3xbf16>18  return %0: vector<3xbf16>19}20 21// CHECK-LABEL: func @composite_construct_struct22func.func @composite_construct_struct(%arg0: vector<3xf32>, %arg1: !spirv.array<4xf32>, %arg2 : !spirv.struct<(f32)>) -> !spirv.struct<(vector<3xf32>, !spirv.array<4xf32>, !spirv.struct<(f32)>)> {23  // CHECK: spirv.CompositeConstruct24  %0 = spirv.CompositeConstruct %arg0, %arg1, %arg2 : (vector<3xf32>, !spirv.array<4xf32>, !spirv.struct<(f32)>) -> !spirv.struct<(vector<3xf32>, !spirv.array<4xf32>, !spirv.struct<(f32)>)>25  return %0: !spirv.struct<(vector<3xf32>, !spirv.array<4xf32>, !spirv.struct<(f32)>)>26}27 28// CHECK-LABEL: func @composite_construct_mixed_scalar_vector29func.func @composite_construct_mixed_scalar_vector(%arg0: f32, %arg1: f32, %arg2 : vector<2xf32>) -> vector<4xf32> {30  // CHECK: spirv.CompositeConstruct %{{.+}}, %{{.+}}, %{{.+}} : (f32, vector<2xf32>, f32) -> vector<4xf32>31  %0 = spirv.CompositeConstruct %arg0, %arg2, %arg1 : (f32, vector<2xf32>, f32) -> vector<4xf32>32  return %0: vector<4xf32>33}34 35// CHECK-LABEL: func @composite_construct_coopmatrix_khr36func.func @composite_construct_coopmatrix_khr(%arg0 : f32) -> !spirv.coopmatrix<8x16xf32, Subgroup, MatrixA> {37  // CHECK: spirv.CompositeConstruct {{%.*}} : (f32) -> !spirv.coopmatrix<8x16xf32, Subgroup, MatrixA>38  %0 = spirv.CompositeConstruct %arg0 : (f32) -> !spirv.coopmatrix<8x16xf32, Subgroup, MatrixA>39  return %0: !spirv.coopmatrix<8x16xf32, Subgroup, MatrixA>40}41 42// -----43 44func.func @composite_construct_invalid_result_type(%arg0: f32, %arg1: f32, %arg2 : f32) -> vector<3xf32> {45  // expected-error @+1 {{has incorrect number of operands: expected 3, but provided 2}}46  %0 = spirv.CompositeConstruct %arg0, %arg2 : (f32, f32) -> vector<3xf32>47  return %0: vector<3xf32>48}49 50// -----51 52func.func @composite_construct_invalid_operand_type(%arg0: f32, %arg1: f32, %arg2 : f32) -> vector<3xi32> {53  // expected-error @+1 {{operand type mismatch: expected operand type 'i32', but provided 'f32'}}54  %0 = spirv.CompositeConstruct %arg0, %arg1, %arg2 : (f32, f32, f32) -> vector<3xi32>55  return %0: vector<3xi32>56}57 58// -----59 60func.func @composite_construct_khr_coopmatrix_incorrect_operand_count(%arg0 : f32, %arg1 : f32) ->61  !spirv.coopmatrix<8x16xf32, Subgroup, MatrixA> {62  // expected-error @+1 {{has incorrect number of operands: expected 1, but provided 2}}63  %0 = spirv.CompositeConstruct %arg0, %arg1 : (f32, f32) -> !spirv.coopmatrix<8x16xf32, Subgroup, MatrixA>64  return %0: !spirv.coopmatrix<8x16xf32, Subgroup, MatrixA>65}66 67// -----68 69func.func @composite_construct_khr_coopmatrix_incorrect_element_type(%arg0 : i32) ->70  !spirv.coopmatrix<8x16xf32, Subgroup, MatrixB> {71  // expected-error @+1 {{operand type mismatch: expected operand type 'f32', but provided 'i32'}}72  %0 = spirv.CompositeConstruct %arg0 : (i32) -> !spirv.coopmatrix<8x16xf32, Subgroup, MatrixB>73  return %0: !spirv.coopmatrix<8x16xf32, Subgroup, MatrixB>74}75 76// -----77 78func.func @composite_construct_array(%arg0: f32) -> !spirv.array<4xf32> {79  // expected-error @+1 {{expected to return a vector or cooperative matrix when the number of constituents is less than what the result needs}}80  %0 = spirv.CompositeConstruct %arg0 : (f32) -> !spirv.array<4xf32>81  return %0: !spirv.array<4xf32>82}83 84// -----85 86func.func @composite_construct_vector_wrong_element_type(%arg0: f32, %arg1: f32, %arg2 : vector<2xi32>) -> vector<4xf32> {87  // expected-error @+1 {{operand element type mismatch: expected to be 'f32', but provided 'i32'}}88  %0 = spirv.CompositeConstruct %arg0, %arg2, %arg1 : (f32, vector<2xi32>, f32) -> vector<4xf32>89  return %0: vector<4xf32>90}91 92// -----93 94func.func @composite_construct_vector_wrong_count(%arg0: f32, %arg1: f32, %arg2 : vector<2xf32>) -> vector<4xf32> {95  // expected-error @+1 {{op has incorrect number of operands: expected 4, but provided 3}}96  %0 = spirv.CompositeConstruct %arg0, %arg2 : (f32, vector<2xf32>) -> vector<4xf32>97  return %0: vector<4xf32>98}99 100// -----101 102//===----------------------------------------------------------------------===//103// spirv.CompositeExtractOp104//===----------------------------------------------------------------------===//105 106func.func @composite_extract_array(%arg0: !spirv.array<4xf32>) -> f32 {107  // CHECK: {{%.*}} = spirv.CompositeExtract {{%.*}}[1 : i32] : !spirv.array<4 x f32>108  %0 = spirv.CompositeExtract %arg0[1 : i32] : !spirv.array<4xf32>109  return %0: f32110}111 112// -----113 114func.func @composite_extract_struct(%arg0 : !spirv.struct<(f32, !spirv.array<4xf32>)>) -> f32 {115  // CHECK: {{%.*}} = spirv.CompositeExtract {{%.*}}[1 : i32, 2 : i32] : !spirv.struct<(f32, !spirv.array<4 x f32>)>116  %0 = spirv.CompositeExtract %arg0[1 : i32, 2 : i32] : !spirv.struct<(f32, !spirv.array<4xf32>)>117  return %0 : f32118}119 120// -----121 122func.func @composite_extract_vector(%arg0 : vector<4xf32>) -> f32 {123  // CHECK: {{%.*}} = spirv.CompositeExtract {{%.*}}[1 : i32] : vector<4xf32>124  %0 = spirv.CompositeExtract %arg0[1 : i32] : vector<4xf32>125  return %0 : f32126}127 128// -----129 130func.func @composite_extract_no_ssa_operand() -> () {131  // expected-error @+1 {{expected SSA operand}}132  %0 = spirv.CompositeExtract [4 : i32, 1 : i32] : !spirv.array<4x!spirv.array<4xf32>>133  return134}135 136// -----137 138func.func @composite_extract_invalid_index_type_1() -> () {139  %0 = spirv.Constant 10 : i32140  %1 = spirv.Variable : !spirv.ptr<!spirv.array<4x!spirv.array<4xf32>>, Function>141  %2 = spirv.Load "Function" %1 ["Volatile"] : !spirv.array<4x!spirv.array<4xf32>>142  // expected-error @+1 {{expected attribute value}}143  %3 = spirv.CompositeExtract %2[%0] : !spirv.array<4x!spirv.array<4xf32>>144  return145}146 147// -----148 149func.func @composite_extract_invalid_index_type_2(%arg0 : !spirv.array<4x!spirv.array<4xf32>>) -> () {150  // expected-error @+1 {{attribute 'indices' failed to satisfy constraint: 32-bit integer array attribute}}151  %0 = spirv.CompositeExtract %arg0[1] : !spirv.array<4x!spirv.array<4xf32>>152  return153}154 155// -----156 157func.func @composite_extract_invalid_index_identifier(%arg0 : !spirv.array<4x!spirv.array<4xf32>>) -> () {158  // expected-error @+1 {{expected attribute value}}159  %0 = spirv.CompositeExtract %arg0 ]1 : i32) : !spirv.array<4x!spirv.array<4xf32>>160  return161}162 163// -----164 165func.func @composite_extract_2D_array_out_of_bounds_access_1(%arg0: !spirv.array<4x!spirv.array<4xf32>>) -> () {166  // expected-error @+1 {{index 4 out of bounds for '!spirv.array<4 x !spirv.array<4 x f32>>'}}167  %0 = spirv.CompositeExtract %arg0[4 : i32, 1 : i32] : !spirv.array<4x!spirv.array<4xf32>>168  return169}170 171// -----172 173func.func @composite_extract_2D_array_out_of_bounds_access_2(%arg0: !spirv.array<4x!spirv.array<4xf32>>174) -> () {175  // expected-error @+1 {{index 4 out of bounds for '!spirv.array<4 x f32>'}}176  %0 = spirv.CompositeExtract %arg0[1 : i32, 4 : i32] : !spirv.array<4x!spirv.array<4xf32>>177  return178}179 180// -----181 182func.func @composite_extract_struct_element_out_of_bounds_access(%arg0 : !spirv.struct<(f32, !spirv.array<4xf32>)>) -> () {183  // expected-error @+1 {{index 2 out of bounds for '!spirv.struct<(f32, !spirv.array<4 x f32>)>'}}184  %0 = spirv.CompositeExtract %arg0[2 : i32, 0 : i32] : !spirv.struct<(f32, !spirv.array<4xf32>)>185  return186}187 188// -----189 190func.func @composite_extract_vector_out_of_bounds_access(%arg0: vector<4xf32>) -> () {191  // expected-error @+1 {{index 4 out of bounds for 'vector<4xf32>'}}192  %0 = spirv.CompositeExtract %arg0[4 : i32] : vector<4xf32>193  return194}195 196// -----197 198func.func @composite_extract_invalid_types_1(%arg0: !spirv.array<4x!spirv.array<4xf32>>) -> () {199  // expected-error @+1 {{cannot extract from non-composite type 'f32' with index 3}}200  %0 = spirv.CompositeExtract %arg0[1 : i32, 2 : i32, 3 : i32] : !spirv.array<4x!spirv.array<4xf32>>201  return202}203 204// -----205 206func.func @composite_extract_invalid_types_2(%arg0: f32) -> () {207  // expected-error @+1 {{cannot extract from non-composite type 'f32' with index 1}}208  %0 = spirv.CompositeExtract %arg0[1 : i32] : f32209  return210}211 212// -----213 214func.func @composite_extract_invalid_extracted_type(%arg0: !spirv.array<4x!spirv.array<4xf32>>) -> () {215  // expected-error @+1 {{expected at least one index for spirv.CompositeExtract}}216  %0 = spirv.CompositeExtract %arg0[] : !spirv.array<4x!spirv.array<4xf32>>217  return218}219 220// -----221 222func.func @composite_extract_result_type_mismatch(%arg0: !spirv.array<4xf32>) -> i32 {223  // expected-error @+1 {{invalid result type: expected 'f32' but provided 'i32'}}224  %0 = "spirv.CompositeExtract"(%arg0) {indices = [2: i32]} : (!spirv.array<4xf32>) -> (i32)225  return %0: i32226}227 228// -----229 230//===----------------------------------------------------------------------===//231// spirv.CompositeInsert232//===----------------------------------------------------------------------===//233 234func.func @composite_insert_array(%arg0: !spirv.array<4xf32>, %arg1: f32) -> !spirv.array<4xf32> {235  // CHECK: {{%.*}} = spirv.CompositeInsert {{%.*}}, {{%.*}}[1 : i32] : f32 into !spirv.array<4 x f32>236  %0 = spirv.CompositeInsert %arg1, %arg0[1 : i32] : f32 into !spirv.array<4xf32>237  return %0: !spirv.array<4xf32>238}239 240// -----241 242func.func @composite_insert_struct(%arg0: !spirv.struct<(!spirv.array<4xf32>, f32)>, %arg1: !spirv.array<4xf32>) -> !spirv.struct<(!spirv.array<4xf32>, f32)> {243  // CHECK: {{%.*}} = spirv.CompositeInsert {{%.*}}, {{%.*}}[0 : i32] : !spirv.array<4 x f32> into !spirv.struct<(!spirv.array<4 x f32>, f32)>244  %0 = spirv.CompositeInsert %arg1, %arg0[0 : i32] : !spirv.array<4xf32> into !spirv.struct<(!spirv.array<4xf32>, f32)>245  return %0: !spirv.struct<(!spirv.array<4xf32>, f32)>246}247 248// -----249 250func.func @composite_insert_no_indices(%arg0: !spirv.array<4xf32>, %arg1: f32) -> !spirv.array<4xf32> {251  // expected-error @+1 {{expected at least one index}}252  %0 = spirv.CompositeInsert %arg1, %arg0[] : f32 into !spirv.array<4xf32>253  return %0: !spirv.array<4xf32>254}255 256// -----257 258func.func @composite_insert_out_of_bounds(%arg0: !spirv.array<4xf32>, %arg1: f32) -> !spirv.array<4xf32> {259  // expected-error @+1 {{index 4 out of bounds}}260  %0 = spirv.CompositeInsert %arg1, %arg0[4 : i32] : f32 into !spirv.array<4xf32>261  return %0: !spirv.array<4xf32>262}263 264// -----265 266func.func @composite_insert_invalid_object_type(%arg0: !spirv.array<4xf32>, %arg1: f64) -> !spirv.array<4xf32> {267  // expected-error @+1 {{object operand type should be 'f32', but found 'f64'}}268  %0 = spirv.CompositeInsert %arg1, %arg0[3 : i32] : f64 into !spirv.array<4xf32>269  return %0: !spirv.array<4xf32>270}271 272// -----273 274func.func @composite_insert_invalid_result_type(%arg0: !spirv.array<4xf32>, %arg1 : f32) -> !spirv.array<4xf64> {275  // expected-error @+1 {{result type should be the same as the composite type, but found '!spirv.array<4 x f32>' vs '!spirv.array<4 x f64>'}}276  %0 = "spirv.CompositeInsert"(%arg1, %arg0) {indices = [0: i32]} : (f32, !spirv.array<4xf32>) -> !spirv.array<4xf64>277  return %0: !spirv.array<4xf64>278}279 280// -----281 282//===----------------------------------------------------------------------===//283// spirv.VectorExtractDynamic284//===----------------------------------------------------------------------===//285 286func.func @vector_dynamic_extract(%vec: vector<4xf32>, %id : i32) -> f32 {287  // CHECK: spirv.VectorExtractDynamic %{{.*}}[%{{.*}}] : vector<4xf32>, i32288  %0 = spirv.VectorExtractDynamic %vec[%id] : vector<4xf32>, i32289  return %0 : f32290}291 292//===----------------------------------------------------------------------===//293// spirv.VectorInsertDynamic294//===----------------------------------------------------------------------===//295 296func.func @vector_dynamic_insert(%val: f32, %vec: vector<4xf32>, %id : i32) -> vector<4xf32> {297  // CHECK: spirv.VectorInsertDynamic %{{.*}}, %{{.*}}[%{{.*}}] : vector<4xf32>, i32298  %0 = spirv.VectorInsertDynamic %val, %vec[%id] : vector<4xf32>, i32299  return %0 : vector<4xf32>300}301 302// -----303 304//===----------------------------------------------------------------------===//305// spirv.VectorShuffle306//===----------------------------------------------------------------------===//307 308func.func @vector_shuffle(%vector1: vector<4xf32>, %vector2: vector<2xf32>) -> vector<3xf32> {309  // CHECK: %{{.+}} = spirv.VectorShuffle [1 : i32, 3 : i32, -1 : i32] %{{.+}}, %arg1 : vector<4xf32>, vector<2xf32> -> vector<3xf32>310  %0 = spirv.VectorShuffle [1: i32, 3: i32, 0xffffffff: i32] %vector1, %vector2 : vector<4xf32>, vector<2xf32> -> vector<3xf32>311  return %0: vector<3xf32>312}313 314// -----315 316func.func @vector_shuffle_extra_selector(%vector1: vector<4xf32>, %vector2: vector<2xf32>) -> vector<3xf32> {317  // expected-error @+1 {{result type element count (3) mismatch with the number of component selectors (4)}}318  %0 = spirv.VectorShuffle [1: i32, 3: i32, 5: i32, 2: i32] %vector1, %vector2 : vector<4xf32>, vector<2xf32> -> vector<3xf32>319  return %0: vector<3xf32>320}321 322// -----323 324func.func @vector_shuffle_extra_selector(%vector1: vector<4xf32>, %vector2: vector<2xf32>) -> vector<3xf32> {325  // expected-error @+1 {{component selector 7 out of range: expected to be in [0, 6) or 0xffffffff}}326  %0 = spirv.VectorShuffle [1: i32, 7: i32, 5: i32] %vector1, %vector2 : vector<4xf32>, vector<2xf32> -> vector<3xf32>327  return %0: vector<3xf32>328}329