677 lines · plain
1// RUN: mlir-opt %s -test-vector-to-vector-lowering -split-input-file| FileCheck %s2 3// CHECK-DAG: #[[$map0:.*]] = affine_map<(d0, d1, d2) -> (d0, d2)>4// CHECK-DAG: #[[$map1:.*]] = affine_map<(d0, d1, d2) -> (d2, d1)>5// CHECK-DAG: #[[$map2:.*]] = affine_map<(d0, d1, d2) -> (d0, d1)>6 7// CHECK-LABEL: cast_away_contraction_leading_one_dims8// CHECK-NEXT: %[[R0:.+]] = vector.extract %{{.*}}[0] : vector<16x8xf32> from vector<1x16x8xf32>9// CHECK-NEXT: %[[R1:.+]] = vector.extract %{{.*}}[0] : vector<8x16xf32> from vector<1x8x16xf32>10// CHECK-NEXT: %[[R2:.+]] = vector.extract %{{.*}}[0] : vector<16x16xf32> from vector<1x16x16xf32>11// CHECK-NEXT: %[[R3:.+]] = vector.contract {indexing_maps = [#[[$map0]], #[[$map1]], #[[$map2]]],12// CHECK-SAME: iterator_types = ["parallel", "parallel", "reduction"], kind = #vector.kind<add>}13// CHECK-SAME: %[[R0]], %[[R1]], %[[R2]] : vector<16x8xf32>, vector<8x16xf32> into vector<16x16xf32>14// CHECK-NEXT: %[[R4:.+]] = vector.broadcast %[[R3]] : vector<16x16xf32> to vector<1x16x16xf32>15// CHECK-NEXT: return %[[R4]] : vector<1x16x16xf32>16 17#contraction_accesses0 = [18 affine_map<(l, i, j, k) -> (l, i, k)>,19 affine_map<(l, i, j, k) -> (l, k, j)>,20 affine_map<(l, i, j, k) -> (l, i, j)>21]22#contraction_trait0 = {23 indexing_maps = #contraction_accesses0,24 iterator_types = ["parallel", "parallel", "parallel", "reduction"]25}26 27func.func @cast_away_contraction_leading_one_dims(%arg0: vector<1x16x8xf32>, %arg1: vector<1x8x16xf32>, %arg2: vector<1x16x16xf32>) -> vector<1x16x16xf32> {28 %0 = vector.contract #contraction_trait0 %arg0, %arg1, %arg2 : vector<1x16x8xf32>, vector<1x8x16xf32> into vector<1x16x16xf32>29 return %0: vector<1x16x16xf32>30}31 32// -----33// CHECK: #[[$MAP_0:.+]] = affine_map<(d0, d1, d2) -> (d0, d2)>34// CHECK: #[[$MAP_1:.+]] = affine_map<(d0, d1, d2) -> (d2, d1)>35// CHECK: #[[$MAP_2:.+]] = affine_map<(d0, d1, d2) -> (d0, d1)>36 37// CHECK-LABEL: func.func @cast_away_contraction_leading_one_dim_under_const_mask38// CHECK: %[[MASK:.*]] = vector.constant_mask [15, 15, 8] : vector<16x16x8xi1>39// CHECK: %[[R0:.*]] = vector.extract %{{.*}}[0] : vector<16x8xf32> from vector<1x16x8xf32>40// CHECK: %[[R1:.*]] = vector.extract %{{.*}}[0] : vector<8x16xf32> from vector<1x8x16xf32>41// CHECK: %[[R2:.*]] = vector.extract %{{.*}}[0] : vector<16x16xf32> from vector<1x16x16xf32>42// CHECK: %[[CONTRACT:.*]] = vector.mask %[[MASK]] {43// CHECK-SAME: vector.contract {indexing_maps = [#[[$MAP_0]], #[[$MAP_1]], #[[$MAP_2]]], iterator_types = ["parallel", "parallel", "reduction"], kind = #vector.kind<add>}44// CHECK-SAME: %[[R0]], %[[R1]], %[[R2]] : vector<16x8xf32>, vector<8x16xf32> into vector<16x16xf32>45// CHECK-SAME: } : vector<16x16x8xi1> -> vector<16x16xf32>46// CHECK: %[[RES:.*]] = vector.broadcast %[[CONTRACT]] : vector<16x16xf32> to vector<1x16x16xf32>47// CHECK: return %[[RES]] : vector<1x16x16xf32>48 49#contraction_accesses0 = [50 affine_map<(l, i, j, k) -> (l, i, k)>,51 affine_map<(l, i, j, k) -> (l, k, j)>,52 affine_map<(l, i, j, k) -> (l, i, j)>53]54#contraction_trait0 = {55 indexing_maps = #contraction_accesses0,56 iterator_types = ["parallel", "parallel", "parallel", "reduction"]57}58 59func.func @cast_away_contraction_leading_one_dim_under_const_mask(%arg0: vector<1x16x8xf32>, %arg1: vector<1x8x16xf32>, %arg2: vector<1x16x16xf32>) -> vector<1x16x16xf32> {60 %mask = vector.constant_mask [1, 15, 15, 8] : vector<1x16x16x8xi1>61 %0 = vector.mask %mask {62 vector.contract #contraction_trait0 %arg0, %arg1, %arg2 : vector<1x16x8xf32>, vector<1x8x16xf32> into vector<1x16x16xf32>63 } : vector<1x16x16x8xi1> -> vector<1x16x16xf32>64 return %0 : vector<1x16x16xf32>65}66 67// -----68// CHECK-DAG: #[[$MAP0:.+]] = affine_map<(d0, d1, d2) -> (d0, d2)>69// CHECK-DAG: #[[$MAP1:.+]] = affine_map<(d0, d1, d2) -> (d2, d1)>70// CHECK-DAG: #[[$MAP2:.+]] = affine_map<(d0, d1, d2) -> (d0, d1)>71 72// CHECK-LABEL: func.func @cast_away_contraction_leading_one_dim_under_mask73// CHECK: %[[R0:.*]] = vector.extract %{{.*}} : vector<16x8xf32> from vector<1x16x8xf32>74// CHECK: %[[R1:.*]] = vector.extract %{{.*}} : vector<8x16xf32> from vector<1x8x16xf32>75// CHECK: %[[R2:.*]] = vector.extract %{{.*}} : vector<16x16xf32> from vector<1x16x16xf32>76// CHECK: %[[M:.*]] = vector.extract %{{.*}} : vector<16x16x8xi1> from vector<1x16x16x8xi1>77// CHECK: %[[CONTRACT:.*]] = vector.mask %[[M]] {78// CHECK-SAME: vector.contract {indexing_maps = [#[[$MAP0]], #[[$MAP1]], #[[$MAP2]]], iterator_types = ["parallel", "parallel", "reduction"], kind = #vector.kind<add>}79// CHECK-SAME: %[[R0]], %[[R1]], %[[R2]] : vector<16x8xf32>, vector<8x16xf32> into vector<16x16xf32>80// CHECK-SAME: } : vector<16x16x8xi1> -> vector<16x16xf32>81// CHECK-NEXT: %[[RES:.*]] = vector.broadcast %[[CONTRACT]] : vector<16x16xf32> to vector<1x16x16xf32>82// CHECK-NEXT: return %[[RES]] : vector<1x16x16xf32>83 84#contraction_accesses0 = [85 affine_map<(l, i, j, k) -> (l, i, k)>,86 affine_map<(l, i, j, k) -> (l, k, j)>,87 affine_map<(l, i, j, k) -> (l, i, j)>88]89#contraction_trait0 = {90 indexing_maps = #contraction_accesses0,91 iterator_types = ["parallel", "parallel", "parallel", "reduction"]92}93 94func.func @cast_away_contraction_leading_one_dim_under_mask(95 %arg0: vector<1x16x8xf32>,96 %arg1: vector<1x8x16xf32>,97 %arg2: vector<1x16x16xf32>,98 %mask: vector<1x16x16x8xi1>) -> vector<1x16x16xf32> {99 %0 = vector.mask %mask {100 vector.contract #contraction_trait0 %arg0, %arg1, %arg2 : vector<1x16x8xf32>, vector<1x8x16xf32> into vector<1x16x16xf32>101 } : vector<1x16x16x8xi1> -> vector<1x16x16xf32>102 return %0: vector<1x16x16xf32>103}104 105// -----106 107// CHECK-DAG: #[[$map0:.*]] = affine_map<(d0, d1) -> (d1)>108// CHECK-DAG: #[[$map1:.*]] = affine_map<(d0, d1) -> (d1, d0)>109// CHECK-DAG: #[[$map2:.*]] = affine_map<(d0, d1) -> (d0)>110 111// CHECK-LABEL: cast_away_contraction_leading_one_dims_transposeneeded112// CHECK-NEXT: %[[R0:.+]] = vector.extract %{{.*}}[0] : vector<8x16xf32> from vector<1x8x16xf32>113// CHECK-NEXT: %[[R1:.+]] = vector.extract %{{.*}}[0, 0] : vector<8xf32> from vector<1x1x8xf32>114// CHECK-NEXT: %[[R2:.+]] = vector.extract %{{.*}}[0, 0] : vector<16xf32> from vector<1x1x16xf32>115// CHECK-NEXT: %[[R3:.+]] = vector.contract {indexing_maps = [#[[$map0]], #[[$map1]], #[[$map2]]],116// CHECK-SAME: iterator_types = ["parallel", "reduction"], kind = #vector.kind<mul>}117// CHECK-SAME: %[[R1]], %[[R0]], %[[R2]] : vector<8xf32>, vector<8x16xf32> into vector<16xf32>118// CHECK-NEXT: %[[R4:.+]] = vector.broadcast %[[R3]] : vector<16xf32> to vector<1x16xf32>119// CHECK-NEXT: %[[R5:.+]] = vector.broadcast %[[R4]] : vector<1x16xf32> to vector<1x1x16xf32>120// CHECK-NEXT: return %[[R5]] : vector<1x1x16xf32>121 122#contraction_accesses1 = [123 affine_map<(l, i, j, k) -> (i, l, k)>,124 affine_map<(l, i, j, k) -> (l, k, j)>,125 affine_map<(l, i, j, k) -> (l, i, j)>126]127#contraction_trait1 = {128 indexing_maps = #contraction_accesses1,129 iterator_types = ["parallel", "parallel", "parallel", "reduction"],130 kind = #vector.kind<mul>131}132 133func.func @cast_away_contraction_leading_one_dims_transposeneeded(%arg0: vector<1x1x8xf32>, %arg1: vector<1x8x16xf32>, %arg2: vector<1x1x16xf32>) -> vector<1x1x16xf32> {134 %0 = vector.contract #contraction_trait1 %arg0, %arg1, %arg2 : vector<1x1x8xf32>, vector<1x8x16xf32> into vector<1x1x16xf32>135 return %0: vector<1x1x16xf32>136}137 138// -----139// CHECK-DAG: #[[$map0:.*]] = affine_map<(d0, d1, d2) -> (d2, d1)>140// CHECK-DAG: #[[$map1:.*]] = affine_map<(d0, d1, d2) -> (d0, d2)>141// CHECK-DAG: #[[$map2:.*]] = affine_map<(d0, d1, d2) -> (d0, d1)>142 143// CHECK-LABEL: cast_away_contraction_leading_one_dims_transposeneeded2144// CHECK-NEXT: %[[R0:.+]] = vector.transpose %{{.*}}[1, 0, 2] : vector<8x1x16xf32> to vector<1x8x16xf32>145// CHECK-NEXT: %[[R1:.+]] = vector.extract %[[R0]][0] : vector<8x16xf32> from vector<1x8x16xf32>146// CHECK-NEXT: %[[R2:.+]] = vector.transpose %{{.*}}[2, 0, 1] : vector<2x8x1xf32> to vector<1x2x8xf32>147// CHECK-NEXT: %[[R3:.+]] = vector.extract %[[R2]][0] : vector<2x8xf32> from vector<1x2x8xf32>148// CHECK-NEXT: %[[R4:.+]] = vector.extract %{{.*}}[0] : vector<2x16xf32> from vector<1x2x16xf32>149// CHECK-NEXT: %[[R5:.+]] = vector.contract {indexing_maps = [#[[$map0]], #[[$map1]], #[[$map2]]],150// CHECK-SAME: iterator_types = ["parallel", "parallel", "reduction"], kind = #vector.kind<add>}151// CHECK-SAME: %[[R1]], %[[R3]], %[[R4]] : vector<8x16xf32>, vector<2x8xf32> into vector<2x16xf32>152// CHECK-NEXT: %[[R6:.+]] = vector.broadcast %[[R5]] : vector<2x16xf32> to vector<1x2x16xf32>153// CHECK-NEXT: return %[[R6]] : vector<1x2x16xf32>154 155#contraction_accesses2 = [156 affine_map<(l, i, j, k) -> (k, l, j)>,157 affine_map<(l, i, j, k) -> (i, k, l)>,158 affine_map<(l, i, j, k) -> (l, i, j)>159]160#contraction_trait2 = {161 indexing_maps = #contraction_accesses2,162 iterator_types = ["parallel", "parallel", "parallel", "reduction"]163}164 165 166func.func @cast_away_contraction_leading_one_dims_transposeneeded2(%arg0: vector<8x1x16xf32>, %arg1: vector<2x8x1xf32>, %arg2: vector<1x2x16xf32>) -> vector<1x2x16xf32> {167 %0 = vector.contract #contraction_trait2 %arg0, %arg1, %arg2 : vector<8x1x16xf32>, vector<2x8x1xf32> into vector<1x2x16xf32>168 return %0: vector<1x2x16xf32>169}170 171// -----172// CHECK-DAG: #[[$map0:.*]] = affine_map<(d0, d1, d2) -> (d2, d1)>173// CHECK-DAG: #[[$map1:.*]] = affine_map<(d0, d1, d2) -> (d0, d2)>174// CHECK-DAG: #[[$map2:.*]] = affine_map<(d0, d1, d2) -> (d0, d1)>175 176 177// CHECK-LABEL: cast_away_contraction_leading_one_dims_nonleadingunitdim_rank4178// CHECK-NEXT: %[[R0:.+]] = vector.extract %{{.*}}[0] : vector<8x1x16xf32> from vector<1x8x1x16xf32>179// CHECK-NEXT: %[[R1:.+]] = vector.extract %{{.*}}[0] : vector<2x8x1xf32> from vector<1x2x8x1xf32>180// CHECK-NEXT: %[[R2:.+]] = vector.transpose %[[R0]], [1, 0, 2] : vector<8x1x16xf32> to vector<1x8x16xf32>181// CHECK-NEXT: %[[R3:.+]] = vector.extract %[[R2]][0] : vector<8x16xf32> from vector<1x8x16xf32>182// CHECK-NEXT: %[[R4:.+]] = vector.transpose %[[R1]], [2, 0, 1] : vector<2x8x1xf32> to vector<1x2x8xf32>183// CHECK-NEXT: %[[R5:.+]] = vector.extract %[[R4]][0] : vector<2x8xf32> from vector<1x2x8xf32>184// CHECK-NEXT: %[[R6:.+]] = vector.extract %{{.*}}[0, 0] : vector<2x16xf32> from vector<1x1x2x16xf32>185// CHECK-NEXT: %[[R7:.+]] = vector.contract {indexing_maps = [#[[$map0]], #[[$map1]], #[[$map2]]],186// CHECK-SAME: iterator_types = ["parallel", "parallel", "reduction"], kind = #vector.kind<add>}187// CHECK-SAME: %[[R3]], %[[R5]], %[[R6]] : vector<8x16xf32>, vector<2x8xf32> into vector<2x16xf32>188// CHECK-NEXT: %[[R8:.+]] = vector.broadcast %[[R7]] : vector<2x16xf32> to vector<1x2x16xf32>189// CHECK-NEXT: %[[R9:.+]] = vector.broadcast %[[R8]] : vector<1x2x16xf32> to vector<1x1x2x16xf32>190// CHECK-NEXT: return %[[R9]] : vector<1x1x2x16xf32>191 192#contraction_accesses2 = [193 affine_map<(m, l, i, j, k) -> (m, k, l, j)>,194 affine_map<(m, l, i, j, k) -> (m, i, k, l)>,195 affine_map<(m, l, i, j, k) -> (m, l, i, j)>196]197#contraction_trait2 = {198 indexing_maps = #contraction_accesses2,199 iterator_types = ["parallel","parallel", "parallel", "parallel", "reduction"]200}201 202 203func.func @cast_away_contraction_leading_one_dims_nonleadingunitdim_rank4(%arg0: vector<1x8x1x16xf32>, %arg1: vector<1x2x8x1xf32>, %arg2: vector<1x1x2x16xf32>) -> vector<1x1x2x16xf32> {204 %0 = vector.contract #contraction_trait2 %arg0, %arg1, %arg2 : vector<1x8x1x16xf32>, vector<1x2x8x1xf32> into vector<1x1x2x16xf32>205 return %0: vector<1x1x2x16xf32>206}207 208// -----209// CHECK-DAG: #[[$map0:.*]] = affine_map<(d0, d1, d2) -> (d2, d1)>210// CHECK-DAG: #[[$map1:.*]] = affine_map<(d0, d1, d2) -> (d0, d2)>211// CHECK-DAG: #[[$map2:.*]] = affine_map<(d0, d1, d2) -> (d0, d1)>212 213// CHECK-LABEL: cast_away_contraction_leading_one_dims_nonleadingunitdim_rank4_acctranspose214// CHECK-NEXT: %[[R0:.+]] = vector.transpose %{{.*}}, [2, 0, 1, 3] : vector<1x8x1x16xf32> to vector<1x1x8x16xf32>215// CHECK-NEXT: %[[R1:.+]] = vector.transpose %{{.*}}, [3, 0, 1, 2] : vector<1x2x8x1xf32> to vector<1x1x2x8xf32>216// CHECK-NEXT: %[[R2:.+]] = vector.extract %[[R0]][0, 0] : vector<8x16xf32> from vector<1x1x8x16xf32>217// CHECK-NEXT: %[[R3:.+]] = vector.extract %[[R1]][0, 0] : vector<2x8xf32> from vector<1x1x2x8xf32>218// CHECK-NEXT: %[[R4:.+]] = vector.extract %{{.*}}[0, 0] : vector<2x16xf32> from vector<1x1x2x16xf32>219// CHECK-NEXT: %[[R5:.+]] = vector.contract {indexing_maps = [#[[$map0]], #[[$map1]], #[[$map2]]],220// CHECK-SAME: iterator_types = ["parallel", "parallel", "reduction"], kind = #vector.kind<add>}221// CHECK-SAME: %[[R2]], %[[R3]], %[[R4]] : vector<8x16xf32>, vector<2x8xf32> into vector<2x16xf32>222// CHECK-NEXT: %[[R6:.+]] = vector.broadcast %[[R5]] : vector<2x16xf32> to vector<1x2x16xf32>223// CHECK-NEXT: %[[R7:.+]] = vector.broadcast %[[R6]] : vector<1x2x16xf32> to vector<1x1x2x16xf32>224// CHECK-NEXT: return %[[R7]] : vector<1x1x2x16xf32>225 226#contraction_accesses3 = [227 affine_map<(m, l, i, j, k) -> (m, k, l, j)>,228 affine_map<(m, l, i, j, k) -> (m, i, k, l)>,229 affine_map<(m, l, i, j, k) -> (l, m, i, j)>230]231#contraction_trait3 = {232 indexing_maps = #contraction_accesses3,233 iterator_types = ["parallel","parallel", "parallel", "parallel", "reduction"]234}235 236func.func @cast_away_contraction_leading_one_dims_nonleadingunitdim_rank4_acctranspose(%arg0: vector<1x8x1x16xf32>, %arg1: vector<1x2x8x1xf32>, %arg2: vector<1x1x2x16xf32>) -> vector<1x1x2x16xf32> {237 %0 = vector.contract #contraction_trait3 %arg0, %arg1, %arg2 : vector<1x8x1x16xf32>, vector<1x2x8x1xf32> into vector<1x1x2x16xf32>238 return %0: vector<1x1x2x16xf32>239}240 241// -----242 243// CHECK-LABEL: func.func @cast_away_contraction_does_not_transpose_leading_unit_dims244// CHECK-NOT: vector.transpose245// CHECK: vector.contract246func.func @cast_away_contraction_does_not_transpose_leading_unit_dims(%lhs: vector<1x1x8xi32>,247 %rhs: vector<1x8x8xi32>,248 %acc: vector<1x8xi32>) -> vector<1x8xi32> {249 %result = vector.contract {indexing_maps = [affine_map<(d0, d1, d2, d3) -> (d0, d1, d3)>, affine_map<(d0, d1, d2, d3) -> (d0, d2, d3)>, affine_map<(d0, d1, d2, d3) -> (d1, d2)>], iterator_types = ["parallel", "parallel", "parallel", "reduction"], kind = #vector.kind<add>} %lhs, %rhs, %acc : vector<1x1x8xi32>, vector<1x8x8xi32> into vector<1x8xi32>250 return %result : vector<1x8xi32>251}252 253// -----254// CHECK-LABEL: func @cast_away_extract_strided_slice_leading_one_dims255func.func @cast_away_extract_strided_slice_leading_one_dims(%arg0: vector<1x8x8xf16>) -> vector<1x1x8xf16> {256 // CHECK: %[[SRC:.+]] = vector.extract %{{.*}}[0] : vector<8x8xf16> from vector<1x8x8xf16>257 // CHECK: %[[EXTRACT:.+]] = vector.extract_strided_slice %[[SRC]] {offsets = [4], sizes = [1], strides = [1]} : vector<8x8xf16> to vector<1x8xf16>258 %0 = vector.extract_strided_slice %arg0 {offsets = [0, 4], sizes = [1, 1], strides = [1, 1]} : vector<1x8x8xf16> to vector<1x1x8xf16>259 // CHECK: %[[RET:.+]] = vector.broadcast %[[EXTRACT]] : vector<1x8xf16> to vector<1x1x8xf16>260 // CHECK: return %[[RET]]261 return %0: vector<1x1x8xf16>262}263 264// CHECK-LABEL: func @cast_away_extract_strided_slice_leading_one_dims_scalable265func.func @cast_away_extract_strided_slice_leading_one_dims_scalable(%arg0: vector<1x8x[8]xf16>) -> vector<1x1x[8]xf16> {266 // CHECK: %[[SRC:.+]] = vector.extract %{{.*}}[0] : vector<8x[8]xf16> from vector<1x8x[8]xf16>267 // CHECK: %[[EXTRACT:.+]] = vector.extract_strided_slice %[[SRC]] {offsets = [4], sizes = [1], strides = [1]} : vector<8x[8]xf16> to vector<1x[8]xf16>268 %0 = vector.extract_strided_slice %arg0 {offsets = [0, 4], sizes = [1, 1], strides = [1, 1]} : vector<1x8x[8]xf16> to vector<1x1x[8]xf16>269 // CHECK: %[[RET:.+]] = vector.broadcast %[[EXTRACT]] : vector<1x[8]xf16> to vector<1x1x[8]xf16>270 // CHECK: return %[[RET]]271 return %0: vector<1x1x[8]xf16>272}273 274// CHECK-LABEL: func @cast_away_insert_strided_slice_leading_one_dims275func.func @cast_away_insert_strided_slice_leading_one_dims(%arg0: vector<1x8xf16>, %arg1: vector<1x8x8xf16>) -> vector<1x8x8xf16> {276 // CHECK: %[[SRC:.+]] = vector.extract %{{.*}}[0] : vector<8xf16> from vector<1x8xf16>277 // CHECK: %[[DST:.+]] = vector.extract %{{.*}}[0] : vector<8x8xf16> from vector<1x8x8xf16>278 // CHECK: %[[INSERT:.+]] = vector.insert_strided_slice %[[SRC]], %[[DST]] {offsets = [0, 0], strides = [1]} : vector<8xf16> into vector<8x8xf16>279 %0 = vector.insert_strided_slice %arg0, %arg1 {offsets = [0, 0, 0], strides = [1, 1]} : vector<1x8xf16> into vector<1x8x8xf16>280 // CHECK: %[[RET:.+]] = vector.broadcast %[[INSERT]] : vector<8x8xf16> to vector<1x8x8xf16>281 // CHECK: return %[[RET]]282 return %0: vector<1x8x8xf16>283}284 285// CHECK-LABEL: func @cast_away_insert_strided_slice_leading_one_dims_scalable286func.func @cast_away_insert_strided_slice_leading_one_dims_scalable(%arg0: vector<1x[8]xf16>, %arg1: vector<1x8x[8]xf16>) -> vector<1x8x[8]xf16> {287 // CHECK: %[[SRC:.+]] = vector.extract %{{.*}}[0] : vector<[8]xf16> from vector<1x[8]xf16>288 // CHECK: %[[DST:.+]] = vector.extract %{{.*}}[0] : vector<8x[8]xf16> from vector<1x8x[8]xf16>289 // CHECK: %[[INSERT:.+]] = vector.insert_strided_slice %[[SRC]], %[[DST]] {offsets = [0, 0], strides = [1]} : vector<[8]xf16> into vector<8x[8]xf16>290 %0 = vector.insert_strided_slice %arg0, %arg1 {offsets = [0, 0, 0], strides = [1, 1]} : vector<1x[8]xf16> into vector<1x8x[8]xf16>291 // CHECK: %[[RET:.+]] = vector.broadcast %[[INSERT]] : vector<8x[8]xf16> to vector<1x8x[8]xf16>292 // CHECK: return %[[RET]]293 return %0: vector<1x8x[8]xf16>294}295 296// CHECK-LABEL: func @cast_away_insert_strided_slice_leading_one_dims_one_element297// CHECK-SAME: %[[ARG0:.+]]: vector<1x1xf16>, %{{.+}}: vector<1x1x1xf16>298func.func @cast_away_insert_strided_slice_leading_one_dims_one_element(%arg0: vector<1x1xf16>, %arg1: vector<1x1x1xf16>) -> vector<1x1x1xf16> {299 // CHECK: %[[EXT:.+]] = vector.extract %{{.*}}[0] : vector<1xf16> from vector<1x1xf16>300 // CHECK: %[[B:.+]] = vector.broadcast %[[EXT]] : vector<1xf16> to vector<1x1x1xf16>301 %0 = vector.insert_strided_slice %arg0, %arg1 {offsets = [0, 0, 0], strides = [1, 1]} : vector<1x1xf16> into vector<1x1x1xf16>302 // CHECK: return %[[B]]303 return %0: vector<1x1x1xf16>304}305 306// CHECK-LABEL: func @cast_away_insert_strided_slice_leading_one_dims_one_element_scalable307// CHECK-SAME: %[[ARG0:.+]]: vector<1x[1]xf16>, %{{.+}}: vector<1x1x[1]xf16>308func.func @cast_away_insert_strided_slice_leading_one_dims_one_element_scalable(%arg0: vector<1x[1]xf16>, %arg1: vector<1x1x[1]xf16>) -> vector<1x1x[1]xf16> {309 // CHECK: %[[EXT:.+]] = vector.extract %{{.*}}[0] : vector<[1]xf16> from vector<1x[1]xf16>310 // CHECK: %[[B:.+]] = vector.broadcast %[[EXT]] : vector<[1]xf16> to vector<1x1x[1]xf16>311 %0 = vector.insert_strided_slice %arg0, %arg1 {offsets = [0, 0, 0], strides = [1, 1]} : vector<1x[1]xf16> into vector<1x1x[1]xf16>312 // CHECK: return %[[B]]313 return %0: vector<1x1x[1]xf16>314}315 316// CHECK-LABEL: func @cast_away_transfer_read_leading_one_dims317func.func @cast_away_transfer_read_leading_one_dims(%arg0: memref<1x4x8x16xf16>) -> vector<1x4xf16> {318 // CHECK: %[[C0:.+]] = arith.constant 0 : index319 %c0 = arith.constant 0 : index320 // CHECK: %[[F0:.+]] = arith.constant 0.000000e+00 : f16321 %f0 = arith.constant 0. : f16322 // CHECK: %[[READ:.+]] = vector.transfer_read %{{.*}}[%[[C0]], %[[C0]], %[[C0]], %[[C0]]], %[[F0]] {in_bounds = [true]} : memref<1x4x8x16xf16>, vector<4xf16>323 // CHECK: %[[CAST:.+]] = vector.broadcast %[[READ]] : vector<4xf16> to vector<1x4xf16>324 %0 = vector.transfer_read %arg0[%c0, %c0, %c0, %c0], %f0 {in_bounds = [true, true]} : memref<1x4x8x16xf16>, vector<1x4xf16>325 // CHECK: return %[[CAST]]326 return %0: vector<1x4xf16>327}328 329// CHECK-LABEL: func @cast_away_masked_transfer_read_leading_one_dims330func.func @cast_away_masked_transfer_read_leading_one_dims(%arg0: memref<1x4x8x16xf16>, %arg1: vector<1x4xi1>) -> vector<1x4xf16> {331 // CHECK: %[[C0:.+]] = arith.constant 0 : index332 %c0 = arith.constant 0 : index333 // CHECK: %[[F0:.+]] = arith.constant 0.000000e+00 : f16334 %f0 = arith.constant 0. : f16335 // CHECK: %[[MASK_CAST:.+]] = vector.extract %{{.*}}[0] : vector<4xi1> from vector<1x4xi1>336 // CHECK: %[[READ:.+]] = vector.transfer_read %{{.*}}[%[[C0]], %[[C0]], %[[C0]], %[[C0]]], %[[F0]], %[[MASK_CAST]] {in_bounds = [true]} : memref<1x4x8x16xf16>, vector<4xf16>337 // CHECK: %[[CAST:.+]] = vector.broadcast %[[READ]] : vector<4xf16> to vector<1x4xf16>338 %0 = vector.transfer_read %arg0[%c0, %c0, %c0, %c0], %f0, %arg1 {in_bounds = [true, true]} : memref<1x4x8x16xf16>, vector<1x4xf16>339 // CHECK: return %[[CAST]]340 return %0: vector<1x4xf16>341}342 343// CHECK-LABEL: func @cast_away_transfer_read_leading_one_dims_one_element344func.func @cast_away_transfer_read_leading_one_dims_one_element(%arg0: memref<1x1x1x1xf16>) -> vector<1x1xf16> {345 %c0 = arith.constant 0 : index346 %f0 = arith.constant 0. : f16347 // CHECK: vector.broadcast %{{.+}} : vector<1xf16> to vector<1x1xf16>348 %0 = vector.transfer_read %arg0[%c0, %c0, %c0, %c0], %f0 {in_bounds = [true, true]} : memref<1x1x1x1xf16>, vector<1x1xf16>349 return %0: vector<1x1xf16>350}351 352// -----353 354// CHECK: #[[$MAP:.+]] = affine_map<(d0, d1, d2) -> (d1)>355// CHECK-LABEL: func @cast_away_nontrivial_map_masked_transfer_read356func.func @cast_away_nontrivial_map_masked_transfer_read(%arg0: memref<1x4x8xf16>, %arg1: vector<1x4x1xi1>) -> vector<1x1x4xf16> {357 // CHECK: %[[C0:.+]] = arith.constant 0 : index358 %c0 = arith.constant 0 : index359 // CHECK: %[[F0:.+]] = arith.constant 0.000000e+00 : f16360 %f0 = arith.constant 0. : f16361 // CHECK: %[[MASK_CAST:.+]] = vector.shape_cast %{{.*}} : vector<1x4x1xi1> to vector<4xi1>362 // CHECK: %[[READ:.+]] = vector.transfer_read %{{.*}}[%[[C0]], %[[C0]], %[[C0]]], %[[F0]], %[[MASK_CAST]] {in_bounds = [true]363 // CHECK-SAME: permutation_map = #[[$MAP]]} : memref<1x4x8xf16>, vector<4xf16>364 // CHECK: %[[CAST:.+]] = vector.broadcast %[[READ]] : vector<4xf16> to vector<1x1x4xf16>365 %0 = vector.transfer_read %arg0[%c0, %c0, %c0], %f0, %arg1 {in_bounds = [true, true, true],366 permutation_map = affine_map<(d0, d1, d2) -> (d0, d2, d1)>} : memref<1x4x8xf16>, vector<1x1x4xf16>367 // CHECK: return %[[CAST]]368 return %0: vector<1x1x4xf16>369}370 371// -----372 373// CHECK-LABEL: func @not_insert_cast_fo4_transfer_read_under_mask374// CHECK: %[[MASK:.+]] = vector.constant_mask375// CHECK: %[[CASTED_MASK:.+]] = vector.broadcast %[[MASK]]376// CHECK: %[[RET:.+]] = vector.mask %[[CASTED_MASK]] {377// CHECK-SAME: vector.transfer_read {{.*}} : memref<1x1x4xf16>, vector<1x4xf16> }378// CHECK: return %[[RET]] : vector<1x4xf16>379func.func @not_insert_cast_fo4_transfer_read_under_mask(%arg0: memref<1x1x4xf16>) -> vector<1x4xf16> {380 %c0 = arith.constant 0 : index381 %f0 = arith.constant 0. : f16382 %mask = vector.constant_mask [1, 3] : vector<1x4xi1>383 %ret = vector.mask %mask {384 vector.transfer_read %arg0[%c0, %c0, %c0], %f0 {in_bounds = [true, true]} : memref<1x1x4xf16>, vector<1x4xf16>385 } : vector<1x4xi1> -> vector<1x4xf16>386 return %ret: vector<1x4xf16>387}388 389// -----390 391// CHECK-LABEL: func @cast_away_transfer_write_leading_one_dims392func.func @cast_away_transfer_write_leading_one_dims(%arg0: memref<1x4x8x16xf16>, %arg1: vector<1x4xf16>) {393 // CHECK: %[[C0:.+]] = arith.constant 0 : index394 %c0 = arith.constant 0 : index395 // CHECK: %[[CAST:.+]] = vector.extract %{{.*}}[0] : vector<4xf16> from vector<1x4xf16>396 // CHECK: vector.transfer_write %[[CAST]], %{{.*}}[%[[C0]], %[[C0]], %[[C0]], %[[C0]]] {in_bounds = [true]} : vector<4xf16>, memref<1x4x8x16xf16>397 398 vector.transfer_write %arg1, %arg0[%c0, %c0, %c0, %c0] {in_bounds = [true, true]} : vector<1x4xf16>, memref<1x4x8x16xf16>399 return400}401 402// CHECK-LABEL: func @cast_away_masked_transfer_write_leading_one_dims403func.func @cast_away_masked_transfer_write_leading_one_dims(%arg0: memref<1x4x8x16xf16>, %arg1: vector<1x4xf16>, %arg2: vector<1x4xi1>) {404 // CHECK: %[[C0:.+]] = arith.constant 0 : index405 %c0 = arith.constant 0 : index406 // CHECK: %[[CAST:.+]] = vector.extract %{{.*}}[0] : vector<4xf16> from vector<1x4xf16>407 // CHECK: %[[MASK_CAST:.+]] = vector.extract %{{.*}}[0] : vector<4xi1> from vector<1x4xi1>408 // CHECK: vector.transfer_write %[[CAST]], %{{.*}}[%[[C0]], %[[C0]], %[[C0]], %[[C0]]], %[[MASK_CAST]] {in_bounds = [true]} : vector<4xf16>, memref<1x4x8x16xf16>409 410 vector.transfer_write %arg1, %arg0[%c0, %c0, %c0, %c0], %arg2 {in_bounds = [true, true]} : vector<1x4xf16>, memref<1x4x8x16xf16>411 return412}413 414// CHECK-LABEL: func @cast_away_transfer_write_leading_one_dims_one_element415func.func @cast_away_transfer_write_leading_one_dims_one_element(%arg0: memref<1x1x1x1xf16>, %arg1: vector<1x1xf16>) {416 %c0 = arith.constant 0 : index417 // CHECK: vector.extract %{{.+}}[0] : vector<1xf16> from vector<1x1xf16>418 vector.transfer_write %arg1, %arg0[%c0, %c0, %c0, %c0] {in_bounds = [true, true]} : vector<1x1xf16>, memref<1x1x1x1xf16>419 return420}421 422// -----423 424// CHECK-LABEL: func @not_insert_cast_for_transfer_write_under_mask425// CHECK: %[[MASK:.+]] = vector.constant_mask426// CHECK: %[[CASTED_MASK:.+]] = vector.broadcast %[[MASK]]427// CHECK: vector.mask %[[CASTED_MASK]] {428// CHECK-SAME: vector.transfer_write {{.*}} : vector<1x4xf16>, memref<1x1x4xf16> }429// CHECK: return430func.func @not_insert_cast_for_transfer_write_under_mask(%arg0: memref<1x1x4xf16>, %arg1: vector<1x4xf16>) {431 %c0 = arith.constant 0 : index432 %mask = vector.constant_mask [1, 3] : vector<1x4xi1>433 vector.mask %mask {434 vector.transfer_write %arg1, %arg0[%c0, %c0, %c0] {in_bounds = [true, true]} : vector<1x4xf16>, memref<1x1x4xf16>435 } : vector<1x4xi1>436 return437}438 439// -----440 441// CHECK: #[[$MAP:.+]] = affine_map<(d0, d1, d2) -> (d1)>442// CHECK-LABEL: func @cast_away_nontrivial_map_masked_transfer_write443func.func @cast_away_nontrivial_map_masked_transfer_write(%arg0: memref<1x4x8xf16>, %arg1: vector<1x1x4xf16>, %arg2: vector<1x4x1xi1>) {444 // CHECK: %[[C0:.+]] = arith.constant 0 : index445 %c0 = arith.constant 0 : index446 // CHECK: %[[CAST:.+]] = vector.extract %{{.*}}[0, 0] : vector<4xf16> from vector<1x1x4xf16>447 // CHECK: %[[MASK_CAST:.+]] = vector.shape_cast %{{.*}} : vector<1x4x1xi1> to vector<4xi1>448 // CHECK: vector.transfer_write %[[CAST]], %{{.*}}[%[[C0]], %[[C0]], %[[C0]]], %[[MASK_CAST]] {in_bounds = [true]449 // CHECK-SAME: permutation_map = #[[$MAP]]} : vector<4xf16>, memref<1x4x8xf16>450 451 vector.transfer_write %arg1, %arg0[%c0, %c0, %c0], %arg2 {in_bounds = [true, true, true],452 permutation_map = affine_map<(d0, d1, d2) -> (d0, d2, d1)>} : vector<1x1x4xf16>, memref<1x4x8xf16>453 return454}455 456// -----457 458// CHECK-LABEL: func @cast_away_elementwise_leading_one_dims459func.func @cast_away_elementwise_leading_one_dims(460 %arg0: vector<1x1x8xf32>, %arg1: f32, %arg2: vector<1x4xf32>,461 %arg3: vector<1x4xf32>, %arg4: i1) ->462 (vector<1x1x8xf32>, vector<1x4xi1>, vector<1x4xf32>, vector<1x4xf32>) {463 // CHECK: vector.extract %{{.*}}[0, 0] : vector<8xf32> from vector<1x1x8xf32>464 // CHECK: vector.extract %{{.*}}[0, 0] : vector<8xf32> from vector<1x1x8xf32>465 // CHECK: arith.addf %{{.*}}, %{{.*}} : vector<8xf32>466 // CHECK: vector.broadcast %{{.*}} : vector<8xf32> to vector<1x1x8xf32>467 %0 = arith.addf %arg0, %arg0 : vector<1x1x8xf32>468 // CHECK: vector.extract %{{.*}}[0] : vector<4xf32> from vector<1x4xf32>469 // CHECK: vector.extract %{{.*}}[0] : vector<4xf32> from vector<1x4xf32>470 // CHECK: arith.cmpf ogt, %{{.*}}, %{{.*}} : vector<4xf32>471 // CHECK: vector.broadcast %{{.*}} : vector<4xi1> to vector<1x4xi1>472 %1 = arith.cmpf ogt, %arg2, %arg3 : vector<1x4xf32>473 // CHECK: vector.extract %{{.*}}[0] : vector<4xf32> from vector<1x4xf32>474 // CHECK: vector.extract %{{.*}}[0] : vector<4xf32> from vector<1x4xf32>475 // CHECK: select %{{.*}}, %{{.*}}, %{{.*}} : vector<4xi1>, vector<4xf32>476 // CHECK: vector.broadcast %{{.*}} : vector<4xf32> to vector<1x4xf32>477 %2 = arith.select %1, %arg3, %arg2 : vector<1x4xi1>, vector<1x4xf32>478 // CHECK: vector.extract %{{.*}}[0] : vector<4xf32> from vector<1x4xf32>479 // CHECK: vector.extract %{{.*}}[0] : vector<4xf32> from vector<1x4xf32>480 // CHECK: select %arg4, %12, %{{.*}} : vector<4xf32>481 // CHECK: vector.broadcast %{{.*}} : vector<4xf32> to vector<1x4xf32>482 %3 = arith.select %arg4, %arg3, %arg2 : vector<1x4xf32>483 return %0, %1, %2, %3: vector<1x1x8xf32>, vector<1x4xi1>, vector<1x4xf32>, vector<1x4xf32>484}485 486// -----487 488// CHECK-LABEL: func @cast_away_insert_leading_one_dims_scalar489// CHECK-SAME: (%[[S:.+]]: f32, %[[V:.+]]: vector<1x1x4xf32>)490// CHECK: %[[EXTRACT:.+]] = vector.extract %[[V]][0, 0] : vector<4xf32> from vector<1x1x4xf32>491// CHECK: %[[INSERT:.+]] = vector.insert %[[S]], %[[EXTRACT]] [0] : f32 into vector<4xf32>492// CHECK: %[[BCAST:.+]] = vector.broadcast %[[INSERT]] : vector<4xf32> to vector<1x1x4xf32>493// CHECK: return %[[BCAST]]494func.func @cast_away_insert_leading_one_dims_scalar(%s: f32, %v: vector<1x1x4xf32>) -> vector<1x1x4xf32> {495 %0 = vector.insert %s, %v [0, 0, 0] : f32 into vector<1x1x4xf32>496 return %0: vector<1x1x4xf32>497}498 499// -----500 501// CHECK-LABEL: func.func @cast_away_insert_leading_one_dims_scalar_scalable(502// CHECK-SAME: %[[S:.*]]: f32,503// CHECK-SAME: %[[V:.*]]: vector<1x1x[4]xf32>) -> vector<1x1x[4]xf32> {504func.func @cast_away_insert_leading_one_dims_scalar_scalable(%s: f32, %v: vector<1x1x[4]xf32>) -> vector<1x1x[4]xf32> {505// CHECK: %[[EXTRACT:.*]] = vector.extract %[[V]][0, 0] : vector<[4]xf32> from vector<1x1x[4]xf32>506// CHECK: %[[INSERT:.*]] = vector.insert %[[S]], %[[EXTRACT]] [0] : f32 into vector<[4]xf32>507// CHECK: %[[BCAST:.*]] = vector.broadcast %[[INSERT]] : vector<[4]xf32> to vector<1x1x[4]xf32>508// CHECK: return %[[BCAST]] : vector<1x1x[4]xf32>509 %0 = vector.insert %s, %v [0, 0, 0] : f32 into vector<1x1x[4]xf32>510 return %0: vector<1x1x[4]xf32>511}512 513// -----514 515// CHECK-LABEL: func.func @cast_away_insert_leading_one_dims_scalar_skip_scalable_dim(516// CHECK-SAME: %[[S:.*]]: f32,517// CHECK-SAME: %[[V:.*]]: vector<1x[1]x4xf32>) -> vector<1x[1]x4xf32> {518func.func @cast_away_insert_leading_one_dims_scalar_skip_scalable_dim(%s: f32, %v: vector<1x[1]x4xf32>) -> vector<1x[1]x4xf32> {519// CHECK: %[[EXTRACT:.*]] = vector.extract %[[V]][0] : vector<[1]x4xf32> from vector<1x[1]x4xf32>520// CHECK: %[[INSERT:.*]] = vector.insert %[[S]], %[[EXTRACT]] [0, 0] : f32 into vector<[1]x4xf32>521// CHECK: %[[BCAST:.*]] = vector.broadcast %[[INSERT]] : vector<[1]x4xf32> to vector<1x[1]x4xf32>522// CHECK: return %[[BCAST]] : vector<1x[1]x4xf32>523 %0 = vector.insert %s, %v [0, 0, 0] : f32 into vector<1x[1]x4xf32>524 return %0: vector<1x[1]x4xf32>525}526 527// -----528 529// CHECK-LABEL: func @cast_away_insert_leading_one_dims_rank1530// CHECK-SAME: (%[[S:.+]]: vector<4xf32>, %[[V:.+]]: vector<1x1x4xf32>)531// CHECK: %[[BCAST:.+]] = vector.broadcast %[[S]] : vector<4xf32> to vector<1x1x4xf32>532// CHECK: return %[[BCAST]]533func.func @cast_away_insert_leading_one_dims_rank1(%s: vector<4xf32>, %v: vector<1x1x4xf32>) -> vector<1x1x4xf32> {534 %0 = vector.insert %s, %v [0, 0] : vector<4xf32> into vector<1x1x4xf32>535 return %0: vector<1x1x4xf32>536}537 538// -----539 540// CHECK-LABEL: func.func @cast_away_insert_leading_one_dims_rank1_scalable(541// CHECK-SAME: %[[S:.*]]: vector<[4]xf32>,542// CHECK-SAME: %[[V:.*]]: vector<1x1x[4]xf32>) -> vector<1x1x[4]xf32> {543// CHECK: %[[BCAST:.*]] = vector.broadcast %[[S]] : vector<[4]xf32> to vector<1x1x[4]xf32>544// CHECK: return %[[BCAST]] : vector<1x1x[4]xf32>545func.func @cast_away_insert_leading_one_dims_rank1_scalable(%s: vector<[4]xf32>, %v: vector<1x1x[4]xf32>) -> vector<1x1x[4]xf32> {546 %0 = vector.insert %s, %v [0, 0] : vector<[4]xf32> into vector<1x1x[4]xf32>547 return %0: vector<1x1x[4]xf32>548}549 550// -----551 552// CHECK-LABEL: func @cast_away_insert_leading_one_dims_rank2553// CHECK-SAME: (%[[S:.+]]: vector<1x4xf32>, %[[V:.+]]: vector<1x1x4xf32>)554// CHECK: %[[EXTRACT:.+]] = vector.extract %[[S]][0] : vector<4xf32> from vector<1x4xf32>555// CHECK: %[[BCAST:.+]] = vector.broadcast %[[EXTRACT]] : vector<4xf32> to vector<1x1x4xf32>556// CHECK: return %[[BCAST]]557func.func @cast_away_insert_leading_one_dims_rank2(%s: vector<1x4xf32>, %v: vector<1x1x4xf32>) -> vector<1x1x4xf32> {558 %0 = vector.insert %s, %v [0] : vector<1x4xf32> into vector<1x1x4xf32>559 return %0: vector<1x1x4xf32>560}561 562// -----563 564// CHECK-LABEL: func.func @cast_away_insert_leading_one_dims_rank2_scalable(565// CHECK-SAME: %[[S:.*]]: vector<1x[4]xf32>,566// CHECK-SAME: %[[V:.*]]: vector<1x1x[4]xf32>) -> vector<1x1x[4]xf32> {567// CHECK: %[[EXTRACT:.*]] = vector.extract %[[S]][0] : vector<[4]xf32> from vector<1x[4]xf32>568// CHECK: %[[BCAST:.*]] = vector.broadcast %[[EXTRACT]] : vector<[4]xf32> to vector<1x1x[4]xf32>569// CHECK: return %[[BCAST]] : vector<1x1x[4]xf32>570func.func @cast_away_insert_leading_one_dims_rank2_scalable(%s: vector<1x[4]xf32>, %v: vector<1x1x[4]xf32>) -> vector<1x1x[4]xf32> {571 %0 = vector.insert %s, %v [0] : vector<1x[4]xf32> into vector<1x1x[4]xf32>572 return %0: vector<1x1x[4]xf32>573}574 575// -----576 577// CHECK-LABEL: func @cast_away_insert_leading_one_dims_rank2_one_dest578// CHECK-SAME: (%[[S:.+]]: vector<1x4xf32>, %[[V:.+]]: vector<1x2x1x4xf32>)579// CHECK: %[[EXTRACTS:.+]] = vector.extract %[[S]][0] : vector<4xf32> from vector<1x4xf32>580// CHECK: %[[EXTRACTV:.+]] = vector.extract %[[V]][0] : vector<2x1x4xf32> from vector<1x2x1x4xf32>581// CHECK: %[[INSERT:.+]] = vector.insert %[[EXTRACTS]], %[[EXTRACTV]] [1, 0] : vector<4xf32> into vector<2x1x4xf32>582// CHECK: %[[BCAST:.+]] = vector.broadcast %[[INSERT]] : vector<2x1x4xf32> to vector<1x2x1x4xf32>583// CHECK: return %[[BCAST]]584func.func @cast_away_insert_leading_one_dims_rank2_one_dest(%s: vector<1x4xf32>, %v: vector<1x2x1x4xf32>) -> vector<1x2x1x4xf32> {585 %0 = vector.insert %s, %v [0, 1] : vector<1x4xf32> into vector<1x2x1x4xf32>586 return %0: vector<1x2x1x4xf32>587}588 589// -----590 591// CHECK-LABEL: func.func @cast_away_insert_leading_one_dims_rank2_one_dest_scalable(592// CHECK-SAME: %[[S:.*]]: vector<1x[4]xf32>,593// CHECK-SAME: %[[V:.*]]: vector<1x2x1x[4]xf32>) -> vector<1x2x1x[4]xf32> {594// CHECK: %[[EXTRACTS:.*]] = vector.extract %[[S]][0] : vector<[4]xf32> from vector<1x[4]xf32>595// CHECK: %[[EXTRACTV:.*]] = vector.extract %[[V]][0] : vector<2x1x[4]xf32> from vector<1x2x1x[4]xf32>596// CHECK: %[[INSERT:.*]] = vector.insert %[[EXTRACTS]], %[[EXTRACTV]] [1, 0] : vector<[4]xf32> into vector<2x1x[4]xf32>597// CHECK: %[[BCAST:.*]] = vector.broadcast %[[INSERT]] : vector<2x1x[4]xf32> to vector<1x2x1x[4]xf32>598// CHECK: return %[[BCAST]] : vector<1x2x1x[4]xf32>599func.func @cast_away_insert_leading_one_dims_rank2_one_dest_scalable(%s: vector<1x[4]xf32>, %v: vector<1x2x1x[4]xf32>) -> vector<1x2x1x[4]xf32> {600 %0 = vector.insert %s, %v [0, 1] : vector<1x[4]xf32> into vector<1x2x1x[4]xf32>601 return %0: vector<1x2x1x[4]xf32>602}603 604// -----605 606// CHECK-LABEL: func @cast_away_insert_leading_one_dims_non_one_dest607// CHECK-SAME: (%[[S:.+]]: vector<1x4xf32>, %[[V:.+]]: vector<8x1x4xf32>)608// CHECK: %[[EXTRACT:.+]] = vector.extract %[[S]][0] : vector<4xf32> from vector<1x4xf32>609// CHECK: %[[INSERT:.+]] = vector.insert %[[EXTRACT]], %[[V]] [5, 0] : vector<4xf32> into vector<8x1x4xf32>610// CHECK: return %[[INSERT]]611func.func @cast_away_insert_leading_one_dims_non_one_dest(%s: vector<1x4xf32>, %v: vector<8x1x4xf32>) -> vector<8x1x4xf32> {612 %0 = vector.insert %s, %v [5] : vector<1x4xf32> into vector<8x1x4xf32>613 return %0: vector<8x1x4xf32>614}615 616// -----617 618// CHECK-LABEL: func.func @cast_away_insert_leading_one_dims_non_one_dest_scalable(619// CHECK-SAME: %[[S:.*]]: vector<1x[4]xf32>,620// CHECK-SAME: %[[V:.*]]: vector<8x1x[4]xf32>) -> vector<8x1x[4]xf32> {621// CHECK: %[[EXTRACT:.*]] = vector.extract %[[S]][0] : vector<[4]xf32> from vector<1x[4]xf32>622// CHECK: %[[INSERT:.*]] = vector.insert %[[EXTRACT]], %[[V]] [5, 0] : vector<[4]xf32> into vector<8x1x[4]xf32>623// CHECK: return %[[INSERT]] : vector<8x1x[4]xf32>624func.func @cast_away_insert_leading_one_dims_non_one_dest_scalable(%s: vector<1x[4]xf32>, %v: vector<8x1x[4]xf32>) -> vector<8x1x[4]xf32> {625 %0 = vector.insert %s, %v [5] : vector<1x[4]xf32> into vector<8x1x[4]xf32>626 return %0: vector<8x1x[4]xf32>627}628 629// -----630 631// CHECK-LABEL: func @cast_away_insert_leading_one_dims_one_two_dest632// CHECK-SAME: (%[[S:.+]]: vector<1x8xi1>, %[[V:.+]]: vector<1x1x8x1x8xi1>)633// CHECK: %[[EXTRACTS:.+]] = vector.extract %[[S]][0] : vector<8xi1> from vector<1x8xi1>634// CHECK: %[[EXTRACTV:.+]] = vector.extract %[[V]][0, 0] : vector<8x1x8xi1> from vector<1x1x8x1x8xi1>635// CHECK: %[[INSERT:.+]] = vector.insert %[[EXTRACTS]], %[[EXTRACTV]] [7, 0] : vector<8xi1> into vector<8x1x8xi1>636// CHECK: %[[BCAST:.+]] = vector.broadcast %[[INSERT]] : vector<8x1x8xi1> to vector<1x1x8x1x8xi1>637// CHECK: return %[[BCAST]]638func.func @cast_away_insert_leading_one_dims_one_two_dest(%s: vector<1x8xi1>, %v: vector<1x1x8x1x8xi1>) -> vector<1x1x8x1x8xi1> {639 %0 = vector.insert %s, %v [0, 0, 7] : vector<1x8xi1> into vector<1x1x8x1x8xi1>640 return %0: vector<1x1x8x1x8xi1>641}642 643// -----644 645// CHECK-LABEL: func.func @cast_away_insert_leading_one_dims_one_two_dest_scalable(646// CHECK-SAME: %[[S:.*]]: vector<1x[8]xi1>,647// CHECK-SAME: %[[V:.*]]: vector<1x1x8x1x[8]xi1>) -> vector<1x1x8x1x[8]xi1> {648// CHECK: %[[EXTRACTS:.*]] = vector.extract %[[S]][0] : vector<[8]xi1> from vector<1x[8]xi1>649// CHECK: %[[EXTRACTV:.*]] = vector.extract %[[V]][0, 0] : vector<8x1x[8]xi1> from vector<1x1x8x1x[8]xi1>650// CHECK: %[[INSERT:.*]] = vector.insert %[[EXTRACTS]], %[[EXTRACTV]] [7, 0] : vector<[8]xi1> into vector<8x1x[8]xi1>651// CHECK: %[[BCAST:.*]] = vector.broadcast %[[INSERT]] : vector<8x1x[8]xi1> to vector<1x1x8x1x[8]xi1>652// CHECK: return %[[BCAST]] : vector<1x1x8x1x[8]xi1>653func.func @cast_away_insert_leading_one_dims_one_two_dest_scalable(%s: vector<1x[8]xi1>, %v: vector<1x1x8x1x[8]xi1>) -> vector<1x1x8x1x[8]xi1> {654 %0 = vector.insert %s, %v [0, 0, 7] : vector<1x[8]xi1> into vector<1x1x8x1x[8]xi1>655 return %0: vector<1x1x8x1x[8]xi1>656}657 658// -----659 660// CHECK-LABEL: func.func @cast_away_constant_mask() -> vector<1x1x8x2x1xi1> {661// CHECK: %[[MASK:.*]] = vector.constant_mask [6, 1, 1] : vector<8x2x1xi1>662// CHECK: %[[BCAST:.*]] = vector.broadcast %[[MASK]] : vector<8x2x1xi1> to vector<1x1x8x2x1xi1>663// CHECK: return %[[BCAST]] : vector<1x1x8x2x1xi1>664func.func @cast_away_constant_mask() -> vector<1x1x8x2x1xi1> {665 %0 = vector.constant_mask [1, 1, 6, 1, 1] : vector<1x1x8x2x1xi1>666 return %0: vector<1x1x8x2x1xi1>667}668 669// -----670 671// CHECK-LABEL: func.func @drop_unit_dims_scalar_cond_select(672// CHECK: arith.select {{.*}} : vector<16xi1>673func.func @drop_unit_dims_scalar_cond_select(%cond: i1, %arg0: vector<1x16xi1>, %arg1: vector<1x16xi1>) -> vector<1x16xi1> {674 %sel = arith.select %cond, %arg0, %arg1 : vector<1x16xi1>675 return %sel : vector<1x16xi1>676}677