Ensure SplitEdge to return the new block between the two given blocks
[llvm-project.git] / mlir / test / Dialect / SPIRV / composite-ops.mlir
blob77d091fe1107af0bee2e88486a5cf828e7e9e28e
1 // RUN: mlir-opt -split-input-file -verify-diagnostics %s | FileCheck %s
3 //===----------------------------------------------------------------------===//
4 // spv.CompositeConstruct
5 //===----------------------------------------------------------------------===//
7 func @composite_construct_vector(%arg0: f32, %arg1: f32, %arg2 : f32) -> vector<3xf32> {
8   // CHECK: spv.CompositeConstruct {{%.*}}, {{%.*}}, {{%.*}} : vector<3xf32>
9   %0 = spv.CompositeConstruct %arg0, %arg1, %arg2 : vector<3xf32>
10   return %0: vector<3xf32>
13 // -----
15 func @composite_construct_struct(%arg0: vector<3xf32>, %arg1: !spv.array<4xf32>, %arg2 : !spv.struct<(f32)>) -> !spv.struct<(vector<3xf32>, !spv.array<4xf32>, !spv.struct<(f32)>)> {
16   // CHECK: spv.CompositeConstruct %arg0, %arg1, %arg2 : !spv.struct<(vector<3xf32>, !spv.array<4 x f32>, !spv.struct<(f32)>)>
17   %0 = spv.CompositeConstruct %arg0, %arg1, %arg2 : !spv.struct<(vector<3xf32>, !spv.array<4xf32>, !spv.struct<(f32)>)>
18   return %0: !spv.struct<(vector<3xf32>, !spv.array<4xf32>, !spv.struct<(f32)>)>
21 // -----
23 func @composite_construct_coopmatrix(%arg0 : f32) -> !spv.coopmatrix<8x16xf32, Subgroup> {
24   // CHECK: spv.CompositeConstruct {{%.*}} : !spv.coopmatrix<8x16xf32, Subgroup>
25   %0 = spv.CompositeConstruct %arg0 : !spv.coopmatrix<8x16xf32, Subgroup>
26   return %0: !spv.coopmatrix<8x16xf32, Subgroup>
29 // -----
31 func @composite_construct_empty_struct() -> !spv.struct<()> {
32   // CHECK: spv.CompositeConstruct : !spv.struct<()>
33   %0 = spv.CompositeConstruct : !spv.struct<()>
34   return %0: !spv.struct<()>
37 // -----
39 func @composite_construct_invalid_num_of_elements(%arg0: f32) -> f32 {
40   // expected-error @+1 {{result type must be a composite type, but provided 'f32'}}
41   %0 = spv.CompositeConstruct %arg0 : f32
42   return %0: f32
45 // -----
47 func @composite_construct_invalid_result_type(%arg0: f32, %arg1: f32, %arg2 : f32) -> vector<3xf32> {
48   // expected-error @+1 {{has incorrect number of operands: expected 3, but provided 2}}
49   %0 = spv.CompositeConstruct %arg0, %arg2 : vector<3xf32>
50   return %0: vector<3xf32>
53 // -----
55 func @composite_construct_invalid_operand_type(%arg0: f32, %arg1: f32, %arg2 : f32) -> vector<3xi32> {
56   // expected-error @+1 {{operand type mismatch: expected operand type 'i32', but provided 'f32'}}
57   %0 = "spv.CompositeConstruct" (%arg0, %arg1, %arg2) : (f32, f32, f32) -> vector<3xi32>
58   return %0: vector<3xi32>
61 // -----
63 func @composite_construct_coopmatrix(%arg0 : f32, %arg1 : f32) -> !spv.coopmatrix<8x16xf32, Subgroup> {
64   // expected-error @+1 {{has incorrect number of operands: expected 1, but provided 2}}
65   %0 = spv.CompositeConstruct %arg0, %arg1 : !spv.coopmatrix<8x16xf32, Subgroup>
66   return %0: !spv.coopmatrix<8x16xf32, Subgroup>
69 // -----
71 //===----------------------------------------------------------------------===//
72 // spv.CompositeExtractOp
73 //===----------------------------------------------------------------------===//
75 func @composite_extract_array(%arg0: !spv.array<4xf32>) -> f32 {
76   // CHECK: {{%.*}} = spv.CompositeExtract {{%.*}}[1 : i32] : !spv.array<4 x f32>
77   %0 = spv.CompositeExtract %arg0[1 : i32] : !spv.array<4xf32>
78   return %0: f32
81 // -----
83 func @composite_extract_struct(%arg0 : !spv.struct<(f32, !spv.array<4xf32>)>) -> f32 {
84   // CHECK: {{%.*}} = spv.CompositeExtract {{%.*}}[1 : i32, 2 : i32] : !spv.struct<(f32, !spv.array<4 x f32>)>
85   %0 = spv.CompositeExtract %arg0[1 : i32, 2 : i32] : !spv.struct<(f32, !spv.array<4xf32>)>
86   return %0 : f32
89 // -----
91 func @composite_extract_vector(%arg0 : vector<4xf32>) -> f32 {
92   // CHECK: {{%.*}} = spv.CompositeExtract {{%.*}}[1 : i32] : vector<4xf32>
93   %0 = spv.CompositeExtract %arg0[1 : i32] : vector<4xf32>
94   return %0 : f32
97 // -----
99 func @composite_extract_coopmatrix(%arg0 : !spv.coopmatrix<8x16xf32, Subgroup>) -> f32 {
100   // CHECK: {{%.*}} = spv.CompositeExtract {{%.*}}[2 : i32] : !spv.coopmatrix<8x16xf32, Subgroup>
101   %0 = spv.CompositeExtract %arg0[2 : i32] : !spv.coopmatrix<8x16xf32, Subgroup>
102   return %0 : f32
105 // -----
107 func @composite_extract_no_ssa_operand() -> () {
108   // expected-error @+1 {{expected SSA operand}}
109   %0 = spv.CompositeExtract [4 : i32, 1 : i32] : !spv.array<4x!spv.array<4xf32>>
110   return
113 // -----
115 func @composite_extract_invalid_index_type_1() -> () {
116   %0 = spv.constant 10 : i32
117   %1 = spv.Variable : !spv.ptr<!spv.array<4x!spv.array<4xf32>>, Function>
118   %2 = spv.Load "Function" %1 ["Volatile"] : !spv.array<4x!spv.array<4xf32>>
119   // expected-error @+1 {{expected non-function type}}
120   %3 = spv.CompositeExtract %2[%0] : !spv.array<4x!spv.array<4xf32>>
121   return
124 // -----
126 func @composite_extract_invalid_index_type_2(%arg0 : !spv.array<4x!spv.array<4xf32>>) -> () {
127   // expected-error @+1 {{attribute 'indices' failed to satisfy constraint: 32-bit integer array attribute}}
128   %0 = spv.CompositeExtract %arg0[1] : !spv.array<4x!spv.array<4xf32>>
129   return
132 // -----
134 func @composite_extract_invalid_index_identifier(%arg0 : !spv.array<4x!spv.array<4xf32>>) -> () {
135   // expected-error @+1 {{expected non-function type}}
136   %0 = spv.CompositeExtract %arg0 ]1 : i32) : !spv.array<4x!spv.array<4xf32>>
137   return
140 // -----
142 func @composite_extract_2D_array_out_of_bounds_access_1(%arg0: !spv.array<4x!spv.array<4xf32>>) -> () {
143   // expected-error @+1 {{index 4 out of bounds for '!spv.array<4 x !spv.array<4 x f32>>'}}
144   %0 = spv.CompositeExtract %arg0[4 : i32, 1 : i32] : !spv.array<4x!spv.array<4xf32>>
145   return
148 // -----
150 func @composite_extract_2D_array_out_of_bounds_access_2(%arg0: !spv.array<4x!spv.array<4xf32>>
151 ) -> () {
152   // expected-error @+1 {{index 4 out of bounds for '!spv.array<4 x f32>'}}
153   %0 = spv.CompositeExtract %arg0[1 : i32, 4 : i32] : !spv.array<4x!spv.array<4xf32>>
154   return
157 // -----
159 func @composite_extract_struct_element_out_of_bounds_access(%arg0 : !spv.struct<(f32, !spv.array<4xf32>)>) -> () {
160   // expected-error @+1 {{index 2 out of bounds for '!spv.struct<(f32, !spv.array<4 x f32>)>'}}
161   %0 = spv.CompositeExtract %arg0[2 : i32, 0 : i32] : !spv.struct<(f32, !spv.array<4xf32>)>
162   return
165 // -----
167 func @composite_extract_vector_out_of_bounds_access(%arg0: vector<4xf32>) -> () {
168   // expected-error @+1 {{index 4 out of bounds for 'vector<4xf32>'}}
169   %0 = spv.CompositeExtract %arg0[4 : i32] : vector<4xf32>
170   return
173 // -----
175 func @composite_extract_invalid_types_1(%arg0: !spv.array<4x!spv.array<4xf32>>) -> () {
176   // expected-error @+1 {{cannot extract from non-composite type 'f32' with index 3}}
177   %0 = spv.CompositeExtract %arg0[1 : i32, 2 : i32, 3 : i32] : !spv.array<4x!spv.array<4xf32>>
178   return
181 // -----
183 func @composite_extract_invalid_types_2(%arg0: f32) -> () {
184   // expected-error @+1 {{cannot extract from non-composite type 'f32' with index 1}}
185   %0 = spv.CompositeExtract %arg0[1 : i32] : f32
186   return
189 // -----
191 func @composite_extract_invalid_extracted_type(%arg0: !spv.array<4x!spv.array<4xf32>>) -> () {
192   // expected-error @+1 {{expected at least one index for spv.CompositeExtract}}
193   %0 = spv.CompositeExtract %arg0[] : !spv.array<4x!spv.array<4xf32>>
194   return
197 // -----
199 func @composite_extract_result_type_mismatch(%arg0: !spv.array<4xf32>) -> i32 {
200   // expected-error @+1 {{invalid result type: expected 'f32' but provided 'i32'}}
201   %0 = "spv.CompositeExtract"(%arg0) {indices = [2: i32]} : (!spv.array<4xf32>) -> (i32)
202   return %0: i32
205 // -----
207 //===----------------------------------------------------------------------===//
208 // spv.CompositeInsert
209 //===----------------------------------------------------------------------===//
211 func @composite_insert_array(%arg0: !spv.array<4xf32>, %arg1: f32) -> !spv.array<4xf32> {
212   // CHECK: {{%.*}} = spv.CompositeInsert {{%.*}}, {{%.*}}[1 : i32] : f32 into !spv.array<4 x f32>
213   %0 = spv.CompositeInsert %arg1, %arg0[1 : i32] : f32 into !spv.array<4xf32>
214   return %0: !spv.array<4xf32>
217 // -----
219 func @composite_insert_struct(%arg0: !spv.struct<(!spv.array<4xf32>, f32)>, %arg1: !spv.array<4xf32>) -> !spv.struct<(!spv.array<4xf32>, f32)> {
220   // CHECK: {{%.*}} = spv.CompositeInsert {{%.*}}, {{%.*}}[0 : i32] : !spv.array<4 x f32> into !spv.struct<(!spv.array<4 x f32>, f32)>
221   %0 = spv.CompositeInsert %arg1, %arg0[0 : i32] : !spv.array<4xf32> into !spv.struct<(!spv.array<4xf32>, f32)>
222   return %0: !spv.struct<(!spv.array<4xf32>, f32)>
225 // -----
227 func @composite_insert_coopmatrix(%arg0: !spv.coopmatrix<8x16xi32, Subgroup>, %arg1: i32) -> !spv.coopmatrix<8x16xi32, Subgroup> {
228   // CHECK: {{%.*}} = spv.CompositeInsert {{%.*}}, {{%.*}}[5 : i32] : i32 into !spv.coopmatrix<8x16xi32, Subgroup>
229   %0 = spv.CompositeInsert %arg1, %arg0[5 : i32] : i32 into !spv.coopmatrix<8x16xi32, Subgroup>
230   return %0: !spv.coopmatrix<8x16xi32, Subgroup>
233 // -----
235 func @composite_insert_no_indices(%arg0: !spv.array<4xf32>, %arg1: f32) -> !spv.array<4xf32> {
236   // expected-error @+1 {{expected at least one index}}
237   %0 = spv.CompositeInsert %arg1, %arg0[] : f32 into !spv.array<4xf32>
238   return %0: !spv.array<4xf32>
241 // -----
243 func @composite_insert_out_of_bounds(%arg0: !spv.array<4xf32>, %arg1: f32) -> !spv.array<4xf32> {
244   // expected-error @+1 {{index 4 out of bounds}}
245   %0 = spv.CompositeInsert %arg1, %arg0[4 : i32] : f32 into !spv.array<4xf32>
246   return %0: !spv.array<4xf32>
249 // -----
251 func @composite_insert_invalid_object_type(%arg0: !spv.array<4xf32>, %arg1: f64) -> !spv.array<4xf32> {
252   // expected-error @+1 {{object operand type should be 'f32', but found 'f64'}}
253   %0 = spv.CompositeInsert %arg1, %arg0[3 : i32] : f64 into !spv.array<4xf32>
254   return %0: !spv.array<4xf32>
257 // -----
259 func @composite_insert_invalid_result_type(%arg0: !spv.array<4xf32>, %arg1 : f32) -> !spv.array<4xf64> {
260   // expected-error @+1 {{result type should be the same as the composite type, but found '!spv.array<4 x f32>' vs '!spv.array<4 x f64>'}}
261   %0 = "spv.CompositeInsert"(%arg1, %arg0) {indices = [0: i32]} : (f32, !spv.array<4xf32>) -> !spv.array<4xf64>
262   return %0: !spv.array<4xf64>
265 // -----
267 //===----------------------------------------------------------------------===//
268 // spv.VectorExtractDynamic
269 //===----------------------------------------------------------------------===//
271 func @vector_dynamic_extract(%vec: vector<4xf32>, %id : i32) -> f32 {
272   // CHECK: spv.VectorExtractDynamic %{{.*}}[%{{.*}}] : vector<4xf32>, i32
273   %0 = spv.VectorExtractDynamic %vec[%id] : vector<4xf32>, i32
274   return %0 : f32
277 //===----------------------------------------------------------------------===//
278 // spv.VectorInsertDynamic
279 //===----------------------------------------------------------------------===//
281 func @vector_dynamic_insert(%val: f32, %vec: vector<4xf32>, %id : i32) -> vector<4xf32> {
282   // CHECK: spv.VectorInsertDynamic %{{.*}}, %{{.*}}[%{{.*}}] : vector<4xf32>, i32
283   %0 = spv.VectorInsertDynamic %val, %vec[%id] : vector<4xf32>, i32
284   return %0 : vector<4xf32>