2401 lines · plain
1// RUN: mlir-opt --convert-to-llvm="filter-dialects=vector" --split-input-file %s | FileCheck %s2// RUN: mlir-opt --convert-to-llvm="filter-dialects=vector allow-pattern-rollback=0" --split-input-file %s | FileCheck %s3// RUN: mlir-opt %s -convert-vector-to-llvm -split-input-file | FileCheck %s4 5//===========================================================================//6// Basic tests for Vector-to-LLVM conversion7//8// These examples are meant to be convertible to LLVM with:9// * `populateVectorToLLVMConversionPatterns`,10// i.e. no other patterns should be required.11//===========================================================================//12 13//===----------------------------------------------------------------------===//14// vector.bitcast15//===----------------------------------------------------------------------===//16 17func.func @bitcast_f32_to_i32_vector_0d(%arg0: vector<f32>) -> vector<i32> {18 %0 = vector.bitcast %arg0 : vector<f32> to vector<i32>19 return %0 : vector<i32>20}21 22// CHECK-LABEL: @bitcast_f32_to_i32_vector_0d23// CHECK-SAME: %[[ARG_0:.*]]: vector<f32>24// CHECK: %[[VEC_F32_1D:.*]] = builtin.unrealized_conversion_cast %[[ARG_0]] : vector<f32> to vector<1xf32>25// CHECK: %[[VEC_I32_1D:.*]] = llvm.bitcast %[[VEC_F32_1D]] : vector<1xf32> to vector<1xi32>26// CHECK: %[[VEC_I32_0D:.*]] = builtin.unrealized_conversion_cast %[[VEC_I32_1D]] : vector<1xi32> to vector<i32>27// CHECK: return %[[VEC_I32_0D]] : vector<i32>28 29// -----30 31func.func @bitcast_f32_to_i32_vector(%arg0: vector<16xf32>) -> vector<16xi32> {32 %0 = vector.bitcast %arg0 : vector<16xf32> to vector<16xi32>33 return %0 : vector<16xi32>34}35 36 37// CHECK-LABEL: @bitcast_f32_to_i32_vector38// CHECK-SAME: %[[ARG_0:.*]]: vector<16xf32>39// CHECK: llvm.bitcast %[[ARG_0]] : vector<16xf32> to vector<16xi32>40 41// -----42 43func.func @bitcast_f32_to_i32_vector_scalable(%arg0: vector<[16]xf32>) -> vector<[16]xi32> {44 %0 = vector.bitcast %arg0 : vector<[16]xf32> to vector<[16]xi32>45 return %0 : vector<[16]xi32>46}47 48// CHECK-LABEL: @bitcast_f32_to_i32_vector_scalable49// CHECK-SAME: %[[ARG_0:.*]]: vector<[16]xf32>50// CHECK: llvm.bitcast %[[ARG_0]] : vector<[16]xf32> to vector<[16]xi32>51 52// -----53 54func.func @bitcast_i8_to_f32_vector(%arg0: vector<64xi8>) -> vector<16xf32> {55 %0 = vector.bitcast %arg0 : vector<64xi8> to vector<16xf32>56 return %0 : vector<16xf32>57}58 59// CHECK-LABEL: @bitcast_i8_to_f32_vector60// CHECK-SAME: %[[ARG_0:.*]]: vector<64xi8>61// CHECK: llvm.bitcast %[[ARG_0]] : vector<64xi8> to vector<16xf32>62 63// -----64 65func.func @bitcast_i8_to_f32_vector_scalable(%arg0: vector<[64]xi8>) -> vector<[16]xf32> {66 %0 = vector.bitcast %arg0 : vector<[64]xi8> to vector<[16]xf32>67 return %0 : vector<[16]xf32>68}69 70// CHECK-LABEL: @bitcast_i8_to_f32_vector_scalable71// CHECK-SAME: %[[ARG_0:.*]]: vector<[64]xi8>72// CHECK: llvm.bitcast %[[ARG_0]] : vector<[64]xi8> to vector<[16]xf32>73 74// -----75 76func.func @bitcast_index_to_i8_vector(%arg0: vector<16xindex>) -> vector<128xi8> {77 %0 = vector.bitcast %arg0 : vector<16xindex> to vector<128xi8>78 return %0 : vector<128xi8>79}80 81// CHECK-LABEL: @bitcast_index_to_i8_vector82// CHECK-SAME: %[[ARG_0:.*]]: vector<16xindex>83// CHECK: %[[T0:.*]] = builtin.unrealized_conversion_cast %[[ARG_0]] : vector<16xindex> to vector<16xi64>84// CHECK: llvm.bitcast %[[T0]] : vector<16xi64> to vector<128xi8>85 86// -----87 88func.func @bitcast_index_to_i8_vector_scalable(%arg0: vector<[16]xindex>) -> vector<[128]xi8> {89 %0 = vector.bitcast %arg0 : vector<[16]xindex> to vector<[128]xi8>90 return %0 : vector<[128]xi8>91}92 93// CHECK-LABEL: @bitcast_index_to_i8_vector_scalable94// CHECK-SAME: %[[ARG_0:.*]]: vector<[16]xindex>95// CHECK: %[[T0:.*]] = builtin.unrealized_conversion_cast %[[ARG_0]] : vector<[16]xindex> to vector<[16]xi64>96// CHECK: llvm.bitcast %[[T0]] : vector<[16]xi64> to vector<[128]xi8>97 98// -----99 100//===----------------------------------------------------------------------===//101// vector.broadcast102//===----------------------------------------------------------------------===//103 104func.func @broadcast_vec0d_from_vec0d(%arg0: vector<f32>) -> vector<f32> {105 %0 = vector.broadcast %arg0 : vector<f32> to vector<f32>106 return %0 : vector<f32>107}108// CHECK-LABEL: @broadcast_vec0d_from_vec0d(109// CHECK-SAME: %[[A:.*]]: vector<f32>)110// CHECK: return %[[A]] : vector<f32>111 112// -----113 114func.func @broadcast_vec1d_from_vec1d(%arg0: vector<2xf32>) -> vector<2xf32> {115 %0 = vector.broadcast %arg0 : vector<2xf32> to vector<2xf32>116 return %0 : vector<2xf32>117}118// CHECK-LABEL: @broadcast_vec1d_from_vec1d(119// CHECK-SAME: %[[A:.*]]: vector<2xf32>)120// CHECK: return %[[A]] : vector<2xf32>121 122// -----123 124func.func @broadcast_vec1d_from_vec1d_scalable(%arg0: vector<[2]xf32>) -> vector<[2]xf32> {125 %0 = vector.broadcast %arg0 : vector<[2]xf32> to vector<[2]xf32>126 return %0 : vector<[2]xf32>127}128// CHECK-LABEL: @broadcast_vec1d_from_vec1d_scalable(129// CHECK-SAME: %[[A:.*]]: vector<[2]xf32>)130// CHECK: return %[[A]] : vector<[2]xf32>131 132// -----133 134// CHECK-LABEL: @broadcast_vec0d_from_scalar135// CHECK-SAME: %[[ELT:.*]]: f32136func.func @broadcast_vec0d_from_scalar(%elt: f32) -> vector<f32> {137 %v = vector.broadcast %elt : f32 to vector<f32>138 return %v : vector<f32>139}140// CHECK-NEXT: %[[UNDEF:[0-9]+]] = llvm.mlir.poison : vector<1xf32>141// CHECK-NEXT: %[[ZERO:[0-9]+]] = llvm.mlir.constant(0 : i32) : i32142// CHECK-NEXT: %[[V:[0-9]+]] = llvm.insertelement %[[ELT]], %[[UNDEF]][%[[ZERO]] : i32] : vector<1xf32>143// CHECK-NEXT: %[[VCAST:[0-9]+]] = builtin.unrealized_conversion_cast %[[V]] : vector<1xf32> to vector<f32>144// CHECK-NEXT: return %[[VCAST]] : vector<f32>145 146// -----147 148// CHECK-LABEL: @broadcast_vec1d_from_scalar149// CHECK-SAME: %[[VEC:[0-9a-zA-Z]+]]: vector<4xf32>150// CHECK-SAME: %[[ELT:[0-9a-zA-Z]+]]: f32151func.func @broadcast_vec1d_from_scalar(%vec: vector<4xf32>, %elt: f32) -> vector<4xf32> {152 %vb = vector.broadcast %elt : f32 to vector<4xf32>153 return %vb : vector<4xf32>154}155// CHECK-NEXT: %[[UNDEF:[0-9]+]] = llvm.mlir.poison : vector<4xf32>156// CHECK-NEXT: %[[ZERO:[0-9]+]] = llvm.mlir.constant(0 : i32) : i32157// CHECK-NEXT: %[[V:[0-9]+]] = llvm.insertelement %[[ELT]], %[[UNDEF]][%[[ZERO]] : i32] : vector<4xf32>158// CHECK-NEXT: %[[SPLAT:[0-9]+]] = llvm.shufflevector %[[V]], %[[UNDEF]] [0, 0, 0, 0]159// CHECK-NEXT: return %[[SPLAT]] : vector<4xf32>160 161// -----162 163// CHECK-LABEL: @broadcast_scalable_vec1d_from_scalar164// CHECK-SAME: %[[VEC:[0-9a-zA-Z]+]]: vector<[4]xf32>165// CHECK-SAME: %[[ELT:[0-9a-zA-Z]+]]: f32166func.func @broadcast_scalable_vec1d_from_scalar(%vec: vector<[4]xf32>, %elt: f32) -> vector<[4]xf32> {167 %vb = vector.broadcast %elt : f32 to vector<[4]xf32>168 return %vb : vector<[4]xf32>169}170// CHECK-NEXT: %[[UNDEF:[0-9]+]] = llvm.mlir.poison : vector<[4]xf32>171// CHECK-NEXT: %[[ZERO:[0-9]+]] = llvm.mlir.constant(0 : i32) : i32172// CHECK-NEXT: %[[V:[0-9]+]] = llvm.insertelement %[[ELT]], %[[UNDEF]][%[[ZERO]] : i32] : vector<[4]xf32>173// CHECK-NEXT: %[[SPLAT:[0-9]+]] = llvm.shufflevector %[[V]], %[[UNDEF]] [0, 0, 0, 0]174// CHECK-NEXT: return %[[SPLAT]] : vector<[4]xf32>175 176//===----------------------------------------------------------------------===//177// vector.shuffle178//===----------------------------------------------------------------------===//179 180func.func @shuffle_0D_direct(%arg0: vector<f32>) -> vector<3xf32> {181 %1 = vector.shuffle %arg0, %arg0 [0, 1, 0] : vector<f32>, vector<f32>182 return %1 : vector<3xf32>183}184// CHECK-LABEL: @shuffle_0D_direct(185// CHECK-SAME: %[[A:.*]]: vector<f32>186// CHECK: %[[s:.*]] = llvm.shufflevector %{{.*}}, %{{.*}} [0, 1, 0] : vector<1xf32>187// CHECK: return %[[s]] : vector<3xf32>188 189// -----190 191func.func @shuffle_1D_direct(%arg0: vector<2xf32>, %arg1: vector<2xf32>) -> vector<2xf32> {192 %1 = vector.shuffle %arg0, %arg1 [0, 1] : vector<2xf32>, vector<2xf32>193 return %1 : vector<2xf32>194}195// CHECK-LABEL: @shuffle_1D_direct(196// CHECK-SAME: %[[A:.*]]: vector<2xf32>,197// CHECK-SAME: %[[B:.*]]: vector<2xf32>)198// CHECK: return %[[A:.*]]: vector<2xf32>199 200// -----201 202func.func @shuffle_1D_index_direct(%arg0: vector<2xindex>, %arg1: vector<2xindex>) -> vector<2xindex> {203 %1 = vector.shuffle %arg0, %arg1 [0, 1] : vector<2xindex>, vector<2xindex>204 return %1 : vector<2xindex>205}206// CHECK-LABEL: @shuffle_1D_index_direct(207// CHECK-SAME: %[[A:.*]]: vector<2xindex>,208// CHECK-SAME: %[[B:.*]]: vector<2xindex>)209// CHECK: return %[[A:.*]]: vector<2xindex>210 211// -----212 213func.func @shuffle_poison_mask(%arg0: vector<2xf32>, %arg1: vector<2xf32>) -> vector<4xf32> {214 %1 = vector.shuffle %arg0, %arg1 [0, -1, 3, -1] : vector<2xf32>, vector<2xf32>215 return %1 : vector<4xf32>216}217// CHECK-LABEL: @shuffle_poison_mask(218// CHECK-SAME: %[[A:.*]]: vector<2xf32>, %[[B:.*]]: vector<2xf32>)219// CHECK: %[[s:.*]] = llvm.shufflevector %[[A]], %[[B]] [0, -1, 3, -1] : vector<2xf32>220 221// -----222 223func.func @shuffle_1D(%arg0: vector<2xf32>, %arg1: vector<3xf32>) -> vector<5xf32> {224 %1 = vector.shuffle %arg0, %arg1 [4, 3, 2, 1, 0] : vector<2xf32>, vector<3xf32>225 return %1 : vector<5xf32>226}227// CHECK-LABEL: @shuffle_1D(228// CHECK-SAME: %[[A:.*]]: vector<2xf32>,229// CHECK-SAME: %[[B:.*]]: vector<3xf32>)230// CHECK: %[[U0:.*]] = llvm.mlir.poison : vector<5xf32>231// CHECK: %[[C2:.*]] = llvm.mlir.constant(2 : index) : i64232// CHECK: %[[E1:.*]] = llvm.extractelement %[[B]][%[[C2]] : i64] : vector<3xf32>233// CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : index) : i64234// CHECK: %[[I1:.*]] = llvm.insertelement %[[E1]], %[[U0]][%[[C0]] : i64] : vector<5xf32>235// CHECK: %[[C1:.*]] = llvm.mlir.constant(1 : index) : i64236// CHECK: %[[E2:.*]] = llvm.extractelement %[[B]][%[[C1]] : i64] : vector<3xf32>237// CHECK: %[[C1:.*]] = llvm.mlir.constant(1 : index) : i64238// CHECK: %[[I2:.*]] = llvm.insertelement %[[E2]], %[[I1]][%[[C1]] : i64] : vector<5xf32>239// CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : index) : i64240// CHECK: %[[E3:.*]] = llvm.extractelement %[[B]][%[[C0]] : i64] : vector<3xf32>241// CHECK: %[[C2:.*]] = llvm.mlir.constant(2 : index) : i64242// CHECK: %[[I3:.*]] = llvm.insertelement %[[E3]], %[[I2]][%[[C2]] : i64] : vector<5xf32>243// CHECK: %[[C1:.*]] = llvm.mlir.constant(1 : index) : i64244// CHECK: %[[E4:.*]] = llvm.extractelement %[[A]][%[[C1]] : i64] : vector<2xf32>245// CHECK: %[[C3:.*]] = llvm.mlir.constant(3 : index) : i64246// CHECK: %[[I4:.*]] = llvm.insertelement %[[E4]], %[[I3]][%[[C3]] : i64] : vector<5xf32>247// CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : index) : i64248// CHECK: %[[E5:.*]] = llvm.extractelement %[[A]][%[[C0]] : i64] : vector<2xf32>249// CHECK: %[[C4:.*]] = llvm.mlir.constant(4 : index) : i64250// CHECK: %[[I5:.*]] = llvm.insertelement %[[E5]], %[[I4]][%[[C4]] : i64] : vector<5xf32>251// CHECK: return %[[I5]] : vector<5xf32>252 253// -----254 255func.func @shuffle_2D(%a: vector<1x4xf32>, %b: vector<2x4xf32>) -> vector<3x4xf32> {256 %1 = vector.shuffle %a, %b[1, 0, 2] : vector<1x4xf32>, vector<2x4xf32>257 return %1 : vector<3x4xf32>258}259// CHECK-LABEL: @shuffle_2D(260// CHECK-SAME: %[[A:.*]]: vector<1x4xf32>,261// CHECK-SAME: %[[B:.*]]: vector<2x4xf32>)262// CHECK-DAG: %[[VAL_0:.*]] = builtin.unrealized_conversion_cast %[[A]] : vector<1x4xf32> to !llvm.array<1 x vector<4xf32>>263// CHECK-DAG: %[[VAL_1:.*]] = builtin.unrealized_conversion_cast %[[B]] : vector<2x4xf32> to !llvm.array<2 x vector<4xf32>>264// CHECK: %[[U0:.*]] = llvm.mlir.poison : !llvm.array<3 x vector<4xf32>>265// CHECK: %[[E1:.*]] = llvm.extractvalue %[[VAL_1]][0] : !llvm.array<2 x vector<4xf32>>266// CHECK: %[[I1:.*]] = llvm.insertvalue %[[E1]], %[[U0]][0] : !llvm.array<3 x vector<4xf32>>267// CHECK: %[[E2:.*]] = llvm.extractvalue %[[VAL_0]][0] : !llvm.array<1 x vector<4xf32>>268// CHECK: %[[I2:.*]] = llvm.insertvalue %[[E2]], %[[I1]][1] : !llvm.array<3 x vector<4xf32>>269// CHECK: %[[E3:.*]] = llvm.extractvalue %[[VAL_1]][1] : !llvm.array<2 x vector<4xf32>>270// CHECK: %[[I3:.*]] = llvm.insertvalue %[[E3]], %[[I2]][2] : !llvm.array<3 x vector<4xf32>>271// CHECK: %[[VAL_3:.*]] = builtin.unrealized_conversion_cast %[[I3]] : !llvm.array<3 x vector<4xf32>> to vector<3x4xf32>272// CHECK: return %[[VAL_3]] : vector<3x4xf32>273 274// -----275 276//===----------------------------------------------------------------------===//277// vector.extract278//===----------------------------------------------------------------------===//279 280func.func @extract_scalar_from_vec_1d_f32(%arg0: vector<16xf32>) -> f32 {281 %0 = vector.extract %arg0[15]: f32 from vector<16xf32>282 return %0 : f32283}284// CHECK-LABEL: @extract_scalar_from_vec_1d_f32285// CHECK: llvm.mlir.constant(15 : i64) : i64286// CHECK: llvm.extractelement {{.*}}[{{.*}} : i64] : vector<16xf32>287// CHECK: return {{.*}} : f32288 289 290// -----291 292func.func @extract_scalar_from_vec_1d_f32_scalable(%arg0: vector<[16]xf32>) -> f32 {293 %0 = vector.extract %arg0[15]: f32 from vector<[16]xf32>294 return %0 : f32295}296// CHECK-LABEL: @extract_scalar_from_vec_1d_f32_scalable297// CHECK: llvm.mlir.constant(15 : i64) : i64298// CHECK: llvm.extractelement {{.*}}[{{.*}} : i64] : vector<[16]xf32>299// CHECK: return {{.*}} : f32300 301// -----302 303func.func @extract_vec_1e_from_vec_1d_f32(%arg0: vector<16xf32>) -> vector<1xf32> {304 %0 = vector.extract %arg0[15]: vector<1xf32> from vector<16xf32>305 return %0 : vector<1xf32>306}307// CHECK-LABEL: @extract_vec_1e_from_vec_1d_f32(308// CHECK-SAME: %[[A:.*]]: vector<16xf32>)309// CHECK: %[[T0:.*]] = llvm.mlir.constant(15 : i64) : i64310// CHECK: %[[T1:.*]] = llvm.extractelement %[[A]][%[[T0]] : i64] : vector<16xf32>311// CHECK: %[[T2:.*]] = builtin.unrealized_conversion_cast %[[T1]] : f32 to vector<1xf32>312// CHECK: return %[[T2]] : vector<1xf32>313 314// -----315 316func.func @extract_vec_1e_from_vec_1d_f32_scalable(%arg0: vector<[16]xf32>) -> vector<1xf32> {317 %0 = vector.extract %arg0[15]: vector<1xf32> from vector<[16]xf32>318 return %0 : vector<1xf32>319}320// CHECK-LABEL: @extract_vec_1e_from_vec_1d_f32_scalable(321// CHECK-SAME: %[[A:.*]]: vector<[16]xf32>)322// CHECK: %[[T0:.*]] = llvm.mlir.constant(15 : i64) : i64323// CHECK: %[[T1:.*]] = llvm.extractelement %[[A]][%[[T0]] : i64] : vector<[16]xf32>324// CHECK: %[[T2:.*]] = builtin.unrealized_conversion_cast %[[T1]] : f32 to vector<1xf32>325// CHECK: return %[[T2]] : vector<1xf32>326 327// -----328 329func.func @extract_scalar_from_vec_1d_index(%arg0: vector<16xindex>) -> index {330 %0 = vector.extract %arg0[15]: index from vector<16xindex>331 return %0 : index332}333// CHECK-LABEL: @extract_scalar_from_vec_1d_index(334// CHECK-SAME: %[[A:.*]]: vector<16xindex>)335// CHECK: %[[T0:.*]] = builtin.unrealized_conversion_cast %[[A]] : vector<16xindex> to vector<16xi64>336// CHECK: %[[T1:.*]] = llvm.mlir.constant(15 : i64) : i64337// CHECK: %[[T2:.*]] = llvm.extractelement %[[T0]][%[[T1]] : i64] : vector<16xi64>338// CHECK: %[[T3:.*]] = builtin.unrealized_conversion_cast %[[T2]] : i64 to index339// CHECK: return %[[T3]] : index340 341// -----342 343func.func @extract_scalar_from_vec_1d_index_scalable(%arg0: vector<[16]xindex>) -> index {344 %0 = vector.extract %arg0[15]: index from vector<[16]xindex>345 return %0 : index346}347// CHECK-LABEL: @extract_scalar_from_vec_1d_index_scalable(348// CHECK-SAME: %[[A:.*]]: vector<[16]xindex>)349// CHECK: %[[T0:.*]] = builtin.unrealized_conversion_cast %[[A]] : vector<[16]xindex> to vector<[16]xi64>350// CHECK: %[[T1:.*]] = llvm.mlir.constant(15 : i64) : i64351// CHECK: %[[T2:.*]] = llvm.extractelement %[[T0]][%[[T1]] : i64] : vector<[16]xi64>352// CHECK: %[[T3:.*]] = builtin.unrealized_conversion_cast %[[T2]] : i64 to index353// CHECK: return %[[T3]] : index354 355// -----356 357func.func @extract_vec_2d_from_vec_3d_f32(%arg0: vector<4x3x16xf32>) -> vector<3x16xf32> {358 %0 = vector.extract %arg0[0]: vector<3x16xf32> from vector<4x3x16xf32>359 return %0 : vector<3x16xf32>360}361// CHECK-LABEL: @extract_vec_2d_from_vec_3d_f32362// CHECK: llvm.extractvalue {{.*}}[0] : !llvm.array<4 x array<3 x vector<16xf32>>>363// CHECK: return {{.*}} : vector<3x16xf32>364 365 366// -----367 368func.func @extract_vec_2d_from_vec_3d_f32_scalable(%arg0: vector<4x3x[16]xf32>) -> vector<3x[16]xf32> {369 %0 = vector.extract %arg0[0]: vector<3x[16]xf32> from vector<4x3x[16]xf32>370 return %0 : vector<3x[16]xf32>371}372// CHECK-LABEL: @extract_vec_2d_from_vec_3d_f32_scalable373// CHECK: llvm.extractvalue {{.*}}[0] : !llvm.array<4 x array<3 x vector<[16]xf32>>>374// CHECK: return {{.*}} : vector<3x[16]xf32>375 376// -----377 378func.func @extract_vec_1d_from_vec_3d_f32(%arg0: vector<4x3x16xf32>) -> vector<16xf32> {379 %0 = vector.extract %arg0[0, 0]: vector<16xf32> from vector<4x3x16xf32>380 return %0 : vector<16xf32>381}382// CHECK-LABEL: @extract_vec_1d_from_vec_3d_f32383// CHECK: llvm.extractvalue {{.*}}[0, 0] : !llvm.array<4 x array<3 x vector<16xf32>>>384// CHECK: return {{.*}} : vector<16xf32>385 386// -----387 388func.func @extract_vec_1d_from_vec_3d_f32_scalable(%arg0: vector<4x3x[16]xf32>) -> vector<[16]xf32> {389 %0 = vector.extract %arg0[0, 0]: vector<[16]xf32> from vector<4x3x[16]xf32>390 return %0 : vector<[16]xf32>391}392// CHECK-LABEL: @extract_vec_1d_from_vec_3d_f32_scalable393// CHECK: llvm.extractvalue {{.*}}[0, 0] : !llvm.array<4 x array<3 x vector<[16]xf32>>>394// CHECK: return {{.*}} : vector<[16]xf32>395 396// -----397 398func.func @extract_scalar_from_vec_3d_f32(%arg0: vector<4x3x16xf32>) -> f32 {399 %0 = vector.extract %arg0[0, 0, 0]: f32 from vector<4x3x16xf32>400 return %0 : f32401}402// CHECK-LABEL: @extract_scalar_from_vec_3d_f32403// CHECK: llvm.extractvalue {{.*}}[0, 0] : !llvm.array<4 x array<3 x vector<16xf32>>>404// CHECK: llvm.mlir.constant(0 : i64) : i64405// CHECK: llvm.extractelement {{.*}}[{{.*}} : i64] : vector<16xf32>406// CHECK: return {{.*}} : f32407 408// -----409 410func.func @extract_scalar_from_vec_3d_f32_scalable(%arg0: vector<4x3x[16]xf32>) -> f32 {411 %0 = vector.extract %arg0[0, 0, 0]: f32 from vector<4x3x[16]xf32>412 return %0 : f32413}414// CHECK-LABEL: @extract_scalar_from_vec_3d_f32_scalable415// CHECK: llvm.extractvalue {{.*}}[0, 0] : !llvm.array<4 x array<3 x vector<[16]xf32>>>416// CHECK: llvm.mlir.constant(0 : i64) : i64417// CHECK: llvm.extractelement {{.*}}[{{.*}} : i64] : vector<[16]xf32>418// CHECK: return {{.*}} : f32419 420// -----421 422func.func @extract_scalar_from_vec_1d_f32_dynamic_idx(%arg0: vector<16xf32>, %arg1: index) -> f32 {423 %0 = vector.extract %arg0[%arg1]: f32 from vector<16xf32>424 return %0 : f32425}426// CHECK-LABEL: @extract_scalar_from_vec_1d_f32_dynamic_idx427// CHECK-SAME: %[[VEC:.+]]: vector<16xf32>, %[[INDEX:.+]]: index428// CHECK: %[[UC:.+]] = builtin.unrealized_conversion_cast %[[INDEX]] : index to i64429// CHECK: llvm.extractelement %[[VEC]][%[[UC]] : i64] : vector<16xf32>430 431// -----432 433func.func @extract_scalar_from_vec_1d_f32_dynamic_idx_scalable(%arg0: vector<[16]xf32>, %arg1: index) -> f32 {434 %0 = vector.extract %arg0[%arg1]: f32 from vector<[16]xf32>435 return %0 : f32436}437// CHECK-LABEL: @extract_scalar_from_vec_1d_f32_dynamic_idx_scalable438// CHECK-SAME: %[[VEC:.+]]: vector<[16]xf32>, %[[INDEX:.+]]: index439// CHECK: %[[UC:.+]] = builtin.unrealized_conversion_cast %[[INDEX]] : index to i64440// CHECK: llvm.extractelement %[[VEC]][%[[UC]] : i64] : vector<[16]xf32>441 442// -----443 444func.func @extract_scalar_from_vec_2d_f32_inner_dynamic_idx(%arg0: vector<1x16xf32>, %arg1: index) -> f32 {445 %0 = vector.extract %arg0[0, %arg1]: f32 from vector<1x16xf32>446 return %0 : f32447}448 449// Lowering supports extracting from multi-dim vectors with dynamic indices450// provided that only the trailing index is dynamic.451 452// CHECK-LABEL: @extract_scalar_from_vec_2d_f32_inner_dynamic_idx(453// CHECK: llvm.extractvalue454// CHECK: llvm.extractelement455 456func.func @extract_scalar_from_vec_2d_f32_inner_dynamic_idx_scalable(%arg0: vector<1x[16]xf32>, %arg1: index) -> f32 {457 %0 = vector.extract %arg0[0, %arg1]: f32 from vector<1x[16]xf32>458 return %0 : f32459}460 461// Lowering supports extracting from multi-dim vectors with dynamic indices462// provided that only the trailing index is dynamic.463 464// CHECK-LABEL: @extract_scalar_from_vec_2d_f32_inner_dynamic_idx_scalable(465// CHECK: llvm.extractvalue466// CHECK: llvm.extractelement467 468// -----469 470func.func @extract_scalar_from_vec_2d_f32_outer_dynamic_idx(%arg0: vector<1x16xf32>, %arg1: index) -> f32 {471 %0 = vector.extract %arg0[%arg1, 0]: f32 from vector<1x16xf32>472 return %0 : f32473}474 475// Lowering supports extracting from multi-dim vectors with dynamic indices476// provided that only the trailing index is dynamic.477 478// CHECK-LABEL: @extract_scalar_from_vec_2d_f32_outer_dynamic_idx(479// CHECK: vector.extract480 481func.func @extract_scalar_from_vec_2d_f32_outer_dynamic_idx_scalable(%arg0: vector<1x[16]xf32>, %arg1: index) -> f32 {482 %0 = vector.extract %arg0[%arg1, 0]: f32 from vector<1x[16]xf32>483 return %0 : f32484}485 486// Lowering does not support extracting from multi-dim vectors with non trailing487// dynamic index, but it shouldn't crash.488 489// CHECK-LABEL: @extract_scalar_from_vec_2d_f32_outer_dynamic_idx_scalable(490// CHECK: vector.extract491 492// -----493 494func.func @extract_scalar_from_vec_0d_index(%arg0: vector<index>) -> index {495 %0 = vector.extract %arg0[]: index from vector<index>496 return %0 : index497}498// CHECK-LABEL: @extract_scalar_from_vec_0d_index(499// CHECK-SAME: %[[A:.*]]: vector<index>)500// CHECK: %[[T0:.*]] = builtin.unrealized_conversion_cast %[[A]] : vector<index> to vector<1xi64>501// CHECK: %[[T1:.*]] = llvm.mlir.constant(0 : i64) : i64502// CHECK: %[[T2:.*]] = llvm.extractelement %[[T0]][%[[T1]] : i64] : vector<1xi64>503// CHECK: %[[T3:.*]] = builtin.unrealized_conversion_cast %[[T2]] : i64 to index504// CHECK: return %[[T3]] : index505 506// -----507 508func.func @extract_scalar_from_vec_2d_f32_dynamic_idxs_compile_time_const(%arg : vector<32x1xf32>) -> f32 {509 %0 = arith.constant 0 : index510 %1 = vector.extract %arg[%0, %0] : f32 from vector<32x1xf32>511 return %1 : f32512}513 514// At compile time, since the indices of extractOp are constants,515// they will be collapsed and folded away; therefore, the lowering works.516 517// CHECK-LABEL: @extract_scalar_from_vec_2d_f32_dynamic_idxs_compile_time_const518// CHECK-SAME: %[[ARG:.*]]: vector<32x1xf32>) -> f32 {519// CHECK: %[[CAST:.*]] = builtin.unrealized_conversion_cast %[[ARG]] : vector<32x1xf32> to !llvm.array<32 x vector<1xf32>>520// CHECK: %[[VEC_0:.*]] = llvm.extractvalue %[[CAST]][0] : !llvm.array<32 x vector<1xf32>>521// CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : i64) : i64522// CHECK: %[[RES:.*]] = llvm.extractelement %[[VEC_0]]{{\[}}%[[C0]] : i64] : vector<1xf32>523// CHECK: return %[[RES]] : f32524 525// -----526 527//===----------------------------------------------------------------------===//528// vector.insert529//===----------------------------------------------------------------------===//530 531func.func @insert_scalar_into_vec_0d(%src: f32, %dst: vector<f32>) -> vector<f32> {532 %0 = vector.insert %src, %dst[] : f32 into vector<f32>533 return %0 : vector<f32>534}535 536// CHECK-LABEL: @insert_scalar_into_vec_0d537// CHECK: llvm.insertelement {{.*}} : vector<1xf32>538 539// -----540 541func.func @insert_scalar_into_vec_1d_f32(%arg0: f32, %arg1: vector<4xf32>) -> vector<4xf32> {542 %0 = vector.insert %arg0, %arg1[3] : f32 into vector<4xf32>543 return %0 : vector<4xf32>544}545// CHECK-LABEL: @insert_scalar_into_vec_1d_f32546// CHECK: llvm.mlir.constant(3 : i64) : i64547// CHECK: llvm.insertelement {{.*}}, {{.*}}[{{.*}} : i64] : vector<4xf32>548// CHECK: return {{.*}} : vector<4xf32>549 550// -----551 552func.func @insert_scalar_into_vec_1d_f32_scalable(%arg0: f32, %arg1: vector<[4]xf32>) -> vector<[4]xf32> {553 %0 = vector.insert %arg0, %arg1[3] : f32 into vector<[4]xf32>554 return %0 : vector<[4]xf32>555}556// CHECK-LABEL: @insert_scalar_into_vec_1d_f32_scalable557// CHECK: llvm.mlir.constant(3 : i64) : i64558// CHECK: llvm.insertelement {{.*}}, {{.*}}[{{.*}} : i64] : vector<[4]xf32>559// CHECK: return {{.*}} : vector<[4]xf32>560 561// -----562 563func.func @insert_scalar_into_vec_1d_index(%arg0: index, %arg1: vector<4xindex>) -> vector<4xindex> {564 %0 = vector.insert %arg0, %arg1[3] : index into vector<4xindex>565 return %0 : vector<4xindex>566}567// CHECK-LABEL: @insert_scalar_into_vec_1d_index(568// CHECK-SAME: %[[A:.*]]: index,569// CHECK-SAME: %[[B:.*]]: vector<4xindex>)570// CHECK-DAG: %[[T0:.*]] = builtin.unrealized_conversion_cast %[[A]] : index to i64571// CHECK-DAG: %[[T1:.*]] = builtin.unrealized_conversion_cast %[[B]] : vector<4xindex> to vector<4xi64>572// CHECK: %[[T3:.*]] = llvm.mlir.constant(3 : i64) : i64573// CHECK: %[[T4:.*]] = llvm.insertelement %[[T0]], %[[T1]][%[[T3]] : i64] : vector<4xi64>574// CHECK: %[[T5:.*]] = builtin.unrealized_conversion_cast %[[T4]] : vector<4xi64> to vector<4xindex>575// CHECK: return %[[T5]] : vector<4xindex>576 577// -----578 579func.func @insert_scalar_into_vec_1d_index_scalable(%arg0: index, %arg1: vector<[4]xindex>) -> vector<[4]xindex> {580 %0 = vector.insert %arg0, %arg1[3] : index into vector<[4]xindex>581 return %0 : vector<[4]xindex>582}583// CHECK-LABEL: @insert_scalar_into_vec_1d_index_scalable(584// CHECK-SAME: %[[A:.*]]: index,585// CHECK-SAME: %[[B:.*]]: vector<[4]xindex>)586// CHECK-DAG: %[[T0:.*]] = builtin.unrealized_conversion_cast %[[A]] : index to i64587// CHECK-DAG: %[[T1:.*]] = builtin.unrealized_conversion_cast %[[B]] : vector<[4]xindex> to vector<[4]xi64>588// CHECK: %[[T3:.*]] = llvm.mlir.constant(3 : i64) : i64589// CHECK: %[[T4:.*]] = llvm.insertelement %[[T0]], %[[T1]][%[[T3]] : i64] : vector<[4]xi64>590// CHECK: %[[T5:.*]] = builtin.unrealized_conversion_cast %[[T4]] : vector<[4]xi64> to vector<[4]xindex>591// CHECK: return %[[T5]] : vector<[4]xindex>592 593// -----594 595func.func @insert_vec_2d_into_vec_3d_f32(%arg0: vector<8x16xf32>, %arg1: vector<4x8x16xf32>) -> vector<4x8x16xf32> {596 %0 = vector.insert %arg0, %arg1[3] : vector<8x16xf32> into vector<4x8x16xf32>597 return %0 : vector<4x8x16xf32>598}599// CHECK-LABEL: @insert_vec_2d_into_vec_3d_f32600// CHECK: llvm.insertvalue {{.*}}, {{.*}}[3] : !llvm.array<4 x array<8 x vector<16xf32>>>601// CHECK: return {{.*}} : vector<4x8x16xf32>602 603// -----604 605func.func @insert_vec_2d_into_vec_3d_f32_scalable(%arg0: vector<8x[16]xf32>, %arg1: vector<4x8x[16]xf32>) -> vector<4x8x[16]xf32> {606 %0 = vector.insert %arg0, %arg1[3] : vector<8x[16]xf32> into vector<4x8x[16]xf32>607 return %0 : vector<4x8x[16]xf32>608}609// CHECK-LABEL: @insert_vec_2d_into_vec_3d_f32_scalable610// CHECK: llvm.insertvalue {{.*}}, {{.*}}[3] : !llvm.array<4 x array<8 x vector<[16]xf32>>>611// CHECK: return {{.*}} : vector<4x8x[16]xf32>612 613// -----614 615func.func @insert_vec_1d_into_vec_3d_f32(%arg0: vector<16xf32>, %arg1: vector<4x8x16xf32>) -> vector<4x8x16xf32> {616 %0 = vector.insert %arg0, %arg1[3, 7] : vector<16xf32> into vector<4x8x16xf32>617 return %0 : vector<4x8x16xf32>618}619// CHECK-LABEL: @insert_vec_1d_into_vec_3d_f32620// CHECK: llvm.insertvalue {{.*}}, {{.*}}[3, 7] : !llvm.array<4 x array<8 x vector<16xf32>>>621// CHECK: return {{.*}} : vector<4x8x16xf32>622 623// -----624 625func.func @insert_vec_1d_into_vec_3d_f32_scalable(%arg0: vector<[16]xf32>, %arg1: vector<4x8x[16]xf32>) -> vector<4x8x[16]xf32> {626 %0 = vector.insert %arg0, %arg1[3, 7] : vector<[16]xf32> into vector<4x8x[16]xf32>627 return %0 : vector<4x8x[16]xf32>628}629// CHECK-LABEL: @insert_vec_1d_into_vec_3d_f32_scalable630// CHECK: llvm.insertvalue {{.*}}, {{.*}}[3, 7] : !llvm.array<4 x array<8 x vector<[16]xf32>>>631// CHECK: return {{.*}} : vector<4x8x[16]xf32>632 633// -----634 635func.func @insert_scalar_into_vec_3d_f32(%arg0: f32, %arg1: vector<4x8x16xf32>) -> vector<4x8x16xf32> {636 %0 = vector.insert %arg0, %arg1[3, 7, 15] : f32 into vector<4x8x16xf32>637 return %0 : vector<4x8x16xf32>638}639// CHECK-LABEL: @insert_scalar_into_vec_3d_f32640// CHECK: llvm.extractvalue {{.*}}[3, 7] : !llvm.array<4 x array<8 x vector<16xf32>>>641// CHECK: llvm.mlir.constant(15 : i64) : i64642// CHECK: llvm.insertelement {{.*}}, {{.*}}[{{.*}} : i64] : vector<16xf32>643// CHECK: llvm.insertvalue {{.*}}, {{.*}}[3, 7] : !llvm.array<4 x array<8 x vector<16xf32>>>644// CHECK: return {{.*}} : vector<4x8x16xf32>645 646// -----647 648func.func @insert_scalar_into_vec_3d_f32_scalable(%arg0: f32, %arg1: vector<4x8x[16]xf32>) -> vector<4x8x[16]xf32> {649 %0 = vector.insert %arg0, %arg1[3, 7, 15] : f32 into vector<4x8x[16]xf32>650 return %0 : vector<4x8x[16]xf32>651}652// CHECK-LABEL: @insert_scalar_into_vec_3d_f32_scalable653// CHECK: llvm.extractvalue {{.*}}[3, 7] : !llvm.array<4 x array<8 x vector<[16]xf32>>>654// CHECK: llvm.mlir.constant(15 : i64) : i64655// CHECK: llvm.insertelement {{.*}}, {{.*}}[{{.*}} : i64] : vector<[16]xf32>656// CHECK: llvm.insertvalue {{.*}}, {{.*}}[3, 7] : !llvm.array<4 x array<8 x vector<[16]xf32>>>657// CHECK: return {{.*}} : vector<4x8x[16]xf32>658 659// -----660 661func.func @insert_scalar_into_vec_1d_f32_dynamic_idx(%arg0: vector<16xf32>, %arg1: f32, %arg2: index)662 -> vector<16xf32> {663 %0 = vector.insert %arg1, %arg0[%arg2]: f32 into vector<16xf32>664 return %0 : vector<16xf32>665}666 667// CHECK-LABEL: @insert_scalar_into_vec_1d_f32_dynamic_idx668// CHECK-SAME: %[[DST:.+]]: vector<16xf32>, %[[SRC:.+]]: f32, %[[INDEX:.+]]: index669// CHECK: %[[UC:.+]] = builtin.unrealized_conversion_cast %[[INDEX]] : index to i64670// CHECK: llvm.insertelement %[[SRC]], %[[DST]][%[[UC]] : i64] : vector<16xf32>671 672// -----673 674func.func @insert_scalar_into_vec_1d_f32_dynamic_idx_scalable(%arg0: vector<[16]xf32>, %arg1: f32, %arg2: index)675 -> vector<[16]xf32> {676 %0 = vector.insert %arg1, %arg0[%arg2]: f32 into vector<[16]xf32>677 return %0 : vector<[16]xf32>678}679 680// CHECK-LABEL: @insert_scalar_into_vec_1d_f32_dynamic_idx_scalable681// CHECK-SAME: %[[DST:.+]]: vector<[16]xf32>, %[[SRC:.+]]: f32, %[[INDEX:.+]]: index682// CHECK: %[[UC:.+]] = builtin.unrealized_conversion_cast %[[INDEX]] : index to i64683// CHECK: llvm.insertelement %[[SRC]], %[[DST]][%[[UC]] : i64] : vector<[16]xf32>684 685// -----686 687func.func @insert_scalar_into_vec_2d_f32_dynamic_idx(%arg0: vector<1x16xf32>, %arg1: f32, %idx: index)688 -> vector<1x16xf32> {689 %0 = vector.insert %arg1, %arg0[0, %idx]: f32 into vector<1x16xf32>690 return %0 : vector<1x16xf32>691}692 693// CHECK-LABEL: @insert_scalar_into_vec_2d_f32_dynamic_idx(694// CHECK: llvm.extractvalue {{.*}} : !llvm.array<1 x vector<16xf32>>695// CHECK: llvm.insertelement {{.*}} : vector<16xf32>696// CHECK: llvm.insertvalue {{.*}} : !llvm.array<1 x vector<16xf32>>697 698// -----699 700func.func @insert_scalar_into_vec_2d_f32_dynamic_idx_scalable(%arg0: vector<1x[16]xf32>, %arg1: f32, %idx: index)701 -> vector<1x[16]xf32> {702 %0 = vector.insert %arg1, %arg0[0, %idx]: f32 into vector<1x[16]xf32>703 return %0 : vector<1x[16]xf32>704}705 706// CHECK-LABEL: @insert_scalar_into_vec_2d_f32_dynamic_idx_scalable(707// CHECK: llvm.extractvalue {{.*}} : !llvm.array<1 x vector<[16]xf32>>708// CHECK: llvm.insertelement {{.*}} : vector<[16]xf32>709// CHECK: llvm.insertvalue {{.*}} : !llvm.array<1 x vector<[16]xf32>>710 711 712// -----713 714func.func @insert_scalar_into_vec_2d_f32_dynamic_idx_fail(%arg0: vector<2x16xf32>, %arg1: f32, %idx: index)715 -> vector<2x16xf32> {716 %0 = vector.insert %arg1, %arg0[%idx, 0]: f32 into vector<2x16xf32>717 return %0 : vector<2x16xf32>718}719 720// Currently fails to convert because of the dynamic index in non-innermost721// dimension that converts to a llvm.array, as llvm.extractvalue does not722// support dynamic dimensions723 724// CHECK-LABEL: @insert_scalar_into_vec_2d_f32_dynamic_idx_fail725// CHECK: vector.insert726 727// -----728 729func.func @insert_scalar_from_vec_2d_f32_dynamic_idxs_compile_time_const(%arg : vector<4x1xf32>) -> vector<4x1xf32> {730 %0 = arith.constant 0 : index731 %1 = arith.constant 1.0 : f32732 %res = vector.insert %1, %arg[%0, %0] : f32 into vector<4x1xf32>733 return %res : vector<4x1xf32>734}735 736// At compile time, since the indices of insertOp are constants,737// they will be collapsed and folded away; therefore, the lowering works.738 739// CHECK-LABEL: @insert_scalar_from_vec_2d_f32_dynamic_idxs_compile_time_const740// CHECK-SAME: %[[ARG:.*]]: vector<4x1xf32>) -> vector<4x1xf32> {741// CHECK: %[[CAST:.*]] = builtin.unrealized_conversion_cast %[[ARG]] : vector<4x1xf32> to !llvm.array<4 x vector<1xf32>>742// CHECK: %[[C1:.*]] = arith.constant 1.000000e+00 : f32743// CHECK: %[[VEC_0:.*]] = llvm.extractvalue %[[CAST]][0] : !llvm.array<4 x vector<1xf32>>744// CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : i64) : i64745// CHECK: %[[VEC_1:.*]] = llvm.insertelement %[[C1]], %[[VEC_0]]{{\[}}%[[C0]] : i64] : vector<1xf32>746// CHECK: %[[VEC_2:.*]] = llvm.insertvalue %[[VEC_1]], %[[CAST]][0] : !llvm.array<4 x vector<1xf32>>747// CHECK: %[[RES:.*]] = builtin.unrealized_conversion_cast %[[VEC_2]] : !llvm.array<4 x vector<1xf32>> to vector<4x1xf32>748// CHECK: return %[[RES]] : vector<4x1xf32>749 750// -----751 752//===----------------------------------------------------------------------===//753// vector.type_cast754//755// TODO: Add tests for for vector.type_cast that would cover scalable vectors756//===----------------------------------------------------------------------===//757 758func.func @type_cast_f32(%arg0: memref<8x8x8xf32>) -> memref<vector<8x8x8xf32>> {759 %0 = vector.type_cast %arg0: memref<8x8x8xf32> to memref<vector<8x8x8xf32>>760 return %0 : memref<vector<8x8x8xf32>>761}762// CHECK-LABEL: @type_cast_f32763// CHECK: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64)>764// CHECK: %[[allocated:.*]] = llvm.extractvalue {{.*}}[0] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>765// CHECK: llvm.insertvalue %[[allocated]], {{.*}}[0] : !llvm.struct<(ptr, ptr, i64)>766// CHECK: %[[aligned:.*]] = llvm.extractvalue {{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>767// CHECK: llvm.insertvalue %[[aligned]], {{.*}}[1] : !llvm.struct<(ptr, ptr, i64)>768// CHECK: llvm.mlir.constant(0 : index769// CHECK: llvm.insertvalue {{.*}}[2] : !llvm.struct<(ptr, ptr, i64)>770 771// NOTE: No test for scalable vectors - the input memref is fixed size.772 773// -----774 775func.func @type_cast_index(%arg0: memref<8x8x8xindex>) -> memref<vector<8x8x8xindex>> {776 %0 = vector.type_cast %arg0: memref<8x8x8xindex> to memref<vector<8x8x8xindex>>777 return %0 : memref<vector<8x8x8xindex>>778}779// CHECK-LABEL: @type_cast_index(780// CHECK-SAME: %[[A:.*]]: memref<8x8x8xindex>)781// CHECK: %{{.*}} = builtin.unrealized_conversion_cast %[[A]] : memref<8x8x8xindex> to !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>782 783// CHECK: %{{.*}} = builtin.unrealized_conversion_cast %{{.*}} : !llvm.struct<(ptr, ptr, i64)> to memref<vector<8x8x8xindex>>784 785// NOTE: No test for scalable vectors - the input memref is fixed size.786 787// -----788 789func.func @type_cast_non_zero_addrspace(%arg0: memref<8x8x8xf32, 3>) -> memref<vector<8x8x8xf32>, 3> {790 %0 = vector.type_cast %arg0: memref<8x8x8xf32, 3> to memref<vector<8x8x8xf32>, 3>791 return %0 : memref<vector<8x8x8xf32>, 3>792}793// CHECK-LABEL: @type_cast_non_zero_addrspace794// CHECK: llvm.mlir.poison : !llvm.struct<(ptr<3>, ptr<3>, i64)>795// CHECK: %[[allocated:.*]] = llvm.extractvalue {{.*}}[0] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<3 x i64>, array<3 x i64>)>796// CHECK: llvm.insertvalue %[[allocated]], {{.*}}[0] : !llvm.struct<(ptr<3>, ptr<3>, i64)>797// CHECK: %[[aligned:.*]] = llvm.extractvalue {{.*}}[1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<3 x i64>, array<3 x i64>)>798// CHECK: llvm.insertvalue %[[aligned]], {{.*}}[1] : !llvm.struct<(ptr<3>, ptr<3>, i64)>799// CHECK: llvm.mlir.constant(0 : index800// CHECK: llvm.insertvalue {{.*}}[2] : !llvm.struct<(ptr<3>, ptr<3>, i64)>801 802// NOTE: No test for scalable vectors - the input memref is fixed size.803 804// -----805 806//===----------------------------------------------------------------------===//807// vector.print808//===----------------------------------------------------------------------===//809 810func.func @print_scalar_i64(%arg0: i64) {811 vector.print %arg0 : i64812 return813}814// CHECK-LABEL: @print_scalar_i64(815// CHECK-SAME: %[[A:.*]]: i64)816// CHECK: llvm.call @printI64(%[[A]]) : (i64) -> ()817// CHECK: llvm.call @printNewline() : () -> ()818 819// -----820 821func.func @print_scalar_ui64(%arg0: ui64) {822 vector.print %arg0 : ui64823 return824}825// CHECK-LABEL: @print_scalar_ui64(826// CHECK-SAME: %[[A:.*]]: ui64)827// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[A]] : ui64 to i64828// CHECK: llvm.call @printU64(%[[C]]) : (i64) -> ()829// CHECK: llvm.call @printNewline() : () -> ()830 831// -----832 833func.func @print_scalar_index(%arg0: index) {834 vector.print %arg0 : index835 return836}837// CHECK-LABEL: @print_scalar_index(838// CHECK-SAME: %[[A:.*]]: index)839// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[A]] : index to i64840// CHECK: llvm.call @printU64(%[[C]]) : (i64) -> ()841// CHECK: llvm.call @printNewline() : () -> ()842 843// -----844 845func.func @print_scalar_f32(%arg0: f32) {846 vector.print %arg0 : f32847 return848}849// CHECK-LABEL: @print_scalar_f32(850// CHECK-SAME: %[[A:.*]]: f32)851// CHECK: llvm.call @printF32(%[[A]]) : (f32) -> ()852// CHECK: llvm.call @printNewline() : () -> ()853 854// -----855 856func.func @print_scalar_f64(%arg0: f64) {857 vector.print %arg0 : f64858 return859}860// CHECK-LABEL: @print_scalar_f64(861// CHECK-SAME: %[[A:.*]]: f64)862// CHECK: llvm.call @printF64(%[[A]]) : (f64) -> ()863// CHECK: llvm.call @printNewline() : () -> ()864 865// -----866 867// CHECK-LABEL: module {868// CHECK: llvm.func @printString(!llvm.ptr)869// CHECK: llvm.mlir.global private constant @[[GLOBAL_STR:.*]]({{.*}})870// CHECK: @print_string871// CHECK-NEXT: %[[GLOBAL_ADDR:.*]] = llvm.mlir.addressof @[[GLOBAL_STR]] : !llvm.ptr872// CHECK-NEXT: %[[STR_PTR:.*]] = llvm.getelementptr %[[GLOBAL_ADDR]][0] : (!llvm.ptr) -> !llvm.ptr873// CHECK-NEXT: llvm.call @printString(%[[STR_PTR]]) : (!llvm.ptr) -> ()874func.func @print_string() {875 vector.print str "Hello, World!"876 return877}878 879// -----880 881//===----------------------------------------------------------------------===//882// vector.reduction883//===----------------------------------------------------------------------===//884 885func.func @reduce_0d_f32(%arg0: vector<f32>) -> f32 {886 %0 = vector.reduction <add>, %arg0 : vector<f32> into f32887 return %0 : f32888}889// CHECK-LABEL: @reduce_0d_f32(890// CHECK-SAME: %[[A:.*]]: vector<f32>)891// CHECK: %[[CA:.*]] = builtin.unrealized_conversion_cast %[[A]] : vector<f32> to vector<1xf32>892// CHECK: %[[C:.*]] = llvm.mlir.constant(0.000000e+00 : f32) : f32893// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.fadd"(%[[C]], %[[CA]])894// CHECK-SAME: <{fastmathFlags = #llvm.fastmath<none>}> : (f32, vector<1xf32>) -> f32895// CHECK: return %[[V]] : f32896 897// -----898 899func.func @reduce_f16(%arg0: vector<16xf16>) -> f16 {900 %0 = vector.reduction <add>, %arg0 : vector<16xf16> into f16901 return %0 : f16902}903// CHECK-LABEL: @reduce_f16(904// CHECK-SAME: %[[A:.*]]: vector<16xf16>)905// CHECK: %[[C:.*]] = llvm.mlir.constant(0.000000e+00 : f16) : f16906// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.fadd"(%[[C]], %[[A]])907// CHECK-SAME: <{fastmathFlags = #llvm.fastmath<none>}> : (f16, vector<16xf16>) -> f16908// CHECK: return %[[V]] : f16909 910// -----911 912func.func @reduce_f16_scalable(%arg0: vector<[16]xf16>) -> f16 {913 %0 = vector.reduction <add>, %arg0 : vector<[16]xf16> into f16914 return %0 : f16915}916// CHECK-LABEL: @reduce_f16_scalable(917// CHECK-SAME: %[[A:.*]]: vector<[16]xf16>)918// CHECK: %[[C:.*]] = llvm.mlir.constant(0.000000e+00 : f16) : f16919// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.fadd"(%[[C]], %[[A]])920// CHECK-SAME: <{fastmathFlags = #llvm.fastmath<none>}> : (f16, vector<[16]xf16>) -> f16921// CHECK: return %[[V]] : f16922 923// -----924 925func.func @reduce_f32(%arg0: vector<16xf32>) -> f32 {926 %0 = vector.reduction <add>, %arg0 : vector<16xf32> into f32927 return %0 : f32928}929// CHECK-LABEL: @reduce_f32(930// CHECK-SAME: %[[A:.*]]: vector<16xf32>)931// CHECK: %[[C:.*]] = llvm.mlir.constant(0.000000e+00 : f32) : f32932// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.fadd"(%[[C]], %[[A]])933// CHECK-SAME: <{fastmathFlags = #llvm.fastmath<none>}> : (f32, vector<16xf32>) -> f32934// CHECK: return %[[V]] : f32935 936// -----937 938func.func @reduce_f32_scalable(%arg0: vector<[16]xf32>) -> f32 {939 %0 = vector.reduction <add>, %arg0 : vector<[16]xf32> into f32940 return %0 : f32941}942// CHECK-LABEL: @reduce_f32_scalable(943// CHECK-SAME: %[[A:.*]]: vector<[16]xf32>)944// CHECK: %[[C:.*]] = llvm.mlir.constant(0.000000e+00 : f32) : f32945// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.fadd"(%[[C]], %[[A]])946// CHECK-SAME: <{fastmathFlags = #llvm.fastmath<none>}> : (f32, vector<[16]xf32>) -> f32947// CHECK: return %[[V]] : f32948 949// -----950 951func.func @reduce_f64(%arg0: vector<16xf64>) -> f64 {952 %0 = vector.reduction <add>, %arg0 : vector<16xf64> into f64953 return %0 : f64954}955// CHECK-LABEL: @reduce_f64(956// CHECK-SAME: %[[A:.*]]: vector<16xf64>)957// CHECK: %[[C:.*]] = llvm.mlir.constant(0.000000e+00 : f64) : f64958// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.fadd"(%[[C]], %[[A]])959// CHECK-SAME: <{fastmathFlags = #llvm.fastmath<none>}> : (f64, vector<16xf64>) -> f64960// CHECK: return %[[V]] : f64961 962// -----963 964func.func @reduce_f64_scalable(%arg0: vector<[16]xf64>) -> f64 {965 %0 = vector.reduction <add>, %arg0 : vector<[16]xf64> into f64966 return %0 : f64967}968// CHECK-LABEL: @reduce_f64_scalable(969// CHECK-SAME: %[[A:.*]]: vector<[16]xf64>)970// CHECK: %[[C:.*]] = llvm.mlir.constant(0.000000e+00 : f64) : f64971// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.fadd"(%[[C]], %[[A]])972// CHECK-SAME: <{fastmathFlags = #llvm.fastmath<none>}> : (f64, vector<[16]xf64>) -> f64973// CHECK: return %[[V]] : f64974 975// -----976 977func.func @reduce_i8(%arg0: vector<16xi8>) -> i8 {978 %0 = vector.reduction <add>, %arg0 : vector<16xi8> into i8979 return %0 : i8980}981// CHECK-LABEL: @reduce_i8(982// CHECK-SAME: %[[A:.*]]: vector<16xi8>)983// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.add"(%[[A]])984// CHECK: return %[[V]] : i8985 986// -----987 988func.func @reduce_i8_scalable(%arg0: vector<[16]xi8>) -> i8 {989 %0 = vector.reduction <add>, %arg0 : vector<[16]xi8> into i8990 return %0 : i8991}992// CHECK-LABEL: @reduce_i8_scalable(993// CHECK-SAME: %[[A:.*]]: vector<[16]xi8>)994// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.add"(%[[A]])995// CHECK: return %[[V]] : i8996 997// -----998 999func.func @reduce_i32(%arg0: vector<16xi32>) -> i32 {1000 %0 = vector.reduction <add>, %arg0 : vector<16xi32> into i321001 return %0 : i321002}1003// CHECK-LABEL: @reduce_i32(1004// CHECK-SAME: %[[A:.*]]: vector<16xi32>)1005// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.add"(%[[A]])1006// CHECK: return %[[V]] : i321007 1008// -----1009 1010func.func @reduce_i32_scalable(%arg0: vector<[16]xi32>) -> i32 {1011 %0 = vector.reduction <add>, %arg0 : vector<[16]xi32> into i321012 return %0 : i321013}1014// CHECK-LABEL: @reduce_i32_scalable(1015// CHECK-SAME: %[[A:.*]]: vector<[16]xi32>)1016// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.add"(%[[A]])1017// CHECK: return %[[V]] : i321018 1019// -----1020 1021func.func @reduce_acc_i32(%arg0: vector<16xi32>, %arg1 : i32) -> i32 {1022 %0 = vector.reduction <add>, %arg0, %arg1 : vector<16xi32> into i321023 return %0 : i321024}1025// CHECK-LABEL: @reduce_acc_i32(1026// CHECK-SAME: %[[A:.*]]: vector<16xi32>, %[[ACC:.*]]: i32)1027// CHECK: %[[R:.*]] = "llvm.intr.vector.reduce.add"(%[[A]])1028// CHECK: %[[V:.*]] = llvm.add %[[ACC]], %[[R]]1029// CHECK: return %[[V]] : i321030 1031// -----1032 1033func.func @reduce_acc_i32_scalable(%arg0: vector<[16]xi32>, %arg1 : i32) -> i32 {1034 %0 = vector.reduction <add>, %arg0, %arg1 : vector<[16]xi32> into i321035 return %0 : i321036}1037// CHECK-LABEL: @reduce_acc_i32_scalable(1038// CHECK-SAME: %[[A:.*]]: vector<[16]xi32>, %[[ACC:.*]]: i32)1039// CHECK: %[[R:.*]] = "llvm.intr.vector.reduce.add"(%[[A]])1040// CHECK: %[[V:.*]] = llvm.add %[[ACC]], %[[R]]1041// CHECK: return %[[V]] : i321042 1043// -----1044 1045func.func @reduce_mul_i32(%arg0: vector<16xi32>) -> i32 {1046 %0 = vector.reduction <mul>, %arg0 : vector<16xi32> into i321047 return %0 : i321048}1049// CHECK-LABEL: @reduce_mul_i32(1050// CHECK-SAME: %[[A:.*]]: vector<16xi32>)1051// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.mul"(%[[A]])1052// CHECK: return %[[V]] : i321053 1054// -----1055 1056func.func @reduce_mul_i32_scalable(%arg0: vector<[16]xi32>) -> i32 {1057 %0 = vector.reduction <mul>, %arg0 : vector<[16]xi32> into i321058 return %0 : i321059}1060// CHECK-LABEL: @reduce_mul_i32_scalable(1061// CHECK-SAME: %[[A:.*]]: vector<[16]xi32>)1062// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.mul"(%[[A]])1063// CHECK: return %[[V]] : i321064 1065// -----1066 1067func.func @reduce_mul_acc_i32(%arg0: vector<16xi32>, %arg1 : i32) -> i32 {1068 %0 = vector.reduction <mul>, %arg0, %arg1 : vector<16xi32> into i321069 return %0 : i321070}1071// CHECK-LABEL: @reduce_mul_acc_i32(1072// CHECK-SAME: %[[A:.*]]: vector<16xi32>, %[[ACC:.*]]: i32)1073// CHECK: %[[R:.*]] = "llvm.intr.vector.reduce.mul"(%[[A]])1074// CHECK: %[[V:.*]] = llvm.mul %[[ACC]], %[[R]]1075// CHECK: return %[[V]] : i321076 1077// -----1078 1079func.func @reduce_mul_acc_i32_scalable(%arg0: vector<[16]xi32>, %arg1 : i32) -> i32 {1080 %0 = vector.reduction <mul>, %arg0, %arg1 : vector<[16]xi32> into i321081 return %0 : i321082}1083// CHECK-LABEL: @reduce_mul_acc_i32_scalable(1084// CHECK-SAME: %[[A:.*]]: vector<[16]xi32>, %[[ACC:.*]]: i32)1085// CHECK: %[[R:.*]] = "llvm.intr.vector.reduce.mul"(%[[A]])1086// CHECK: %[[V:.*]] = llvm.mul %[[ACC]], %[[R]]1087// CHECK: return %[[V]] : i321088 1089// -----1090 1091func.func @reduce_fmaximum_f32(%arg0: vector<16xf32>, %arg1: f32) -> f32 {1092 %0 = vector.reduction <maximumf>, %arg0, %arg1 : vector<16xf32> into f321093 return %0 : f321094}1095// CHECK-LABEL: @reduce_fmaximum_f32(1096// CHECK-SAME: %[[A:.*]]: vector<16xf32>, %[[B:.*]]: f32)1097// CHECK: %[[V:.*]] = llvm.intr.vector.reduce.fmaximum(%[[A]]) : (vector<16xf32>) -> f321098// CHECK: %[[R:.*]] = llvm.intr.maximum(%[[V]], %[[B]]) : (f32, f32) -> f321099// CHECK: return %[[R]] : f321100 1101// -----1102 1103func.func @reduce_fmaximum_f32_scalable(%arg0: vector<[16]xf32>, %arg1: f32) -> f32 {1104 %0 = vector.reduction <maximumf>, %arg0, %arg1 : vector<[16]xf32> into f321105 return %0 : f321106}1107// CHECK-LABEL: @reduce_fmaximum_f32_scalable(1108// CHECK-SAME: %[[A:.*]]: vector<[16]xf32>, %[[B:.*]]: f32)1109// CHECK: %[[V:.*]] = llvm.intr.vector.reduce.fmaximum(%[[A]]) : (vector<[16]xf32>) -> f321110// CHECK: %[[R:.*]] = llvm.intr.maximum(%[[V]], %[[B]]) : (f32, f32) -> f321111// CHECK: return %[[R]] : f321112 1113// -----1114 1115func.func @reduce_fminimum_f32(%arg0: vector<16xf32>, %arg1: f32) -> f32 {1116 %0 = vector.reduction <minimumf>, %arg0, %arg1 : vector<16xf32> into f321117 return %0 : f321118}1119// CHECK-LABEL: @reduce_fminimum_f32(1120// CHECK-SAME: %[[A:.*]]: vector<16xf32>, %[[B:.*]]: f32)1121// CHECK: %[[V:.*]] = llvm.intr.vector.reduce.fminimum(%[[A]]) : (vector<16xf32>) -> f321122// CHECK: %[[R:.*]] = llvm.intr.minimum(%[[V]], %[[B]]) : (f32, f32) -> f321123// CHECK: return %[[R]] : f321124 1125// -----1126 1127func.func @reduce_fminimum_f32_scalable(%arg0: vector<[16]xf32>, %arg1: f32) -> f32 {1128 %0 = vector.reduction <minimumf>, %arg0, %arg1 : vector<[16]xf32> into f321129 return %0 : f321130}1131// CHECK-LABEL: @reduce_fminimum_f32_scalable(1132// CHECK-SAME: %[[A:.*]]: vector<[16]xf32>, %[[B:.*]]: f32)1133// CHECK: %[[V:.*]] = llvm.intr.vector.reduce.fminimum(%[[A]]) : (vector<[16]xf32>) -> f321134// CHECK: %[[R:.*]] = llvm.intr.minimum(%[[V]], %[[B]]) : (f32, f32) -> f321135// CHECK: return %[[R]] : f321136 1137// -----1138 1139func.func @reduce_fmax_f32(%arg0: vector<16xf32>, %arg1: f32) -> f32 {1140 %0 = vector.reduction <maxnumf>, %arg0, %arg1 : vector<16xf32> into f321141 return %0 : f321142}1143// CHECK-LABEL: @reduce_fmax_f32(1144// CHECK-SAME: %[[A:.*]]: vector<16xf32>, %[[B:.*]]: f32)1145// CHECK: %[[V:.*]] = llvm.intr.vector.reduce.fmax(%[[A]]) : (vector<16xf32>) -> f321146// CHECK: %[[R:.*]] = llvm.intr.maxnum(%[[V]], %[[B]]) : (f32, f32) -> f321147// CHECK: return %[[R]] : f321148 1149// -----1150 1151func.func @reduce_fmax_f32_scalable(%arg0: vector<[16]xf32>, %arg1: f32) -> f32 {1152 %0 = vector.reduction <maxnumf>, %arg0, %arg1 : vector<[16]xf32> into f321153 return %0 : f321154}1155// CHECK-LABEL: @reduce_fmax_f32_scalable(1156// CHECK-SAME: %[[A:.*]]: vector<[16]xf32>, %[[B:.*]]: f32)1157// CHECK: %[[V:.*]] = llvm.intr.vector.reduce.fmax(%[[A]]) : (vector<[16]xf32>) -> f321158// CHECK: %[[R:.*]] = llvm.intr.maxnum(%[[V]], %[[B]]) : (f32, f32) -> f321159// CHECK: return %[[R]] : f321160 1161// -----1162 1163func.func @reduce_fmin_f32(%arg0: vector<16xf32>, %arg1: f32) -> f32 {1164 %0 = vector.reduction <minnumf>, %arg0, %arg1 : vector<16xf32> into f321165 return %0 : f321166}1167// CHECK-LABEL: @reduce_fmin_f32(1168// CHECK-SAME: %[[A:.*]]: vector<16xf32>, %[[B:.*]]: f32)1169// CHECK: %[[V:.*]] = llvm.intr.vector.reduce.fmin(%[[A]]) : (vector<16xf32>) -> f321170// CHECK: %[[R:.*]] = llvm.intr.minnum(%[[V]], %[[B]]) : (f32, f32) -> f321171// CHECK: return %[[R]] : f321172 1173// -----1174 1175func.func @reduce_fmin_f32_scalable(%arg0: vector<[16]xf32>, %arg1: f32) -> f32 {1176 %0 = vector.reduction <minnumf>, %arg0, %arg1 : vector<[16]xf32> into f321177 return %0 : f321178}1179// CHECK-LABEL: @reduce_fmin_f32_scalable(1180// CHECK-SAME: %[[A:.*]]: vector<[16]xf32>, %[[B:.*]]: f32)1181// CHECK: %[[V:.*]] = llvm.intr.vector.reduce.fmin(%[[A]]) : (vector<[16]xf32>) -> f321182// CHECK: %[[R:.*]] = llvm.intr.minnum(%[[V]], %[[B]]) : (f32, f32) -> f321183// CHECK: return %[[R]] : f321184 1185// -----1186 1187func.func @reduce_minui_i32(%arg0: vector<16xi32>) -> i32 {1188 %0 = vector.reduction <minui>, %arg0 : vector<16xi32> into i321189 return %0 : i321190}1191// CHECK-LABEL: @reduce_minui_i32(1192// CHECK-SAME: %[[A:.*]]: vector<16xi32>)1193// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.umin"(%[[A]])1194// CHECK: return %[[V]] : i321195 1196// -----1197 1198func.func @reduce_minui_i32_scalable(%arg0: vector<[16]xi32>) -> i32 {1199 %0 = vector.reduction <minui>, %arg0 : vector<[16]xi32> into i321200 return %0 : i321201}1202// CHECK-LABEL: @reduce_minui_i32_scalable(1203// CHECK-SAME: %[[A:.*]]: vector<[16]xi32>)1204// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.umin"(%[[A]])1205// CHECK: return %[[V]] : i321206 1207// -----1208 1209func.func @reduce_minui_acc_i32(%arg0: vector<16xi32>, %arg1 : i32) -> i32 {1210 %0 = vector.reduction <minui>, %arg0, %arg1 : vector<16xi32> into i321211 return %0 : i321212}1213// CHECK-LABEL: @reduce_minui_acc_i32(1214// CHECK-SAME: %[[A:.*]]: vector<16xi32>, %[[ACC:.*]]: i32)1215// CHECK: %[[R:.*]] = "llvm.intr.vector.reduce.umin"(%[[A]])1216// CHECK: %[[S:.*]] = llvm.icmp "ule" %[[ACC]], %[[R]]1217// CHECK: %[[V:.*]] = llvm.select %[[S]], %[[ACC]], %[[R]]1218// CHECK: return %[[V]] : i321219 1220// -----1221 1222func.func @reduce_minui_acc_i32_scalable(%arg0: vector<[16]xi32>, %arg1 : i32) -> i32 {1223 %0 = vector.reduction <minui>, %arg0, %arg1 : vector<[16]xi32> into i321224 return %0 : i321225}1226// CHECK-LABEL: @reduce_minui_acc_i32_scalable(1227// CHECK-SAME: %[[A:.*]]: vector<[16]xi32>, %[[ACC:.*]]: i32)1228// CHECK: %[[R:.*]] = "llvm.intr.vector.reduce.umin"(%[[A]])1229// CHECK: %[[S:.*]] = llvm.icmp "ule" %[[ACC]], %[[R]]1230// CHECK: %[[V:.*]] = llvm.select %[[S]], %[[ACC]], %[[R]]1231// CHECK: return %[[V]] : i321232 1233// -----1234 1235func.func @reduce_maxui_i32(%arg0: vector<16xi32>) -> i32 {1236 %0 = vector.reduction <maxui>, %arg0 : vector<16xi32> into i321237 return %0 : i321238}1239// CHECK-LABEL: @reduce_maxui_i32(1240// CHECK-SAME: %[[A:.*]]: vector<16xi32>)1241// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.umax"(%[[A]])1242// CHECK: return %[[V]] : i321243 1244// -----1245 1246func.func @reduce_maxui_i32_scalable(%arg0: vector<[16]xi32>) -> i32 {1247 %0 = vector.reduction <maxui>, %arg0 : vector<[16]xi32> into i321248 return %0 : i321249}1250// CHECK-LABEL: @reduce_maxui_i32_scalable(1251// CHECK-SAME: %[[A:.*]]: vector<[16]xi32>)1252// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.umax"(%[[A]])1253// CHECK: return %[[V]] : i321254 1255// -----1256 1257func.func @reduce_maxui_acc_i32(%arg0: vector<16xi32>, %arg1 : i32) -> i32 {1258 %0 = vector.reduction <maxui>, %arg0, %arg1 : vector<16xi32> into i321259 return %0 : i321260}1261// CHECK-LABEL: @reduce_maxui_acc_i32(1262// CHECK-SAME: %[[A:.*]]: vector<16xi32>, %[[ACC:.*]]: i32)1263// CHECK: %[[R:.*]] = "llvm.intr.vector.reduce.umax"(%[[A]])1264// CHECK: %[[S:.*]] = llvm.icmp "uge" %[[ACC]], %[[R]]1265// CHECK: %[[V:.*]] = llvm.select %[[S]], %[[ACC]], %[[R]]1266// CHECK: return %[[V]] : i321267 1268// -----1269 1270func.func @reduce_maxui_acc_i32_scalable(%arg0: vector<[16]xi32>, %arg1 : i32) -> i32 {1271 %0 = vector.reduction <maxui>, %arg0, %arg1 : vector<[16]xi32> into i321272 return %0 : i321273}1274// CHECK-LABEL: @reduce_maxui_acc_i32_scalable(1275// CHECK-SAME: %[[A:.*]]: vector<[16]xi32>, %[[ACC:.*]]: i32)1276// CHECK: %[[R:.*]] = "llvm.intr.vector.reduce.umax"(%[[A]])1277// CHECK: %[[S:.*]] = llvm.icmp "uge" %[[ACC]], %[[R]]1278// CHECK: %[[V:.*]] = llvm.select %[[S]], %[[ACC]], %[[R]]1279// CHECK: return %[[V]] : i321280 1281// -----1282 1283func.func @reduce_minsi_i32(%arg0: vector<16xi32>) -> i32 {1284 %0 = vector.reduction <minsi>, %arg0 : vector<16xi32> into i321285 return %0 : i321286}1287// CHECK-LABEL: @reduce_minsi_i32(1288// CHECK-SAME: %[[A:.*]]: vector<16xi32>)1289// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.smin"(%[[A]])1290// CHECK: return %[[V]] : i321291 1292// -----1293 1294func.func @reduce_minsi_i32_scalable(%arg0: vector<[16]xi32>) -> i32 {1295 %0 = vector.reduction <minsi>, %arg0 : vector<[16]xi32> into i321296 return %0 : i321297}1298// CHECK-LABEL: @reduce_minsi_i32_scalable(1299// CHECK-SAME: %[[A:.*]]: vector<[16]xi32>)1300// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.smin"(%[[A]])1301// CHECK: return %[[V]] : i321302 1303// -----1304 1305func.func @reduce_minsi_acc_i32(%arg0: vector<16xi32>, %arg1 : i32) -> i32 {1306 %0 = vector.reduction <minsi>, %arg0, %arg1 : vector<16xi32> into i321307 return %0 : i321308}1309// CHECK-LABEL: @reduce_minsi_acc_i32(1310// CHECK-SAME: %[[A:.*]]: vector<16xi32>, %[[ACC:.*]]: i32)1311// CHECK: %[[R:.*]] = "llvm.intr.vector.reduce.smin"(%[[A]])1312// CHECK: %[[S:.*]] = llvm.icmp "sle" %[[ACC]], %[[R]]1313// CHECK: %[[V:.*]] = llvm.select %[[S]], %[[ACC]], %[[R]]1314// CHECK: return %[[V]] : i321315 1316// -----1317 1318func.func @reduce_minsi_acc_i32_scalable(%arg0: vector<[16]xi32>, %arg1 : i32) -> i32 {1319 %0 = vector.reduction <minsi>, %arg0, %arg1 : vector<[16]xi32> into i321320 return %0 : i321321}1322// CHECK-LABEL: @reduce_minsi_acc_i32_scalable(1323// CHECK-SAME: %[[A:.*]]: vector<[16]xi32>, %[[ACC:.*]]: i32)1324// CHECK: %[[R:.*]] = "llvm.intr.vector.reduce.smin"(%[[A]])1325// CHECK: %[[S:.*]] = llvm.icmp "sle" %[[ACC]], %[[R]]1326// CHECK: %[[V:.*]] = llvm.select %[[S]], %[[ACC]], %[[R]]1327// CHECK: return %[[V]] : i321328 1329// -----1330 1331func.func @reduce_maxsi_i32(%arg0: vector<16xi32>) -> i32 {1332 %0 = vector.reduction <maxsi>, %arg0 : vector<16xi32> into i321333 return %0 : i321334}1335// CHECK-LABEL: @reduce_maxsi_i32(1336// CHECK-SAME: %[[A:.*]]: vector<16xi32>)1337// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.smax"(%[[A]])1338// CHECK: return %[[V]] : i321339 1340// -----1341 1342func.func @reduce_maxsi_i32_scalable(%arg0: vector<[16]xi32>) -> i32 {1343 %0 = vector.reduction <maxsi>, %arg0 : vector<[16]xi32> into i321344 return %0 : i321345}1346// CHECK-LABEL: @reduce_maxsi_i32_scalable(1347// CHECK-SAME: %[[A:.*]]: vector<[16]xi32>)1348// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.smax"(%[[A]])1349// CHECK: return %[[V]] : i321350 1351// -----1352 1353func.func @reduce_maxsi_acc_i32(%arg0: vector<16xi32>, %arg1 : i32) -> i32 {1354 %0 = vector.reduction <maxsi>, %arg0, %arg1 : vector<16xi32> into i321355 return %0 : i321356}1357// CHECK-LABEL: @reduce_maxsi_acc_i32(1358// CHECK-SAME: %[[A:.*]]: vector<16xi32>, %[[ACC:.*]]: i32)1359// CHECK: %[[R:.*]] = "llvm.intr.vector.reduce.smax"(%[[A]])1360// CHECK: %[[S:.*]] = llvm.icmp "sge" %[[ACC]], %[[R]]1361// CHECK: %[[V:.*]] = llvm.select %[[S]], %[[ACC]], %[[R]]1362// CHECK: return %[[V]] : i321363 1364// -----1365 1366func.func @reduce_maxsi_acc_i32_scalable(%arg0: vector<[16]xi32>, %arg1 : i32) -> i32 {1367 %0 = vector.reduction <maxsi>, %arg0, %arg1 : vector<[16]xi32> into i321368 return %0 : i321369}1370// CHECK-LABEL: @reduce_maxsi_acc_i32_scalable(1371// CHECK-SAME: %[[A:.*]]: vector<[16]xi32>, %[[ACC:.*]]: i32)1372// CHECK: %[[R:.*]] = "llvm.intr.vector.reduce.smax"(%[[A]])1373// CHECK: %[[S:.*]] = llvm.icmp "sge" %[[ACC]], %[[R]]1374// CHECK: %[[V:.*]] = llvm.select %[[S]], %[[ACC]], %[[R]]1375// CHECK: return %[[V]] : i321376 1377// -----1378 1379func.func @reduce_and_i32(%arg0: vector<16xi32>) -> i32 {1380 %0 = vector.reduction <and>, %arg0 : vector<16xi32> into i321381 return %0 : i321382}1383// CHECK-LABEL: @reduce_and_i32(1384// CHECK-SAME: %[[A:.*]]: vector<16xi32>)1385// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.and"(%[[A]])1386// CHECK: return %[[V]] : i321387 1388// -----1389 1390func.func @reduce_and_i32_scalable(%arg0: vector<[16]xi32>) -> i32 {1391 %0 = vector.reduction <and>, %arg0 : vector<[16]xi32> into i321392 return %0 : i321393}1394// CHECK-LABEL: @reduce_and_i32_scalable(1395// CHECK-SAME: %[[A:.*]]: vector<[16]xi32>)1396// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.and"(%[[A]])1397// CHECK: return %[[V]] : i321398 1399// -----1400 1401func.func @reduce_and_acc_i32(%arg0: vector<16xi32>, %arg1 : i32) -> i32 {1402 %0 = vector.reduction <and>, %arg0, %arg1 : vector<16xi32> into i321403 return %0 : i321404}1405// CHECK-LABEL: @reduce_and_acc_i32(1406// CHECK-SAME: %[[A:.*]]: vector<16xi32>, %[[ACC:.*]]: i32)1407// CHECK: %[[R:.*]] = "llvm.intr.vector.reduce.and"(%[[A]])1408// CHECK: %[[V:.*]] = llvm.and %[[ACC]], %[[R]]1409// CHECK: return %[[V]] : i321410 1411// -----1412 1413func.func @reduce_and_acc_i32_scalable(%arg0: vector<[16]xi32>, %arg1 : i32) -> i32 {1414 %0 = vector.reduction <and>, %arg0, %arg1 : vector<[16]xi32> into i321415 return %0 : i321416}1417// CHECK-LABEL: @reduce_and_acc_i32_scalable(1418// CHECK-SAME: %[[A:.*]]: vector<[16]xi32>, %[[ACC:.*]]: i32)1419// CHECK: %[[R:.*]] = "llvm.intr.vector.reduce.and"(%[[A]])1420// CHECK: %[[V:.*]] = llvm.and %[[ACC]], %[[R]]1421// CHECK: return %[[V]] : i321422 1423// -----1424 1425func.func @reduce_or_i32(%arg0: vector<16xi32>) -> i32 {1426 %0 = vector.reduction <or>, %arg0 : vector<16xi32> into i321427 return %0 : i321428}1429// CHECK-LABEL: @reduce_or_i32(1430// CHECK-SAME: %[[A:.*]]: vector<16xi32>)1431// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.or"(%[[A]])1432// CHECK: return %[[V]] : i321433 1434// -----1435 1436func.func @reduce_or_i32_scalable(%arg0: vector<[16]xi32>) -> i32 {1437 %0 = vector.reduction <or>, %arg0 : vector<[16]xi32> into i321438 return %0 : i321439}1440// CHECK-LABEL: @reduce_or_i32_scalable(1441// CHECK-SAME: %[[A:.*]]: vector<[16]xi32>)1442// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.or"(%[[A]])1443// CHECK: return %[[V]] : i321444 1445// -----1446 1447func.func @reduce_or_acc_i32(%arg0: vector<16xi32>, %arg1 : i32) -> i32 {1448 %0 = vector.reduction <or>, %arg0, %arg1 : vector<16xi32> into i321449 return %0 : i321450}1451// CHECK-LABEL: @reduce_or_acc_i32(1452// CHECK-SAME: %[[A:.*]]: vector<16xi32>, %[[ACC:.*]]: i32)1453// CHECK: %[[R:.*]] = "llvm.intr.vector.reduce.or"(%[[A]])1454// CHECK: %[[V:.*]] = llvm.or %[[ACC]], %[[R]]1455// CHECK: return %[[V]] : i321456 1457// -----1458 1459func.func @reduce_or_acc_i32_scalable(%arg0: vector<[16]xi32>, %arg1 : i32) -> i32 {1460 %0 = vector.reduction <or>, %arg0, %arg1 : vector<[16]xi32> into i321461 return %0 : i321462}1463// CHECK-LABEL: @reduce_or_acc_i32_scalable(1464// CHECK-SAME: %[[A:.*]]: vector<[16]xi32>, %[[ACC:.*]]: i32)1465// CHECK: %[[R:.*]] = "llvm.intr.vector.reduce.or"(%[[A]])1466// CHECK: %[[V:.*]] = llvm.or %[[ACC]], %[[R]]1467// CHECK: return %[[V]] : i321468 1469// -----1470 1471func.func @reduce_xor_i32(%arg0: vector<16xi32>) -> i32 {1472 %0 = vector.reduction <xor>, %arg0 : vector<16xi32> into i321473 return %0 : i321474}1475// CHECK-LABEL: @reduce_xor_i32(1476// CHECK-SAME: %[[A:.*]]: vector<16xi32>)1477// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.xor"(%[[A]])1478// CHECK: return %[[V]] : i321479 1480// -----1481 1482func.func @reduce_xor_i32_scalable(%arg0: vector<[16]xi32>) -> i32 {1483 %0 = vector.reduction <xor>, %arg0 : vector<[16]xi32> into i321484 return %0 : i321485}1486// CHECK-LABEL: @reduce_xor_i32_scalable(1487// CHECK-SAME: %[[A:.*]]: vector<[16]xi32>)1488// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.xor"(%[[A]])1489// CHECK: return %[[V]] : i321490 1491// -----1492 1493func.func @reduce_xor_acc_i32(%arg0: vector<16xi32>, %arg1 : i32) -> i32 {1494 %0 = vector.reduction <xor>, %arg0, %arg1 : vector<16xi32> into i321495 return %0 : i321496}1497// CHECK-LABEL: @reduce_xor_acc_i32(1498// CHECK-SAME: %[[A:.*]]: vector<16xi32>, %[[ACC:.*]]: i32)1499// CHECK: %[[R:.*]] = "llvm.intr.vector.reduce.xor"(%[[A]])1500// CHECK: %[[V:.*]] = llvm.xor %[[ACC]], %[[R]]1501// CHECK: return %[[V]] : i321502 1503// -----1504 1505func.func @reduce_xor_acc_i32_scalable(%arg0: vector<[16]xi32>, %arg1 : i32) -> i32 {1506 %0 = vector.reduction <xor>, %arg0, %arg1 : vector<[16]xi32> into i321507 return %0 : i321508}1509// CHECK-LABEL: @reduce_xor_acc_i32_scalable(1510// CHECK-SAME: %[[A:.*]]: vector<[16]xi32>, %[[ACC:.*]]: i32)1511// CHECK: %[[R:.*]] = "llvm.intr.vector.reduce.xor"(%[[A]])1512// CHECK: %[[V:.*]] = llvm.xor %[[ACC]], %[[R]]1513// CHECK: return %[[V]] : i321514 1515// -----1516 1517func.func @reduce_i64(%arg0: vector<16xi64>) -> i64 {1518 %0 = vector.reduction <add>, %arg0 : vector<16xi64> into i641519 return %0 : i641520}1521// CHECK-LABEL: @reduce_i64(1522// CHECK-SAME: %[[A:.*]]: vector<16xi64>)1523// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.add"(%[[A]])1524// CHECK: return %[[V]] : i641525 1526// -----1527 1528func.func @reduce_i64_scalable(%arg0: vector<[16]xi64>) -> i64 {1529 %0 = vector.reduction <add>, %arg0 : vector<[16]xi64> into i641530 return %0 : i641531}1532// CHECK-LABEL: @reduce_i64_scalable(1533// CHECK-SAME: %[[A:.*]]: vector<[16]xi64>)1534// CHECK: %[[V:.*]] = "llvm.intr.vector.reduce.add"(%[[A]])1535// CHECK: return %[[V]] : i641536 1537// -----1538 1539func.func @reduce_index(%arg0: vector<16xindex>) -> index {1540 %0 = vector.reduction <add>, %arg0 : vector<16xindex> into index1541 return %0 : index1542}1543// CHECK-LABEL: @reduce_index(1544// CHECK-SAME: %[[A:.*]]: vector<16xindex>)1545// CHECK: %[[T0:.*]] = builtin.unrealized_conversion_cast %[[A]] : vector<16xindex> to vector<16xi64>1546// CHECK: %[[T1:.*]] = "llvm.intr.vector.reduce.add"(%[[T0]])1547// CHECK: %[[T2:.*]] = builtin.unrealized_conversion_cast %[[T1]] : i64 to index1548// CHECK: return %[[T2]] : index1549 1550// -----1551 1552func.func @reduce_index_scalable(%arg0: vector<[16]xindex>) -> index {1553 %0 = vector.reduction <add>, %arg0 : vector<[16]xindex> into index1554 return %0 : index1555}1556// CHECK-LABEL: @reduce_index_scalable(1557// CHECK-SAME: %[[A:.*]]: vector<[16]xindex>)1558// CHECK: %[[T0:.*]] = builtin.unrealized_conversion_cast %[[A]] : vector<[16]xindex> to vector<[16]xi64>1559// CHECK: %[[T1:.*]] = "llvm.intr.vector.reduce.add"(%[[T0]])1560// CHECK: %[[T2:.*]] = builtin.unrealized_conversion_cast %[[T1]] : i64 to index1561// CHECK: return %[[T2]] : index1562 1563// -----1564 1565//===----------------------------------------------------------------------===//1566// vector.transpose1567//===----------------------------------------------------------------------===//1568 1569func.func @transpose_0d(%arg0: vector<f32>) -> vector<f32> {1570 %0 = vector.transpose %arg0, [] : vector<f32> to vector<f32>1571 return %0 : vector<f32>1572}1573 1574// CHECK-LABEL: func @transpose_0d1575// CHECK-SAME: %[[A:.*]]: vector<f32>1576// CHECK: return %[[A]] : vector<f32>1577 1578// -----1579 1580//===----------------------------------------------------------------------===//1581// vector.load1582//===----------------------------------------------------------------------===//1583 1584func.func @load(%memref : memref<200x100xf32>, %i : index, %j : index) -> vector<8xf32> {1585 %0 = vector.load %memref[%i, %j] : memref<200x100xf32>, vector<8xf32>1586 return %0 : vector<8xf32>1587}1588 1589// CHECK-LABEL: func @load1590// CHECK: %[[C100:.*]] = llvm.mlir.constant(100 : index) : i641591// CHECK: %[[MUL:.*]] = llvm.mul %{{.*}}, %[[C100]] : i641592// CHECK: %[[ADD:.*]] = llvm.add %[[MUL]], %{{.*}} : i641593// CHECK: %[[GEP:.*]] = llvm.getelementptr %{{.*}}[%[[ADD]]] : (!llvm.ptr, i64) -> !llvm.ptr, f321594// CHECK: llvm.load %[[GEP]] {alignment = 4 : i64} : !llvm.ptr -> vector<8xf32>1595 1596// -----1597 1598func.func @load_scalable(%memref : memref<200x100xf32>, %i : index, %j : index) -> vector<[8]xf32> {1599 %0 = vector.load %memref[%i, %j] : memref<200x100xf32>, vector<[8]xf32>1600 return %0 : vector<[8]xf32>1601}1602 1603// CHECK-LABEL: func @load_scalable1604// CHECK: %[[C100:.*]] = llvm.mlir.constant(100 : index) : i641605// CHECK: %[[MUL:.*]] = llvm.mul %{{.*}}, %[[C100]] : i641606// CHECK: %[[ADD:.*]] = llvm.add %[[MUL]], %{{.*}} : i641607// CHECK: %[[GEP:.*]] = llvm.getelementptr %{{.*}}[%[[ADD]]] : (!llvm.ptr, i64) -> !llvm.ptr, f321608// CHECK: llvm.load %[[GEP]] {alignment = 4 : i64} : !llvm.ptr -> vector<[8]xf32>1609 1610// -----1611 1612func.func @load_nontemporal(%memref : memref<200x100xf32>, %i : index, %j : index) -> vector<8xf32> {1613 %0 = vector.load %memref[%i, %j] {nontemporal = true} : memref<200x100xf32>, vector<8xf32>1614 return %0 : vector<8xf32>1615}1616 1617// CHECK-LABEL: func @load_nontemporal1618// CHECK: %[[C100:.*]] = llvm.mlir.constant(100 : index) : i641619// CHECK: %[[MUL:.*]] = llvm.mul %{{.*}}, %[[C100]] : i641620// CHECK: %[[ADD:.*]] = llvm.add %[[MUL]], %{{.*}} : i641621// CHECK: %[[GEP:.*]] = llvm.getelementptr %{{.*}}[%[[ADD]]] : (!llvm.ptr, i64) -> !llvm.ptr, f321622// CHECK: llvm.load %[[GEP]] {alignment = 4 : i64, nontemporal} : !llvm.ptr -> vector<8xf32>1623 1624// -----1625 1626func.func @load_nontemporal_scalable(%memref : memref<200x100xf32>, %i : index, %j : index) -> vector<[8]xf32> {1627 %0 = vector.load %memref[%i, %j] {nontemporal = true} : memref<200x100xf32>, vector<[8]xf32>1628 return %0 : vector<[8]xf32>1629}1630 1631// CHECK-LABEL: func @load_nontemporal_scalable1632// CHECK: %[[C100:.*]] = llvm.mlir.constant(100 : index) : i641633// CHECK: %[[MUL:.*]] = llvm.mul %{{.*}}, %[[C100]] : i641634// CHECK: %[[ADD:.*]] = llvm.add %[[MUL]], %{{.*}} : i641635// CHECK: %[[GEP:.*]] = llvm.getelementptr %{{.*}}[%[[ADD]]] : (!llvm.ptr, i64) -> !llvm.ptr, f321636// CHECK: llvm.load %[[GEP]] {alignment = 4 : i64, nontemporal} : !llvm.ptr -> vector<[8]xf32>1637 1638// -----1639 1640func.func @load_index(%memref : memref<200x100xindex>, %i : index, %j : index) -> vector<8xindex> {1641 %0 = vector.load %memref[%i, %j] : memref<200x100xindex>, vector<8xindex>1642 return %0 : vector<8xindex>1643}1644// CHECK-LABEL: func @load_index1645// CHECK: %[[T0:.*]] = llvm.load %{{.*}} {alignment = 8 : i64} : !llvm.ptr -> vector<8xi64>1646// CHECK: %[[T1:.*]] = builtin.unrealized_conversion_cast %[[T0]] : vector<8xi64> to vector<8xindex>1647// CHECK: return %[[T1]] : vector<8xindex>1648 1649// -----1650 1651func.func @load_index_scalable(%memref : memref<200x100xindex>, %i : index, %j : index) -> vector<[8]xindex> {1652 %0 = vector.load %memref[%i, %j] : memref<200x100xindex>, vector<[8]xindex>1653 return %0 : vector<[8]xindex>1654}1655// CHECK-LABEL: func @load_index_scalable1656// CHECK: %[[T0:.*]] = llvm.load %{{.*}} {alignment = 8 : i64} : !llvm.ptr -> vector<[8]xi64>1657// CHECK: %[[T1:.*]] = builtin.unrealized_conversion_cast %[[T0]] : vector<[8]xi64> to vector<[8]xindex>1658// CHECK: return %[[T1]] : vector<[8]xindex>1659 1660// -----1661 1662func.func @load_0d(%memref : memref<200x100xf32>, %i : index, %j : index) -> vector<f32> {1663 %0 = vector.load %memref[%i, %j] : memref<200x100xf32>, vector<f32>1664 return %0 : vector<f32>1665}1666 1667// CHECK-LABEL: func @load_0d1668// CHECK: %[[J:.*]] = builtin.unrealized_conversion_cast %{{.*}} : index to i641669// CHECK: %[[I:.*]] = builtin.unrealized_conversion_cast %{{.*}} : index to i641670// CHECK: %[[CAST_MEMREF:.*]] = builtin.unrealized_conversion_cast %{{.*}} : memref<200x100xf32> to !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>1671// CHECK: %[[REF:.*]] = llvm.extractvalue %[[CAST_MEMREF]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>1672// CHECK: %[[C100:.*]] = llvm.mlir.constant(100 : index) : i641673// CHECK: %[[MUL:.*]] = llvm.mul %[[I]], %[[C100]] : i641674// CHECK: %[[ADD:.*]] = llvm.add %[[MUL]], %[[J]] : i641675// CHECK: %[[ADDR:.*]] = llvm.getelementptr %[[REF]][%[[ADD]]] : (!llvm.ptr, i64) -> !llvm.ptr, f321676// CHECK: %[[LOAD:.*]] = llvm.load %[[ADDR]] {alignment = 4 : i64} : !llvm.ptr -> vector<1xf32>1677// CHECK: %[[RES:.*]] = builtin.unrealized_conversion_cast %[[LOAD]] : vector<1xf32> to vector<f32>1678// CHECK: return %[[RES]] : vector<f32>1679 1680// -----1681 1682func.func @load_with_alignment(%memref : memref<200x100xf32>, %i : index, %j : index) -> vector<8xf32> {1683 %0 = vector.load %memref[%i, %j] { alignment = 8 } : memref<200x100xf32>, vector<8xf32>1684 return %0 : vector<8xf32>1685}1686 1687// CHECK-LABEL: func @load_with_alignment1688// CHECK: llvm.load {{.*}} {alignment = 8 : i64} : !llvm.ptr -> vector<8xf32>1689 1690// -----1691 1692//===----------------------------------------------------------------------===//1693// vector.store1694//===----------------------------------------------------------------------===//1695 1696func.func @store(%memref : memref<200x100xf32>, %i : index, %j : index) {1697 %val = arith.constant dense<11.0> : vector<4xf32>1698 vector.store %val, %memref[%i, %j] : memref<200x100xf32>, vector<4xf32>1699 return1700}1701 1702// CHECK-LABEL: func @store1703// CHECK: %[[C100:.*]] = llvm.mlir.constant(100 : index) : i641704// CHECK: %[[MUL:.*]] = llvm.mul %{{.*}}, %[[C100]] : i641705// CHECK: %[[ADD:.*]] = llvm.add %[[MUL]], %{{.*}} : i641706// CHECK: %[[GEP:.*]] = llvm.getelementptr %{{.*}}[%[[ADD]]] : (!llvm.ptr, i64) -> !llvm.ptr, f321707// CHECK: llvm.store %{{.*}}, %[[GEP]] {alignment = 4 : i64} : vector<4xf32>, !llvm.ptr1708 1709// -----1710 1711func.func @store_scalable(%memref : memref<200x100xf32>, %i : index, %j : index) {1712 %val = arith.constant dense<11.0> : vector<[4]xf32>1713 vector.store %val, %memref[%i, %j] : memref<200x100xf32>, vector<[4]xf32>1714 return1715}1716 1717// CHECK-LABEL: func @store_scalable1718// CHECK: %[[C100:.*]] = llvm.mlir.constant(100 : index) : i641719// CHECK: %[[MUL:.*]] = llvm.mul %{{.*}}, %[[C100]] : i641720// CHECK: %[[ADD:.*]] = llvm.add %[[MUL]], %{{.*}} : i641721// CHECK: %[[GEP:.*]] = llvm.getelementptr %{{.*}}[%[[ADD]]] : (!llvm.ptr, i64) -> !llvm.ptr, f321722// CHECK: llvm.store %{{.*}}, %[[GEP]] {alignment = 4 : i64} : vector<[4]xf32>, !llvm.ptr1723 1724// -----1725 1726func.func @store_nontemporal(%memref : memref<200x100xf32>, %i : index, %j : index) {1727 %val = arith.constant dense<11.0> : vector<4xf32>1728 vector.store %val, %memref[%i, %j] {nontemporal = true} : memref<200x100xf32>, vector<4xf32>1729 return1730}1731 1732// CHECK-LABEL: func @store_nontemporal1733// CHECK: %[[C100:.*]] = llvm.mlir.constant(100 : index) : i641734// CHECK: %[[MUL:.*]] = llvm.mul %{{.*}}, %[[C100]] : i641735// CHECK: %[[ADD:.*]] = llvm.add %[[MUL]], %{{.*}} : i641736// CHECK: %[[GEP:.*]] = llvm.getelementptr %{{.*}}[%[[ADD]]] : (!llvm.ptr, i64) -> !llvm.ptr, f321737// CHECK: llvm.store %{{.*}}, %[[GEP]] {alignment = 4 : i64, nontemporal} : vector<4xf32>, !llvm.ptr1738 1739// -----1740 1741func.func @store_nontemporal_scalable(%memref : memref<200x100xf32>, %i : index, %j : index) {1742 %val = arith.constant dense<11.0> : vector<[4]xf32>1743 vector.store %val, %memref[%i, %j] {nontemporal = true} : memref<200x100xf32>, vector<[4]xf32>1744 return1745}1746 1747// CHECK-LABEL: func @store_nontemporal_scalable1748// CHECK: %[[C100:.*]] = llvm.mlir.constant(100 : index) : i641749// CHECK: %[[MUL:.*]] = llvm.mul %{{.*}}, %[[C100]] : i641750// CHECK: %[[ADD:.*]] = llvm.add %[[MUL]], %{{.*}} : i641751// CHECK: %[[GEP:.*]] = llvm.getelementptr %{{.*}}[%[[ADD]]] : (!llvm.ptr, i64) -> !llvm.ptr, f321752// CHECK: llvm.store %{{.*}}, %[[GEP]] {alignment = 4 : i64, nontemporal} : vector<[4]xf32>, !llvm.ptr1753 1754// -----1755 1756func.func @store_index(%memref : memref<200x100xindex>, %i : index, %j : index) {1757 %val = arith.constant dense<11> : vector<4xindex>1758 vector.store %val, %memref[%i, %j] : memref<200x100xindex>, vector<4xindex>1759 return1760}1761// CHECK-LABEL: func @store_index1762// CHECK: llvm.store %{{.*}}, %{{.*}} {alignment = 8 : i64} : vector<4xi64>, !llvm.ptr1763 1764// -----1765 1766func.func @store_index_scalable(%memref : memref<200x100xindex>, %i : index, %j : index) {1767 %val = arith.constant dense<11> : vector<[4]xindex>1768 vector.store %val, %memref[%i, %j] : memref<200x100xindex>, vector<[4]xindex>1769 return1770}1771// CHECK-LABEL: func @store_index_scalable1772// CHECK: llvm.store %{{.*}}, %{{.*}} {alignment = 8 : i64} : vector<[4]xi64>, !llvm.ptr1773 1774// -----1775 1776func.func @store_0d(%memref : memref<200x100xf32>, %i : index, %j : index) {1777 %val = arith.constant dense<11.0> : vector<f32>1778 vector.store %val, %memref[%i, %j] : memref<200x100xf32>, vector<f32>1779 return1780}1781 1782// CHECK-LABEL: func @store_0d1783// CHECK: %[[J:.*]] = builtin.unrealized_conversion_cast %{{.*}} : index to i641784// CHECK: %[[I:.*]] = builtin.unrealized_conversion_cast %{{.*}} : index to i641785// CHECK: %[[CAST_MEMREF:.*]] = builtin.unrealized_conversion_cast %{{.*}} : memref<200x100xf32> to !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>1786// CHECK: %[[CST:.*]] = arith.constant dense<1.100000e+01> : vector<f32>1787// CHECK: %[[VAL:.*]] = builtin.unrealized_conversion_cast %[[CST]] : vector<f32> to vector<1xf32>1788// CHECK: %[[REF:.*]] = llvm.extractvalue %[[CAST_MEMREF]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>1789// CHECK: %[[C100:.*]] = llvm.mlir.constant(100 : index) : i641790// CHECK: %[[MUL:.*]] = llvm.mul %[[I]], %[[C100]] : i641791// CHECK: %[[ADD:.*]] = llvm.add %[[MUL]], %[[J]] : i641792// CHECK: %[[ADDR:.*]] = llvm.getelementptr %[[REF]][%[[ADD]]] : (!llvm.ptr, i64) -> !llvm.ptr, f321793// CHECK: llvm.store %[[VAL]], %[[ADDR]] {alignment = 4 : i64} : vector<1xf32>, !llvm.ptr1794// CHECK: return1795 1796// -----1797 1798func.func @store_with_alignment(%memref : memref<200x100xf32>, %i : index, %j : index, %val : vector<4xf32>) {1799 vector.store %val, %memref[%i, %j] {alignment = 8} : memref<200x100xf32>, vector<4xf32>1800 return1801}1802 1803// CHECK-LABEL: func @store_with_alignment1804// CHECK: llvm.store %{{.*}} {alignment = 8 : i64} : vector<4xf32>, !llvm.ptr1805 1806// -----1807 1808//===----------------------------------------------------------------------===//1809// vector.maskedload1810//===----------------------------------------------------------------------===//1811 1812func.func @masked_load(%arg0: memref<?xf32>, %arg1: vector<16xi1>, %arg2: vector<16xf32>) -> vector<16xf32> {1813 %c0 = arith.constant 0: index1814 %0 = vector.maskedload %arg0[%c0], %arg1, %arg2 : memref<?xf32>, vector<16xi1>, vector<16xf32> into vector<16xf32>1815 return %0 : vector<16xf32>1816}1817 1818// CHECK-LABEL: func @masked_load1819// CHECK: %[[CO:.*]] = arith.constant 0 : index1820// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[CO]] : index to i641821// CHECK: %[[P:.*]] = llvm.getelementptr %{{.*}}[%[[C]]] : (!llvm.ptr, i64) -> !llvm.ptr, f321822// CHECK: %[[L:.*]] = llvm.intr.masked.load %[[P]], %{{.*}}, %{{.*}} {alignment = 4 : i32} : (!llvm.ptr, vector<16xi1>, vector<16xf32>) -> vector<16xf32>1823// CHECK: return %[[L]] : vector<16xf32>1824 1825// -----1826 1827func.func @masked_load_scalable(%arg0: memref<?xf32>, %arg1: vector<[16]xi1>, %arg2: vector<[16]xf32>) -> vector<[16]xf32> {1828 %c0 = arith.constant 0: index1829 %0 = vector.maskedload %arg0[%c0], %arg1, %arg2 : memref<?xf32>, vector<[16]xi1>, vector<[16]xf32> into vector<[16]xf32>1830 return %0 : vector<[16]xf32>1831}1832 1833// CHECK-LABEL: func @masked_load_scalable1834// CHECK: %[[CO:.*]] = arith.constant 0 : index1835// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[CO]] : index to i641836// CHECK: %[[P:.*]] = llvm.getelementptr %{{.*}}[%[[C]]] : (!llvm.ptr, i64) -> !llvm.ptr, f321837// CHECK: %[[L:.*]] = llvm.intr.masked.load %[[P]], %{{.*}}, %{{.*}} {alignment = 4 : i32} : (!llvm.ptr, vector<[16]xi1>, vector<[16]xf32>) -> vector<[16]xf32>1838// CHECK: return %[[L]] : vector<[16]xf32>1839 1840// -----1841 1842func.func @masked_load_index(%arg0: memref<?xindex>, %arg1: vector<16xi1>, %arg2: vector<16xindex>) -> vector<16xindex> {1843 %c0 = arith.constant 0: index1844 %0 = vector.maskedload %arg0[%c0], %arg1, %arg2 : memref<?xindex>, vector<16xi1>, vector<16xindex> into vector<16xindex>1845 return %0 : vector<16xindex>1846}1847// CHECK-LABEL: func @masked_load_index1848// CHECK: %{{.*}} = llvm.intr.masked.load %{{.*}}, %{{.*}}, %{{.*}} {alignment = 8 : i32} : (!llvm.ptr, vector<16xi1>, vector<16xi64>) -> vector<16xi64>1849 1850// -----1851 1852func.func @masked_load_index_scalable(%arg0: memref<?xindex>, %arg1: vector<[16]xi1>, %arg2: vector<[16]xindex>) -> vector<[16]xindex> {1853 %c0 = arith.constant 0: index1854 %0 = vector.maskedload %arg0[%c0], %arg1, %arg2 : memref<?xindex>, vector<[16]xi1>, vector<[16]xindex> into vector<[16]xindex>1855 return %0 : vector<[16]xindex>1856}1857// CHECK-LABEL: func @masked_load_index_scalable1858// CHECK: %{{.*}} = llvm.intr.masked.load %{{.*}}, %{{.*}}, %{{.*}} {alignment = 8 : i32} : (!llvm.ptr, vector<[16]xi1>, vector<[16]xi64>) -> vector<[16]xi64>1859 1860// -----1861 1862func.func @masked_load_with_alignment(%arg0: memref<?xf32>, %arg1: vector<16xi1>, %arg2: vector<16xf32>, %arg3: index) -> vector<16xf32> {1863 %0 = vector.maskedload %arg0[%arg3], %arg1, %arg2 { alignment = 2 } : memref<?xf32>, vector<16xi1>, vector<16xf32> into vector<16xf32>1864 return %0 : vector<16xf32>1865}1866 1867// CHECK-LABEL: func @masked_load_with_alignment1868// CHECK: llvm.intr.masked.load %{{.*}} {alignment = 2 : i32} : (!llvm.ptr, vector<16xi1>, vector<16xf32>) -> vector<16xf32>1869 1870// -----1871 1872//===----------------------------------------------------------------------===//1873// vector.maskedstore1874//===----------------------------------------------------------------------===//1875 1876func.func @masked_store(%arg0: memref<?xf32>, %arg1: vector<16xi1>, %arg2: vector<16xf32>) {1877 %c0 = arith.constant 0: index1878 vector.maskedstore %arg0[%c0], %arg1, %arg2 : memref<?xf32>, vector<16xi1>, vector<16xf32>1879 return1880}1881 1882// CHECK-LABEL: func @masked_store1883// CHECK: %[[CO:.*]] = arith.constant 0 : index1884// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[CO]] : index to i641885// CHECK: %[[P:.*]] = llvm.getelementptr %{{.*}}[%[[C]]] : (!llvm.ptr, i64) -> !llvm.ptr, f321886// CHECK: llvm.intr.masked.store %{{.*}}, %[[P]], %{{.*}} {alignment = 4 : i32} : vector<16xf32>, vector<16xi1> into !llvm.ptr1887 1888// -----1889 1890func.func @masked_store_scalable(%arg0: memref<?xf32>, %arg1: vector<[16]xi1>, %arg2: vector<[16]xf32>) {1891 %c0 = arith.constant 0: index1892 vector.maskedstore %arg0[%c0], %arg1, %arg2 : memref<?xf32>, vector<[16]xi1>, vector<[16]xf32>1893 return1894}1895 1896// CHECK-LABEL: func @masked_store_scalable1897// CHECK: %[[CO:.*]] = arith.constant 0 : index1898// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[CO]] : index to i641899// CHECK: %[[P:.*]] = llvm.getelementptr %{{.*}}[%[[C]]] : (!llvm.ptr, i64) -> !llvm.ptr, f321900// CHECK: llvm.intr.masked.store %{{.*}}, %[[P]], %{{.*}} {alignment = 4 : i32} : vector<[16]xf32>, vector<[16]xi1> into !llvm.ptr1901 1902// -----1903 1904func.func @masked_store_index(%arg0: memref<?xindex>, %arg1: vector<16xi1>, %arg2: vector<16xindex>) {1905 %c0 = arith.constant 0: index1906 vector.maskedstore %arg0[%c0], %arg1, %arg2 : memref<?xindex>, vector<16xi1>, vector<16xindex>1907 return1908}1909// CHECK-LABEL: func @masked_store_index1910// CHECK: llvm.intr.masked.store %{{.*}}, %{{.*}}, %{{.*}} {alignment = 8 : i32} : vector<16xi64>, vector<16xi1> into !llvm.ptr1911 1912// -----1913 1914func.func @masked_store_index_scalable(%arg0: memref<?xindex>, %arg1: vector<[16]xi1>, %arg2: vector<[16]xindex>) {1915 %c0 = arith.constant 0: index1916 vector.maskedstore %arg0[%c0], %arg1, %arg2 : memref<?xindex>, vector<[16]xi1>, vector<[16]xindex>1917 return1918}1919// CHECK-LABEL: func @masked_store_index_scalable1920// CHECK: llvm.intr.masked.store %{{.*}}, %{{.*}}, %{{.*}} {alignment = 8 : i32} : vector<[16]xi64>, vector<[16]xi1> into !llvm.ptr1921 1922// -----1923 1924func.func @masked_store_with_alignment(%arg0: memref<?xf32>, %arg1: vector<16xi1>, %arg2: vector<16xf32>, %arg3: index) {1925 vector.maskedstore %arg0[%arg3], %arg1, %arg2 { alignment = 2 } : memref<?xf32>, vector<16xi1>, vector<16xf32>1926 return1927}1928 1929// CHECK-LABEL: func @masked_store_with_alignment1930// CHECK: llvm.intr.masked.store %{{.*}} {alignment = 2 : i32} : vector<16xf32>, vector<16xi1> into !llvm.ptr1931 1932// -----1933 1934//===----------------------------------------------------------------------===//1935// vector.gather1936//===----------------------------------------------------------------------===//1937 1938func.func @gather(%arg0: memref<?xf32>, %arg1: vector<3xi32>, %arg2: vector<3xi1>, %arg3: vector<3xf32>) -> vector<3xf32> {1939 %0 = arith.constant 0: index1940 %1 = vector.gather %arg0[%0][%arg1], %arg2, %arg3 : memref<?xf32>, vector<3xi32>, vector<3xi1>, vector<3xf32> into vector<3xf32>1941 return %1 : vector<3xf32>1942}1943 1944// CHECK-LABEL: func @gather1945// CHECK: %[[P:.*]] = llvm.getelementptr %{{.*}}[%{{.*}}] : (!llvm.ptr, vector<3xi32>) -> vector<3x!llvm.ptr>, f321946// CHECK: %[[G:.*]] = llvm.intr.masked.gather %[[P]], %{{.*}}, %{{.*}} {alignment = 4 : i32} : (vector<3x!llvm.ptr>, vector<3xi1>, vector<3xf32>) -> vector<3xf32>1947// CHECK: return %[[G]] : vector<3xf32>1948 1949// -----1950 1951func.func @gather_scalable(%arg0: memref<?xf32>, %arg1: vector<[3]xi32>, %arg2: vector<[3]xi1>, %arg3: vector<[3]xf32>) -> vector<[3]xf32> {1952 %0 = arith.constant 0: index1953 %1 = vector.gather %arg0[%0][%arg1], %arg2, %arg3 : memref<?xf32>, vector<[3]xi32>, vector<[3]xi1>, vector<[3]xf32> into vector<[3]xf32>1954 return %1 : vector<[3]xf32>1955}1956 1957// CHECK-LABEL: func @gather_scalable1958// CHECK: %[[P:.*]] = llvm.getelementptr %{{.*}}[%{{.*}}] : (!llvm.ptr, vector<[3]xi32>) -> vector<[3]x!llvm.ptr>, f321959// CHECK: %[[G:.*]] = llvm.intr.masked.gather %[[P]], %{{.*}}, %{{.*}} {alignment = 4 : i32} : (vector<[3]x!llvm.ptr>, vector<[3]xi1>, vector<[3]xf32>) -> vector<[3]xf32>1960// CHECK: return %[[G]] : vector<[3]xf32>1961 1962// -----1963 1964func.func @gather_global_memory(%arg0: memref<?xf32, 1>, %arg1: vector<3xi32>, %arg2: vector<3xi1>, %arg3: vector<3xf32>) -> vector<3xf32> {1965 %0 = arith.constant 0: index1966 %1 = vector.gather %arg0[%0][%arg1], %arg2, %arg3 : memref<?xf32, 1>, vector<3xi32>, vector<3xi1>, vector<3xf32> into vector<3xf32>1967 return %1 : vector<3xf32>1968}1969 1970// CHECK-LABEL: func @gather_global_memory1971// CHECK: %[[P:.*]] = llvm.getelementptr %{{.*}}[%{{.*}}] : (!llvm.ptr<1>, vector<3xi32>) -> vector<3x!llvm.ptr<1>>, f321972// CHECK: %[[G:.*]] = llvm.intr.masked.gather %[[P]], %{{.*}}, %{{.*}} {alignment = 4 : i32} : (vector<3x!llvm.ptr<1>>, vector<3xi1>, vector<3xf32>) -> vector<3xf32>1973// CHECK: return %[[G]] : vector<3xf32>1974 1975// -----1976 1977func.func @gather_global_memory_scalable(%arg0: memref<?xf32, 1>, %arg1: vector<[3]xi32>, %arg2: vector<[3]xi1>, %arg3: vector<[3]xf32>) -> vector<[3]xf32> {1978 %0 = arith.constant 0: index1979 %1 = vector.gather %arg0[%0][%arg1], %arg2, %arg3 : memref<?xf32, 1>, vector<[3]xi32>, vector<[3]xi1>, vector<[3]xf32> into vector<[3]xf32>1980 return %1 : vector<[3]xf32>1981}1982 1983// CHECK-LABEL: func @gather_global_memory_scalable1984// CHECK: %[[P:.*]] = llvm.getelementptr %{{.*}}[%{{.*}}] : (!llvm.ptr<1>, vector<[3]xi32>) -> vector<[3]x!llvm.ptr<1>>, f321985// CHECK: %[[G:.*]] = llvm.intr.masked.gather %[[P]], %{{.*}}, %{{.*}} {alignment = 4 : i32} : (vector<[3]x!llvm.ptr<1>>, vector<[3]xi1>, vector<[3]xf32>) -> vector<[3]xf32>1986// CHECK: return %[[G]] : vector<[3]xf32>1987 1988// -----1989 1990 1991func.func @gather_index(%arg0: memref<?xindex>, %arg1: vector<3xindex>, %arg2: vector<3xi1>, %arg3: vector<3xindex>) -> vector<3xindex> {1992 %0 = arith.constant 0: index1993 %1 = vector.gather %arg0[%0][%arg1], %arg2, %arg3 : memref<?xindex>, vector<3xindex>, vector<3xi1>, vector<3xindex> into vector<3xindex>1994 return %1 : vector<3xindex>1995}1996 1997// CHECK-LABEL: func @gather_index1998// CHECK: %[[P:.*]] = llvm.getelementptr %{{.*}}[%{{.*}}] : (!llvm.ptr, vector<3xi64>) -> vector<3x!llvm.ptr>, i641999// CHECK: %[[G:.*]] = llvm.intr.masked.gather %{{.*}}, %{{.*}}, %{{.*}} {alignment = 8 : i32} : (vector<3x!llvm.ptr>, vector<3xi1>, vector<3xi64>) -> vector<3xi64>2000// CHECK: %{{.*}} = builtin.unrealized_conversion_cast %[[G]] : vector<3xi64> to vector<3xindex>2001 2002// -----2003 2004func.func @gather_index_scalable(%arg0: memref<?xindex>, %arg1: vector<[3]xindex>, %arg2: vector<[3]xi1>, %arg3: vector<[3]xindex>) -> vector<[3]xindex> {2005 %0 = arith.constant 0: index2006 %1 = vector.gather %arg0[%0][%arg1], %arg2, %arg3 : memref<?xindex>, vector<[3]xindex>, vector<[3]xi1>, vector<[3]xindex> into vector<[3]xindex>2007 return %1 : vector<[3]xindex>2008}2009 2010// CHECK-LABEL: func @gather_index_scalable2011// CHECK: %[[P:.*]] = llvm.getelementptr %{{.*}}[%{{.*}}] : (!llvm.ptr, vector<[3]xi64>) -> vector<[3]x!llvm.ptr>, i642012// CHECK: %[[G:.*]] = llvm.intr.masked.gather %{{.*}}, %{{.*}}, %{{.*}} {alignment = 8 : i32} : (vector<[3]x!llvm.ptr>, vector<[3]xi1>, vector<[3]xi64>) -> vector<[3]xi64>2013// CHECK: %{{.*}} = builtin.unrealized_conversion_cast %[[G]] : vector<[3]xi64> to vector<[3]xindex>2014 2015// -----2016 2017func.func @gather_1d_from_2d(%arg0: memref<4x4xf32>, %arg1: vector<4xi32>, %arg2: vector<4xi1>, %arg3: vector<4xf32>) -> vector<4xf32> {2018 %0 = arith.constant 3 : index2019 %1 = vector.gather %arg0[%0, %0][%arg1], %arg2, %arg3 : memref<4x4xf32>, vector<4xi32>, vector<4xi1>, vector<4xf32> into vector<4xf32>2020 return %1 : vector<4xf32>2021}2022 2023// CHECK-LABEL: func @gather_1d_from_2d2024// CHECK: %[[B:.*]] = llvm.getelementptr %{{.*}}[%{{.*}}] : (!llvm.ptr, i64) -> !llvm.ptr, f322025// CHECK: %[[P:.*]] = llvm.getelementptr %[[B]][%{{.*}}] : (!llvm.ptr, vector<4xi32>) -> vector<4x!llvm.ptr>, f322026// CHECK: %[[G:.*]] = llvm.intr.masked.gather %[[P]], %{{.*}}, %{{.*}} {alignment = 4 : i32} : (vector<4x!llvm.ptr>, vector<4xi1>, vector<4xf32>) -> vector<4xf32>2027// CHECK: return %[[G]] : vector<4xf32>2028 2029// -----2030 2031func.func @gather_1d_from_2d_scalable(%arg0: memref<4x?xf32>, %arg1: vector<[4]xi32>, %arg2: vector<[4]xi1>, %arg3: vector<[4]xf32>) -> vector<[4]xf32> {2032 %0 = arith.constant 3 : index2033 %1 = vector.gather %arg0[%0, %0][%arg1], %arg2, %arg3 : memref<4x?xf32>, vector<[4]xi32>, vector<[4]xi1>, vector<[4]xf32> into vector<[4]xf32>2034 return %1 : vector<[4]xf32>2035}2036 2037// CHECK-LABEL: func @gather_1d_from_2d_scalable2038// CHECK: %[[B:.*]] = llvm.getelementptr %{{.*}}[%{{.*}}] : (!llvm.ptr, i64) -> !llvm.ptr, f322039// CHECK: %[[P:.*]] = llvm.getelementptr %[[B]][%{{.*}}] : (!llvm.ptr, vector<[4]xi32>) -> vector<[4]x!llvm.ptr>, f322040// CHECK: %[[G:.*]] = llvm.intr.masked.gather %[[P]], %{{.*}}, %{{.*}} {alignment = 4 : i32} : (vector<[4]x!llvm.ptr>, vector<[4]xi1>, vector<[4]xf32>) -> vector<[4]xf32>2041// CHECK: return %[[G]] : vector<[4]xf32>2042 2043// -----2044 2045func.func @gather_with_alignment(%arg0: memref<?xf32>, %arg1: vector<3xi32>, %arg2: vector<3xi1>, %arg3: vector<3xf32>, %0: index) -> vector<3xf32> {2046 %1 = vector.gather %arg0[%0][%arg1], %arg2, %arg3 {alignment = 8} : memref<?xf32>, vector<3xi32>, vector<3xi1>, vector<3xf32> into vector<3xf32>2047 return %1 : vector<3xf32>2048}2049 2050// CHECK-LABEL: func @gather_with_alignment2051// CHECK: llvm.intr.masked.gather %{{.*}}, %{{.*}}, %{{.*}} {alignment = 8 : i32} : (vector<3x!llvm.ptr>, vector<3xi1>, vector<3xf32>) -> vector<3xf32>2052 2053// -----2054 2055//===----------------------------------------------------------------------===//2056// vector.scatter2057//===----------------------------------------------------------------------===//2058 2059func.func @scatter(%arg0: memref<?xf32>, %arg1: vector<3xi32>, %arg2: vector<3xi1>, %arg3: vector<3xf32>) {2060 %0 = arith.constant 0: index2061 vector.scatter %arg0[%0][%arg1], %arg2, %arg3 : memref<?xf32>, vector<3xi32>, vector<3xi1>, vector<3xf32>2062 return2063}2064 2065// CHECK-LABEL: func @scatter2066// CHECK: %[[P:.*]] = llvm.getelementptr %{{.*}}[%{{.*}}] : (!llvm.ptr, vector<3xi32>) -> vector<3x!llvm.ptr>, f322067// CHECK: llvm.intr.masked.scatter %{{.*}}, %[[P]], %{{.*}} {alignment = 4 : i32} : vector<3xf32>, vector<3xi1> into vector<3x!llvm.ptr>2068 2069// -----2070 2071func.func @scatter_scalable(%arg0: memref<?xf32>, %arg1: vector<[3]xi32>, %arg2: vector<[3]xi1>, %arg3: vector<[3]xf32>) {2072 %0 = arith.constant 0: index2073 vector.scatter %arg0[%0][%arg1], %arg2, %arg3 : memref<?xf32>, vector<[3]xi32>, vector<[3]xi1>, vector<[3]xf32>2074 return2075}2076 2077// CHECK-LABEL: func @scatter_scalable2078// CHECK: %[[P:.*]] = llvm.getelementptr %{{.*}}[%{{.*}}] : (!llvm.ptr, vector<[3]xi32>) -> vector<[3]x!llvm.ptr>, f322079// CHECK: llvm.intr.masked.scatter %{{.*}}, %[[P]], %{{.*}} {alignment = 4 : i32} : vector<[3]xf32>, vector<[3]xi1> into vector<[3]x!llvm.ptr>2080 2081// -----2082 2083func.func @scatter_index(%arg0: memref<?xindex>, %arg1: vector<3xindex>, %arg2: vector<3xi1>, %arg3: vector<3xindex>) {2084 %0 = arith.constant 0: index2085 vector.scatter %arg0[%0][%arg1], %arg2, %arg3 : memref<?xindex>, vector<3xindex>, vector<3xi1>, vector<3xindex>2086 return2087}2088 2089// CHECK-LABEL: func @scatter_index2090// CHECK: %[[P:.*]] = llvm.getelementptr %{{.*}}[%{{.*}}] : (!llvm.ptr, vector<3xi64>) -> vector<3x!llvm.ptr>, i642091// CHECK: llvm.intr.masked.scatter %{{.*}}, %[[P]], %{{.*}} {alignment = 8 : i32} : vector<3xi64>, vector<3xi1> into vector<3x!llvm.ptr>2092 2093// -----2094 2095func.func @scatter_index_scalable(%arg0: memref<?xindex>, %arg1: vector<[3]xindex>, %arg2: vector<[3]xi1>, %arg3: vector<[3]xindex>) {2096 %0 = arith.constant 0: index2097 vector.scatter %arg0[%0][%arg1], %arg2, %arg3 : memref<?xindex>, vector<[3]xindex>, vector<[3]xi1>, vector<[3]xindex>2098 return2099}2100 2101// CHECK-LABEL: func @scatter_index_scalable2102// CHECK: %[[P:.*]] = llvm.getelementptr %{{.*}}[%{{.*}}] : (!llvm.ptr, vector<[3]xi64>) -> vector<[3]x!llvm.ptr>, i642103// CHECK: llvm.intr.masked.scatter %{{.*}}, %[[P]], %{{.*}} {alignment = 8 : i32} : vector<[3]xi64>, vector<[3]xi1> into vector<[3]x!llvm.ptr>2104 2105// -----2106 2107func.func @scatter_1d_into_2d(%arg0: memref<4x4xf32>, %arg1: vector<4xi32>, %arg2: vector<4xi1>, %arg3: vector<4xf32>) {2108 %0 = arith.constant 3 : index2109 vector.scatter %arg0[%0, %0][%arg1], %arg2, %arg3 : memref<4x4xf32>, vector<4xi32>, vector<4xi1>, vector<4xf32>2110 return2111}2112 2113// CHECK-LABEL: func @scatter_1d_into_2d2114// CHECK: %[[B:.*]] = llvm.getelementptr %{{.*}}[%{{.*}}] : (!llvm.ptr, i64) -> !llvm.ptr, f322115// CHECK: %[[P:.*]] = llvm.getelementptr %[[B]][%{{.*}}] : (!llvm.ptr, vector<4xi32>) -> vector<4x!llvm.ptr>, f322116// CHECK: llvm.intr.masked.scatter %{{.*}}, %[[P]], %{{.*}} {alignment = 4 : i32} : vector<4xf32>, vector<4xi1> into vector<4x!llvm.ptr>2117 2118// -----2119 2120func.func @scatter_1d_into_2d_scalable(%arg0: memref<4x?xf32>, %arg1: vector<[4]xi32>, %arg2: vector<[4]xi1>, %arg3: vector<[4]xf32>) {2121 %0 = arith.constant 3 : index2122 vector.scatter %arg0[%0, %0][%arg1], %arg2, %arg3 : memref<4x?xf32>, vector<[4]xi32>, vector<[4]xi1>, vector<[4]xf32>2123 return2124}2125 2126// CHECK-LABEL: func @scatter_1d_into_2d_scalable2127// CHECK: %[[B:.*]] = llvm.getelementptr %{{.*}}[%{{.*}}] : (!llvm.ptr, i64) -> !llvm.ptr, f322128// CHECK: %[[P:.*]] = llvm.getelementptr %[[B]][%{{.*}}] : (!llvm.ptr, vector<[4]xi32>) -> vector<[4]x!llvm.ptr>, f322129// CHECK: llvm.intr.masked.scatter %{{.*}}, %[[P]], %{{.*}} {alignment = 4 : i32} : vector<[4]xf32>, vector<[4]xi1> into vector<[4]x!llvm.ptr>2130 2131// -----2132 2133func.func @scatter_with_alignment(%arg0: memref<?xf32>, %arg1: vector<3xi32>, %arg2: vector<3xi1>, %arg3: vector<3xf32>, %0: index) {2134 vector.scatter %arg0[%0][%arg1], %arg2, %arg3 { alignment = 8 } : memref<?xf32>, vector<3xi32>, vector<3xi1>, vector<3xf32>2135 return2136}2137 2138// CHECK-LABEL: func @scatter_with_alignment2139// CHECK: llvm.intr.masked.scatter %{{.*}}, %{{.*}}, %{{.*}} {alignment = 8 : i32} : vector<3xf32>, vector<3xi1> into vector<3x!llvm.ptr>2140 2141 2142// -----2143 2144//===----------------------------------------------------------------------===//2145// vector.expandload2146//===----------------------------------------------------------------------===//2147 2148func.func @expand_load_op(%arg0: memref<?xf32>, %arg1: vector<11xi1>, %arg2: vector<11xf32>) -> vector<11xf32> {2149 %c0 = arith.constant 0: index2150 %0 = vector.expandload %arg0[%c0], %arg1, %arg2 : memref<?xf32>, vector<11xi1>, vector<11xf32> into vector<11xf32>2151 return %0 : vector<11xf32>2152}2153 2154// CHECK-LABEL: func @expand_load_op2155// CHECK: %[[CO:.*]] = arith.constant 0 : index2156// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[CO]] : index to i642157// CHECK: %[[P:.*]] = llvm.getelementptr %{{.*}}[%[[C]]] : (!llvm.ptr, i64) -> !llvm.ptr, f322158// CHECK: %[[E:.*]] = "llvm.intr.masked.expandload"(%[[P]], %{{.*}}, %{{.*}}) : (!llvm.ptr, vector<11xi1>, vector<11xf32>) -> vector<11xf32>2159// CHECK: return %[[E]] : vector<11xf32>2160 2161// -----2162 2163func.func @expand_load_op_index(%arg0: memref<?xindex>, %arg1: vector<11xi1>, %arg2: vector<11xindex>) -> vector<11xindex> {2164 %c0 = arith.constant 0: index2165 %0 = vector.expandload %arg0[%c0], %arg1, %arg2 : memref<?xindex>, vector<11xi1>, vector<11xindex> into vector<11xindex>2166 return %0 : vector<11xindex>2167}2168// CHECK-LABEL: func @expand_load_op_index2169// CHECK: %{{.*}} = "llvm.intr.masked.expandload"(%{{.*}}, %{{.*}}, %{{.*}}) : (!llvm.ptr, vector<11xi1>, vector<11xi64>) -> vector<11xi64>2170 2171// -----2172 2173func.func @expand_load_op_with_alignment(%arg0: memref<?xindex>, %arg1: vector<11xi1>, %arg2: vector<11xindex>, %c0: index) -> vector<11xindex> {2174 %0 = vector.expandload %arg0[%c0], %arg1, %arg2 { alignment = 8 } : memref<?xindex>, vector<11xi1>, vector<11xindex> into vector<11xindex>2175 return %0 : vector<11xindex>2176}2177// CHECK-LABEL: func @expand_load_op_with_alignment2178// CHECK: %{{.*}} = "llvm.intr.masked.expandload"(%{{.*}}, %{{.*}}, %{{.*}}) <{arg_attrs = [{llvm.align = 8 : i64}, {}, {}]}> : (!llvm.ptr, vector<11xi1>, vector<11xi64>) -> vector<11xi64>2179 2180// -----2181 2182//===----------------------------------------------------------------------===//2183// vector.compressstore2184//===----------------------------------------------------------------------===//2185 2186func.func @compress_store_op(%arg0: memref<?xf32>, %arg1: vector<11xi1>, %arg2: vector<11xf32>) {2187 %c0 = arith.constant 0: index2188 vector.compressstore %arg0[%c0], %arg1, %arg2 : memref<?xf32>, vector<11xi1>, vector<11xf32>2189 return2190}2191 2192// CHECK-LABEL: func @compress_store_op2193// CHECK: %[[CO:.*]] = arith.constant 0 : index2194// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[CO]] : index to i642195// CHECK: %[[P:.*]] = llvm.getelementptr %{{.*}}[%[[C]]] : (!llvm.ptr, i64) -> !llvm.ptr, f322196// CHECK: "llvm.intr.masked.compressstore"(%{{.*}}, %[[P]], %{{.*}}) : (vector<11xf32>, !llvm.ptr, vector<11xi1>) -> ()2197 2198// -----2199 2200func.func @compress_store_op_index(%arg0: memref<?xindex>, %arg1: vector<11xi1>, %arg2: vector<11xindex>) {2201 %c0 = arith.constant 0: index2202 vector.compressstore %arg0[%c0], %arg1, %arg2 : memref<?xindex>, vector<11xi1>, vector<11xindex>2203 return2204}2205// CHECK-LABEL: func @compress_store_op_index2206// CHECK: "llvm.intr.masked.compressstore"(%{{.*}}, %{{.*}}, %{{.*}}) : (vector<11xi64>, !llvm.ptr, vector<11xi1>) -> ()2207 2208// -----2209 2210func.func @compress_store_op_with_alignment(%arg0: memref<?xindex>, %arg1: vector<11xi1>, %arg2: vector<11xindex>, %c0: index) {2211 vector.compressstore %arg0[%c0], %arg1, %arg2 { alignment = 8 } : memref<?xindex>, vector<11xi1>, vector<11xindex>2212 return2213}2214// CHECK-LABEL: func @compress_store_op_with_alignment2215// CHECK: "llvm.intr.masked.compressstore"(%{{.*}}, %{{.*}}, %{{.*}}) <{arg_attrs = [{}, {llvm.align = 8 : i64}, {}]}> : (vector<11xi64>, !llvm.ptr, vector<11xi1>) -> ()2216 2217// -----2218 2219//===----------------------------------------------------------------------===//2220// vector.scalable_insert2221//===----------------------------------------------------------------------===//2222 2223// CHECK-LABEL: @scalable_insert2224// CHECK-SAME: %[[SUB:.*]]: vector<4xf32>, %[[SV:.*]]: vector<[4]xf32>2225func.func @scalable_insert(%sub: vector<4xf32>, %dsv: vector<[4]xf32>) -> vector<[4]xf32> {2226 // CHECK-NEXT: %[[TMP:.*]] = llvm.intr.vector.insert %[[SUB]], %[[SV]][0] : vector<4xf32> into vector<[4]xf32>2227 %0 = vector.scalable.insert %sub, %dsv[0] : vector<4xf32> into vector<[4]xf32>2228 // CHECK-NEXT: llvm.intr.vector.insert %[[SUB]], %[[TMP]][4] : vector<4xf32> into vector<[4]xf32>2229 %1 = vector.scalable.insert %sub, %0[4] : vector<4xf32> into vector<[4]xf32>2230 return %1 : vector<[4]xf32>2231}2232 2233// -----2234 2235//===----------------------------------------------------------------------===//2236// vector.scalable_extract2237//===----------------------------------------------------------------------===//2238 2239// CHECK-LABEL: @scalable_extract2240// CHECK-SAME: %[[VEC:.*]]: vector<[4]xf32>2241func.func @scalable_extract(%vec: vector<[4]xf32>) -> vector<8xf32> {2242 // CHECK-NEXT: %{{.*}} = llvm.intr.vector.extract %[[VEC]][0] : vector<8xf32> from vector<[4]xf32>2243 %0 = vector.scalable.extract %vec[0] : vector<8xf32> from vector<[4]xf32>2244 return %0 : vector<8xf32>2245}2246 2247// -----2248 2249//===----------------------------------------------------------------------===//2250// vector.interleave2251//===----------------------------------------------------------------------===//2252 2253// CHECK-LABEL: @interleave_0d2254// CHECK-SAME: %[[LHS:.*]]: vector<i8>, %[[RHS:.*]]: vector<i8>)2255func.func @interleave_0d(%a: vector<i8>, %b: vector<i8>) -> vector<2xi8> {2256 // CHECK-DAG: %[[LHS_RANK1:.*]] = builtin.unrealized_conversion_cast %[[LHS]] : vector<i8> to vector<1xi8>2257 // CHECK-DAG: %[[RHS_RANK1:.*]] = builtin.unrealized_conversion_cast %[[RHS]] : vector<i8> to vector<1xi8>2258 // CHECK: %[[ZIP:.*]] = llvm.shufflevector %[[LHS_RANK1]], %[[RHS_RANK1]] [0, 1] : vector<1xi8>2259 // CHECK: return %[[ZIP]]2260 %0 = vector.interleave %a, %b : vector<i8> -> vector<2xi8>2261 return %0 : vector<2xi8>2262}2263 2264// -----2265 2266// CHECK-LABEL: @interleave_1d2267// CHECK-SAME: %[[LHS:.*]]: vector<8xf32>, %[[RHS:.*]]: vector<8xf32>)2268func.func @interleave_1d(%a: vector<8xf32>, %b: vector<8xf32>) -> vector<16xf32> {2269 // CHECK: %[[ZIP:.*]] = llvm.shufflevector %[[LHS]], %[[RHS]] [0, 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15] : vector<8xf32>2270 // CHECK: return %[[ZIP]]2271 %0 = vector.interleave %a, %b : vector<8xf32> -> vector<16xf32>2272 return %0 : vector<16xf32>2273}2274 2275// -----2276 2277// CHECK-LABEL: @interleave_1d_scalable2278// CHECK-SAME: %[[LHS:.*]]: vector<[4]xi32>, %[[RHS:.*]]: vector<[4]xi32>)2279func.func @interleave_1d_scalable(%a: vector<[4]xi32>, %b: vector<[4]xi32>) -> vector<[8]xi32> {2280 // CHECK: %[[ZIP:.*]] = "llvm.intr.vector.interleave2"(%[[LHS]], %[[RHS]]) : (vector<[4]xi32>, vector<[4]xi32>) -> vector<[8]xi32>2281 // CHECK: return %[[ZIP]]2282 %0 = vector.interleave %a, %b : vector<[4]xi32> -> vector<[8]xi32>2283 return %0 : vector<[8]xi32>2284}2285 2286// -----2287 2288//===----------------------------------------------------------------------===//2289// vector.deinterleave2290//===----------------------------------------------------------------------===//2291 2292// CHECK-LABEL: @deinterleave_1d2293// CHECK-SAME: (%[[ARG:.*]]: vector<4xi32>) -> (vector<2xi32>, vector<2xi32>)2294func.func @deinterleave_1d(%arg: vector<4xi32>) -> (vector<2xi32>, vector<2xi32>) {2295 // CHECK: %[[POISON:.*]] = llvm.mlir.poison : vector<4xi32>2296 // CHECK: llvm.shufflevector %[[ARG]], %[[POISON]] [0, 2] : vector<4xi32>2297 // CHECK: llvm.shufflevector %[[ARG]], %[[POISON]] [1, 3] : vector<4xi32>2298 %0, %1 = vector.deinterleave %arg : vector<4xi32> -> vector<2xi32>2299 return %0, %1 : vector<2xi32>, vector<2xi32>2300}2301 2302// -----2303 2304// CHECK-LABEL: @deinterleave_1d_scalable2305// CHECK-SAME: %[[ARG:.*]]: vector<[4]xi32>) -> (vector<[2]xi32>, vector<[2]xi32>)2306func.func @deinterleave_1d_scalable(%arg: vector<[4]xi32>) -> (vector<[2]xi32>, vector<[2]xi32>) {2307 // CHECK: %[[RES:.*]] = "llvm.intr.vector.deinterleave2"(%[[ARG]]) : (vector<[4]xi32>) -> !llvm.struct<(vector<[2]xi32>, vector<[2]xi32>)>2308 // CHECK: llvm.extractvalue %[[RES]][0] : !llvm.struct<(vector<[2]xi32>, vector<[2]xi32>)>2309 // CHECK: llvm.extractvalue %[[RES]][1] : !llvm.struct<(vector<[2]xi32>, vector<[2]xi32>)>2310 %0, %1 = vector.deinterleave %arg : vector<[4]xi32> -> vector<[2]xi32>2311 return %0, %1 : vector<[2]xi32>, vector<[2]xi32>2312}2313 2314// -----2315 2316//===----------------------------------------------------------------------===//2317// vector.from_elements2318//===----------------------------------------------------------------------===//2319 2320// CHECK-LABEL: func.func @from_elements_1d(2321// CHECK-SAME: %[[ARG_0:.*]]: f32, %[[ARG_1:.*]]: f32)2322// CHECK: %[[UNDEF:.*]] = llvm.mlir.poison : vector<3xf32>2323// CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : i64) : i642324// CHECK: %[[INSERT0:.*]] = llvm.insertelement %[[ARG_0]], %[[UNDEF]][%[[C0]] : i64] : vector<3xf32>2325// CHECK: %[[C1:.*]] = llvm.mlir.constant(1 : i64) : i642326// CHECK: %[[INSERT1:.*]] = llvm.insertelement %[[ARG_1]], %[[INSERT0]][%[[C1]] : i64] : vector<3xf32>2327// CHECK: %[[C2:.*]] = llvm.mlir.constant(2 : i64) : i642328// CHECK: %[[INSERT2:.*]] = llvm.insertelement %[[ARG_0]], %[[INSERT1]][%[[C2]] : i64] : vector<3xf32>2329// CHECK: return %[[INSERT2]]2330func.func @from_elements_1d(%arg0: f32, %arg1: f32) -> vector<3xf32> {2331 %0 = vector.from_elements %arg0, %arg1, %arg0 : vector<3xf32>2332 return %0 : vector<3xf32>2333}2334 2335// -----2336 2337// CHECK-LABEL: func.func @from_elements_0d(2338// CHECK-SAME: %[[ARG_0:.*]]: f32)2339// CHECK: %[[UNDEF:.*]] = llvm.mlir.poison : vector<1xf32>2340// CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : i64) : i642341// CHECK: %[[INSERT0:.*]] = llvm.insertelement %[[ARG_0]], %[[UNDEF]][%[[C0]] : i64] : vector<1xf32>2342// CHECK: %[[CAST:.*]] = builtin.unrealized_conversion_cast %[[INSERT0]] : vector<1xf32> to vector<f32>2343// CHECK: return %[[CAST]]2344func.func @from_elements_0d(%arg0: f32) -> vector<f32> {2345 %0 = vector.from_elements %arg0 : vector<f32>2346 return %0 : vector<f32>2347}2348 2349// -----2350 2351//===----------------------------------------------------------------------===//2352// vector.to_elements2353//===----------------------------------------------------------------------===//2354 2355// CHECK-LABEL: func.func @to_elements_no_dead_elements2356 // CHECK-SAME: %[[A:.*]]: vector<4xf32>)2357 // CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : i64) : i642358 // CHECK: %[[ELEM0:.*]] = llvm.extractelement %[[A]][%[[C0]] : i64] : vector<4xf32>2359 // CHECK: %[[C1:.*]] = llvm.mlir.constant(1 : i64) : i642360 // CHECK: %[[ELEM1:.*]] = llvm.extractelement %[[A]][%[[C1]] : i64] : vector<4xf32>2361 // CHECK: %[[C2:.*]] = llvm.mlir.constant(2 : i64) : i642362 // CHECK: %[[ELEM2:.*]] = llvm.extractelement %[[A]][%[[C2]] : i64] : vector<4xf32>2363 // CHECK: %[[C3:.*]] = llvm.mlir.constant(3 : i64) : i642364 // CHECK: %[[ELEM3:.*]] = llvm.extractelement %[[A]][%[[C3]] : i64] : vector<4xf32>2365 // CHECK: return %[[ELEM0]], %[[ELEM1]], %[[ELEM2]], %[[ELEM3]] : f32, f32, f32, f322366func.func @to_elements_no_dead_elements(%a: vector<4xf32>) -> (f32, f32, f32, f32) {2367 %0:4 = vector.to_elements %a : vector<4xf32>2368 return %0#0, %0#1, %0#2, %0#3 : f32, f32, f32, f322369}2370 2371// -----2372 2373// CHECK-LABEL: func.func @to_elements_dead_elements2374 // CHECK-SAME: %[[A:.*]]: vector<4xf32>)2375 // CHECK-NOT: llvm.mlir.constant(0 : i64) : i642376 // CHECK: %[[C1:.*]] = llvm.mlir.constant(1 : i64) : i642377 // CHECK: %[[ELEM1:.*]] = llvm.extractelement %[[A]][%[[C1]] : i64] : vector<4xf32>2378 // CHECK-NOT: llvm.mlir.constant(2 : i64) : i642379 // CHECK: %[[C3:.*]] = llvm.mlir.constant(3 : i64) : i642380 // CHECK: %[[ELEM3:.*]] = llvm.extractelement %[[A]][%[[C3]] : i64] : vector<4xf32>2381 // CHECK: return %[[ELEM1]], %[[ELEM3]] : f32, f322382func.func @to_elements_dead_elements(%a: vector<4xf32>) -> (f32, f32) {2383 %0:4 = vector.to_elements %a : vector<4xf32>2384 return %0#1, %0#3 : f32, f322385}2386 2387// -----2388 2389//===----------------------------------------------------------------------===//2390// vector.step2391//===----------------------------------------------------------------------===//2392 2393// CHECK-LABEL: @step_scalable2394// CHECK: %[[STEPVECTOR:.*]] = llvm.intr.stepvector : vector<[4]xi64>2395// CHECK: %[[CAST:.*]] = builtin.unrealized_conversion_cast %[[STEPVECTOR]] : vector<[4]xi64> to vector<[4]xindex>2396// CHECK: return %[[CAST]] : vector<[4]xindex>2397func.func @step_scalable() -> vector<[4]xindex> {2398 %0 = vector.step : vector<[4]xindex>2399 return %0 : vector<[4]xindex>2400}2401