401 lines · plain
1// RUN: mlir-opt %s --transform-interpreter | FileCheck %s2 3// CHECK-LABEL: func @nop_shape_cast4// CHECK-SAME: %[[A:.*]]: vector<16xf32>5// CHECK: return %[[A]] : vector<16xf32>6func.func @nop_shape_cast(%arg0: vector<16xf32>) -> vector<16xf32> {7 %0 = vector.shape_cast %arg0 : vector<16xf32> to vector<16xf32>8 return %0 : vector<16xf32>9}10 11// CHECK-LABEL: func @cancel_shape_cast12// CHECK-SAME: %[[A:.*]]: vector<16xf32>13// CHECK: return %[[A]] : vector<16xf32>14func.func @cancel_shape_cast(%arg0: vector<16xf32>) -> vector<16xf32> {15 %0 = vector.shape_cast %arg0 : vector<16xf32> to vector<4x4xf32>16 %1 = vector.shape_cast %0 : vector<4x4xf32> to vector<16xf32>17 return %1 : vector<16xf32>18}19 20// Collapse 2-D to 1-D.21// CHECK-LABEL: func @shape_cast_2d1d22// CHECK-SAME: %[[A:.*]]: vector<2x2xf32>) -> vector<4xf32> {23// CHECK: %[[UB:.*]] = ub.poison : vector<4xf32>24//25// CHECK: %[[EX0:.*]] = vector.extract %[[A]][0] : vector<2xf32> from vector<2x2xf32>26// CHECK: %[[IN0:.*]] = vector.insert_strided_slice %[[EX0]], %[[UB]]27// CHECK-SAME: {offsets = [0], strides = [1]} : vector<2xf32> into vector<4xf32>28//29// CHECK: %[[EX1:.*]] = vector.extract %{{.*}}[1] : vector<2xf32> from vector<2x2xf32>30// CHECK: %[[IN2:.*]] = vector.insert_strided_slice %[[EX1]], %[[IN0]]31// CHECK-SAME: {offsets = [2], strides = [1]} : vector<2xf32> into vector<4xf32>32// CHECK: return %[[IN2]] : vector<4xf32>33func.func @shape_cast_2d1d(%a: vector<2x2xf32>) -> (vector<4xf32>) {34 %0 = vector.shape_cast %a : vector<2x2xf32> to vector<4xf32>35 return %0 : vector<4xf32>36}37 38// Collapse 3-D to 1-D.39// CHECK-LABEL: func @shape_cast_3d1d40// CHECK-SAME: %[[A:.*]]: vector<1x3x2xf32>41// CHECK: %[[UB:.*]] = ub.poison : vector<6xf32>42//43// CHECK: %[[T0:.*]] = vector.extract %[[A]][0, 0] : vector<2xf32> from vector<1x3x2xf32>44// CHECK: %[[T1:.*]] = vector.insert_strided_slice %[[T0]], %[[UB]]45// CHECK-SAME: {offsets = [0], strides = [1]} : vector<2xf32> into vector<6xf32>46//47// CHECK: %[[T2:.*]] = vector.extract %[[A]][0, 1] : vector<2xf32> from vector<1x3x2xf32>48// CHECK: %[[T3:.*]] = vector.insert_strided_slice %[[T2]], %[[T1]]49// CHECK-SAME: {offsets = [2], strides = [1]} : vector<2xf32> into vector<6xf32>50//51// CHECK: %[[T4:.*]] = vector.extract %[[A]][0, 2] : vector<2xf32> from vector<1x3x2xf32>52// CHECK: %[[T5:.*]] = vector.insert_strided_slice %[[T4]], %[[T3]]53// CHECK-SAME: {offsets = [4], strides = [1]} : vector<2xf32> into vector<6xf32>54// CHECK: return %[[T5]] : vector<6xf32>55func.func @shape_cast_3d1d(%arg0 : vector<1x3x2xf32>) -> vector<6xf32> {56 %s = vector.shape_cast %arg0 : vector<1x3x2xf32> to vector<6xf32>57 return %s : vector<6xf32>58}59 60// Expand 1-D to 2-D.61// CHECK-LABEL: func.func @shape_cast_1d2d(62// CHECK-SAME: %[[A:.*]]: vector<4xf32>) -> vector<2x2xf32> {63// CHECK: %[[UB:.*]] = ub.poison : vector<2x2xf32>64//65// CHECK: %[[SS0:.*]] = vector.extract_strided_slice %[[A]]66// CHECK-SAME: {offsets = [0], sizes = [2], strides = [1]} :67// CHECK-SAME: vector<4xf32> to vector<2xf32>68// CHECK: %[[res0:.*]] = vector.insert %[[SS0]], %[[UB]] [0] :69// CHECK-SAME: vector<2xf32> into vector<2x2xf32>70//71// CHECK: %[[SS2:.*]] = vector.extract_strided_slice %[[A]]72// CHECK-SAME: {offsets = [2], sizes = [2], strides = [1]} :73// CHECK-SAME: vector<4xf32> to vector<2xf32>74// CHECK: %[[res1:.*]] = vector.insert %[[SS2]], %[[res0]] [1] :75// CHECK-SAME: vector<2xf32> into vector<2x2xf32>76// CHECK: return %[[res1]] : vector<2x2xf32>77func.func @shape_cast_1d2d(%a: vector<4xf32>) -> (vector<2x2xf32>) {78 %1 = vector.shape_cast %a: vector<4xf32> to vector<2x2xf32>79 return %1 : vector<2x2xf32>80}81 82// Expand 1-D to 3-D.83// CHECK-LABEL: func @shape_cast_1d3d84// CHECK-SAME: %[[A:.*]]: vector<6xf32>85// CHECK: %[[UB:.*]] = ub.poison : vector<2x1x3xf32>86//87// CHECK: %[[T0:.*]] = vector.extract_strided_slice %[[A]]88// CHECK-SAME: {offsets = [0], sizes = [3], strides = [1]} :89// CHECK-SAME: vector<6xf32> to vector<3xf32>90// CHECK: %[[T1:.*]] = vector.insert %[[T0]], %[[UB]] [0, 0] :91// CHECK-SAME: vector<3xf32> into vector<2x1x3xf32>92//93// CHECK: %[[T2:.*]] = vector.extract_strided_slice %[[A]]94// CHECK-SAME: {offsets = [3], sizes = [3], strides = [1]} :95// CHECK-SAME: vector<6xf32> to vector<3xf32>96// CHECK: %[[T3:.*]] = vector.insert %[[T2]], %[[T1]] [1, 0] :97// CHECK-SAME: vector<3xf32> into vector<2x1x3xf32>98// CHECK: return %[[T3]] : vector<2x1x3xf32>99func.func @shape_cast_1d3d(%arg0 : vector<6xf32>) -> vector<2x1x3xf32> {100 %s = vector.shape_cast %arg0 : vector<6xf32> to vector<2x1x3xf32>101 return %s : vector<2x1x3xf32>102}103 104// 2-D to 2-D where the inner-most dimensions have no common factors. This105// case requires scalar element by element extraction and insertion.106// CHECK-LABEL: func @shape_cast_2d2d107// CHECK-SAME: %[[A:.*]]: vector<3x2xf32>108// CHECK: %[[UB:.*]] = ub.poison : vector<2x3xf32>109//110// CHECK: %[[T0:.*]] = vector.extract %[[A]][0, 0] : f32 from vector<3x2xf32>111// CHECK: %[[T1:.*]] = vector.insert %[[T0]], %[[UB]] [0, 0] :112//113// CHECK: %[[T2:.*]] = vector.extract %[[A]][0, 1] : f32 from vector<3x2xf32>114// CHECK: %[[T3:.*]] = vector.insert %[[T2]], %[[T1]] [0, 1] :115//116// CHECK: %[[T4:.*]] = vector.extract %[[A]][1, 0] : f32 from vector<3x2xf32>117// CHECK: %[[T5:.*]] = vector.insert %[[T4]], %[[T3]] [0, 2] :118//119// CHECK: %[[T6:.*]] = vector.extract %[[A]][1, 1] : f32 from vector<3x2xf32>120// CHECK: %[[T7:.*]] = vector.insert %[[T6]], %[[T5]] [1, 0] :121//122// CHECK: %[[T8:.*]] = vector.extract %[[A]][2, 0] : f32 from vector<3x2xf32>123// CHECK: %[[T9:.*]] = vector.insert %[[T8]], %[[T7]] [1, 1] :124//125// CHECK: %[[T10:.*]] = vector.extract %[[A]][2, 1] : f32 from vector<3x2xf32>126// CHECK: %[[T11:.*]] = vector.insert %[[T10]], %[[T9]] [1, 2] :127//128// CHECK: return %[[T11]] : vector<2x3xf32>129func.func @shape_cast_2d2d(%arg0 : vector<3x2xf32>) -> vector<2x3xf32> {130 %s = vector.shape_cast %arg0: vector<3x2xf32> to vector<2x3xf32>131 return %s : vector<2x3xf32>132}133 134// CHECK-LABEL: func.func @shape_cast_0d1d(135// CHECK-SAME: %[[A:.*]]: vector<f32>) -> vector<1xf32> {136// CHECK: %[[UB:.*]] = ub.poison : vector<1xf32>137//138// CHECK: %[[EXTRACT0:.*]] = vector.extract %[[A]][] : f32 from vector<f32>139// CHECK: %[[RES:.*]] = vector.insert %[[EXTRACT0]], %[[UB]] [0] :140// CHECK: return %[[RES]] : vector<1xf32>141func.func @shape_cast_0d1d(%arg0 : vector<f32>) -> vector<1xf32> {142 %s = vector.shape_cast %arg0 : vector<f32> to vector<1xf32>143 return %s : vector<1xf32>144}145 146// CHECK-LABEL: func.func @shape_cast_1d0d(147// CHECK-SAME: %[[A:.*]]: vector<1xf32>) -> vector<f32> {148// CHECK: %[[UB:.*]] = ub.poison : vector<f32>149//150// CHECK: %[[EXTRACT0:.*]] = vector.extract %[[A]][0] : f32 from vector<1xf32>151// CHECK: %[[RES:.*]] = vector.insert %[[EXTRACT0]], %[[UB]] [] :152// CHECK: return %[[RES]] : vector<f32>153func.func @shape_cast_1d0d(%arg0 : vector<1xf32>) -> vector<f32> {154 %s = vector.shape_cast %arg0 : vector<1xf32> to vector<f32>155 return %s : vector<f32>156}157 158// The shapes have 2 inner dimension sizes in common, so the extract result is rank-2.159// CHECK-LABEL: func.func @squeeze_out_prefix_unit_dim(160// CHECK-SAME: %[[A:.*]]: vector<1x2x3xf32>) -> vector<2x3xf32> {161//162// CHECK: %[[EXTRACTED:.*]] = vector.extract %[[A]][0] :163// CHECK-SAME: vector<2x3xf32> from vector<1x2x3xf32>164// CHECK: return %[[EXTRACTED]] : vector<2x3xf32>165func.func @squeeze_out_prefix_unit_dim(%arg0 : vector<1x2x3xf32>) -> vector<2x3xf32> {166 %s = vector.shape_cast %arg0 : vector<1x2x3xf32> to vector<2x3xf32>167 return %s : vector<2x3xf32>168}169 170// The shapes have 1 inner dimension size in common, so the extract results are rank-1.171// CHECK-LABEL: func.func @squeeze_out_middle_unit_dim(172// CHECK-SAME: %[[A:.*]]: vector<2x1x3xf32>) -> vector<2x3xf32> {173// CHECK: %[[UB:.*]] = ub.poison : vector<2x3xf32>174//175// CHECK: %[[E0:.*]] = vector.extract %[[A]][0, 0] : vector<3xf32>176// CHECK: %[[I0:.*]] = vector.insert %[[E0]], %[[UB]] [0] :177//178// CHECK: %[[E1:.*]] = vector.extract %[[A]][1, 0] : vector<3xf32>179// CHECK: %[[I1:.*]] = vector.insert %[[E1]], %[[I0]] [1] :180// CHECK: return %[[I1]] : vector<2x3xf32>181func.func @squeeze_out_middle_unit_dim(%arg0 : vector<2x1x3xf32>) -> vector<2x3xf32> {182 %s = vector.shape_cast %arg0 : vector<2x1x3xf32> to vector<2x3xf32>183 return %s : vector<2x3xf32>184}185 186// CHECK-LABEL: func.func @prepend_unit_dim(187// CHECK-SAME: %[[A:.*]]: vector<2x3xf32>) -> vector<1x2x3xf32> {188// CHECK: %[[UB:.*]] = ub.poison : vector<1x2x3xf32>189//190// CHECK: %[[I0:.*]] = vector.insert %[[A]], %[[UB]] [0]191// CHECK: return %[[I0]] : vector<1x2x3xf32>192func.func @prepend_unit_dim(%arg0 : vector<2x3xf32>) -> vector<1x2x3xf32> {193 %s = vector.shape_cast %arg0 : vector<2x3xf32> to vector<1x2x3xf32>194 return %s : vector<1x2x3xf32>195}196 197// CHECK-LABEL: func.func @insert_middle_unit_dim(198// CHECK-SAME: %[[A:.*]]: vector<2x3xf32>) -> vector<2x1x3xf32> {199// CHECK: %[[UB:.*]] = ub.poison : vector<2x1x3xf32>200//201// CHECK: %[[E0:.*]] = vector.extract %[[A]][0] : vector<3xf32>202// CHECK: %[[I0:.*]] = vector.insert %[[E0]], %[[UB]] [0, 0] : vector<3xf32>203//204// CHECK: %[[E1:.*]] = vector.extract %[[A]][1] : vector<3xf32>205// CHECK: %[[I1:.*]] = vector.insert %[[E1]], %[[I0]] [1, 0] : vector<3xf32>206// CHECK: return %[[I1]] : vector<2x1x3xf32>207func.func @insert_middle_unit_dim(%arg0 : vector<2x3xf32>) -> vector<2x1x3xf32> {208 %s = vector.shape_cast %arg0 : vector<2x3xf32> to vector<2x1x3xf32>209 return %s : vector<2x1x3xf32>210}211 212// CHECK-LABEL: func.func @postpend_unit_dims(213// CHECK-SAME: %[[A:.*]]: vector<4xf32>) -> vector<4x1x1xf32> {214// CHECK: %[[UB:.*]] = ub.poison : vector<4x1x1xf32>215// CHECK: %[[E0:.*]] = vector.extract %[[A]][0] : f32 from vector<4xf32>216// CHECK: %[[I0:.*]] = vector.insert %[[E0]], %[[UB]] [0, 0, 0] : f32 into vector<4x1x1xf32>217// CHECK: %[[E1:.*]] = vector.extract %[[A]][1] : f32 from vector<4xf32>218// CHECK: %[[I1:.*]] = vector.insert %[[E1]], %[[I0]] [1, 0, 0] : f32 into vector<4x1x1xf32>219// CHECK: vector.extract %[[A]][2]220// CHECK: vector.insert {{.*}} [2, 0, 0]221// CHECK: vector.extract %[[A]][3]222// CHECK: vector.insert {{.*}} [3, 0, 0]223// CHECK: return224func.func @postpend_unit_dims(%arg0 : vector<4xf32>) -> vector<4x1x1xf32> {225 %s = vector.shape_cast %arg0 : vector<4xf32> to vector<4x1x1xf32>226 return %s : vector<4x1x1xf32>227}228 229// CHECK-LABEL: func.func @expand_inner_dims(230// CHECK-SAME: %[[A:.*]]: vector<2x10xf32>) -> vector<2x2x5xf32> {231// CHECK: %[[UB:.*]] = ub.poison : vector<2x2x5xf32>232//233// CHECK: %[[E0:.*]] = vector.extract %[[A]][0] : vector<10xf32>234// CHECK: %[[S0:.*]] = vector.extract_strided_slice %[[E0]]235// CHECK-SAME: {offsets = [0], sizes = [5], {{.*}} to vector<5xf32>236// CHECK: %[[I0:.*]] = vector.insert %[[S0]], %[[UB]] [0, 0]237//238// CHECK: %[[S1:.*]] = vector.extract_strided_slice %[[E0]]239// CHECK-SAME: {offsets = [5], sizes = [5], {{.*}} to vector<5xf32>240// CHECK: %[[I1:.*]] = vector.insert %[[S1]], %[[I0]] [0, 1]241//242// CHECK: %[[E1:.*]] = vector.extract %[[A]][1] : vector<10xf32>243// CHECK: %[[S2:.*]] = vector.extract_strided_slice %[[E1]]244// CHECK-SAME: {offsets = [0], sizes = [5], {{.*}} to vector<5xf32>245// CHECK: %[[I2:.*]] = vector.insert %[[S2]], %[[I1]] [1, 0]246//247// CHECK: %[[S3:.*]] = vector.extract_strided_slice %[[E1]]248// CHECK-SAME: {offsets = [5], sizes = [5], {{.*}} to vector<5xf32>249// CHECK: %[[I3:.*]] = vector.insert %[[S3]], %[[I2]] [1, 1]250// CHECK: return %[[I3]] : vector<2x2x5xf32>251func.func @expand_inner_dims(%arg0 : vector<2x10xf32>) -> vector<2x2x5xf32> {252 %s = vector.shape_cast %arg0 : vector<2x10xf32> to vector<2x2x5xf32>253 return %s : vector<2x2x5xf32>254}255 256 257// Some pseudocode describing how this function is lowered:258//259// func collapse_inner_dims(A : vector<2x2x5xi8>) -> vector<1x2x1x10xi8> {260// v0 = empty of shape (10)261// v1 = empty of shape (1,2,1,10)262// v0[0:5] = A[0,0,:]263// v0[5:10] = A[0,1,:]264// v1[0,0,0,:] = v0265// v0[0:5] = A[1,0,:]266// v0[5:10] = A[1,1,:]267// v1[0,1,0,:] = v0268// return v1;269// }270// CHECK-LABEL: func.func @collapse_inner_dims(271// CHECK-SAME: %[[A:.*]]: vector<2x2x5xi8>) -> vector<1x2x1x10xi8> {272// CHECK-DAG: %[[UBSMALL:.*]] = ub.poison : vector<10xi8>273// CHECK-DAG: %[[UBLARGE:.*]] = ub.poison : vector<1x2x1x10xi8>274//275// CHECK: %[[EX0:.*]] = vector.extract %[[A]][0, 0]276// CHECK: %[[IN0:.*]] = vector.insert_strided_slice %[[EX0]], %[[UBSMALL]]277// CHECK-SAME: {offsets = [0], {{.*}}278// CHECK: %[[EX1:.*]] = vector.extract %[[A]][0, 1]279// CHECK: %[[IN1:.*]] = vector.insert_strided_slice %[[EX1]], %[[IN0]]280// CHECK-SAME: {offsets = [5], {{.*}}281// CHECK: %[[IN2:.*]] = vector.insert %[[IN1]], %[[UBLARGE]] [0, 0, 0]282//283// CHECK: %[[EX2:.*]] = vector.extract %[[A]][1, 0]284// CHECK: %[[IN3:.*]] = vector.insert_strided_slice %[[EX2]], %[[UBSMALL]]285// CHECK-SAME: {offsets = [0], {{.*}}286// CHECK: %[[EX3:.*]] = vector.extract %[[A]][1, 1]287// CHECK: %[[IN4:.*]] = vector.insert_strided_slice %[[EX3]], %[[IN3]]288// CHECK-SAME: {offsets = [5], {{.*}}289// CHECK: %[[IN5:.*]] = vector.insert %[[IN4]], %[[IN2]] [0, 1, 0]290// CHECK: return %[[IN5]] : vector<1x2x1x10xi8>291func.func @collapse_inner_dims(%arg0 : vector<2x2x5xi8>) -> vector<1x2x1x10xi8> {292 %s = vector.shape_cast %arg0 : vector<2x2x5xi8> to vector<1x2x1x10xi8>293 return %s : vector<1x2x1x10xi8>294}295 296// Some alternative pseudocode describing how this function is lowered:297//298// func non_dividing_gcd_decreasing(A : vector<2x15xi8>) -> vector<3x10xi8> {299// v0 = empty of shape (10)300// v1 = empty of shape (3,10)301// e0 = A[0,:]302// v0[0:5] = e0[0:5]303// v0[5:10] = e0[5:10]304// v1[0,:] = v0305// v0[0,0:5] = e0[10:15]306// e1 = A[1,:]307// v0[0,5:10] = e1[0:5]308// v1[1,:] = v0309// v0[0,0:5] = e1[5:10]310// v0[0,5:10] = e1[10:15]311// v1[2,:] = v0312// return v1;313// }314// CHECK-LABEL: func.func @non_dividing_gcd_decreasing(315// CHECK-SAME: %[[A:.*]]: vector<2x15xi8>) -> vector<3x10xi8> {316// CHECK-DAG: %[[UB0:.*]] = ub.poison : vector<10xi8>317// CHECK-DAG: %[[UB1:.*]] = ub.poison : vector<3x10xi8>318//319// First 10 elements:320// CHECK: %[[EX0:.*]] = vector.extract %[[A]][0] : vector<15xi8> from vector<2x15xi8>321// CHECK: %[[SS0:.*]] = vector.extract_strided_slice %[[EX0]]322// CHECK-SAME: {offsets = [0], {{.*}} to vector<5xi8>323// CHECK: %[[IN0:.*]] = vector.insert_strided_slice %[[SS0]], %[[UB0]]324// CHECK-SAME: {offsets = [0], {{.*}}325// CHECK: %[[SS1:.*]] = vector.extract_strided_slice %[[EX0]]326// CHECK-SAME: {offsets = [5], {{.*}} to vector<5xi8>327// CHECK: %[[IN1:.*]] = vector.insert_strided_slice %[[SS1]], %[[IN0]]328// CHECK-SAME: {offsets = [5], {{.*}}329// CHECK: %[[IN2:.*]] = vector.insert %[[IN1]], %[[UB1]] [0] : vector<10xi8> into vector<3x10xi8>330//331// Next 10 elements:332// CHECK: %[[SS2:.*]] = vector.extract_strided_slice %[[EX0]]333// CHECK-SAME: {offsets = [10], {{.*}} to vector<5xi8>334// CHECK: %[[IN3:.*]] = vector.insert_strided_slice %[[SS2]], %[[UB0]]335// CHECK-SAME: {offsets = [0], {{.*}}336// CHECK: %[[EX1:.*]] = vector.extract %[[A]][1] : vector<15xi8> from vector<2x15xi8>337// CHECK: %[[SS3:.*]] = vector.extract_strided_slice %[[EX1]]338// CHECK-SAME: {offsets = [0], {{.*}} to vector<5xi8>339// CHECK: %[[IN4:.*]] = vector.insert_strided_slice %[[SS3]], %[[IN3]]340// CHECK-SAME: {offsets = [5], {{.*}}341// CHECK: %[[IN5:.*]] = vector.insert %[[IN4]], %[[IN2]] [1] : vector<10xi8> into vector<3x10xi8>342//343// Final 10 elements:344// CHECK: %[[SS4:.*]] = vector.extract_strided_slice %[[EX1]]345// CHECK-SAME: {offsets = [5], {{.*}} to vector<5xi8>346// CHECK: %[[IN6:.*]] = vector.insert_strided_slice %[[SS4]], %[[UB0]]347// CHECK-SAME: {offsets = [0], {{.*}}348// CHECK: %[[SS5:.*]] = vector.extract_strided_slice %[[EX1]]349// CHECK-SAME: {offsets = [10], {{.*}} to vector<5xi8>350// CHECK: %[[IN7:.*]] = vector.insert_strided_slice %[[SS5]], %[[IN6]]351// CHECK-SAME: {offsets = [5], {{.*}}352// CHECK: %[[IN8:.*]] = vector.insert %[[IN7]], %[[IN5]] [2] : vector<10xi8> into vector<3x10xi8>353// CHECK: return %[[IN8]] : vector<3x10xi8>354func.func @non_dividing_gcd_decreasing(%arg0 : vector<2x15xi8>) -> vector<3x10xi8> {355 %0 = vector.shape_cast %arg0 : vector<2x15xi8> to vector<3x10xi8>356 return %0 : vector<3x10xi8>357}358 359// CHECK-LABEL: func.func @non_dividing_gcd_increasing(360// CHECK-SAME: %[[A:.*]]: vector<3x10xi8>) -> vector<2x15xi8> {361//362// CHECK-DAG: ub.poison : vector<15xi8>363// CHECK-DAG: ub.poison : vector<2x15xi8>364//365// Collect the first 15 elements, and insert into the first row of the result.366// CHECK: vector.extract %[[A]][0]367// CHECK: extract_strided_slice368// CHECK: insert_strided_slice369// CHECK: extract_strided_slice370// CHECK: insert_strided_slice371// CHECK: vector.extract %[[A]][1]372// CHECK: extract_strided_slice373// CHECK: insert_strided_slice374// CHECK: vector.insert {{.*}} [0] : vector<15xi8> into vector<2x15xi8>375//376// Collect the next 15 elements, and insert into the second row of the result.377// CHECK: extract_strided_slice378// CHECK: insert_strided_slice379// CHECK: vector.extract %[[A]][2]380// CHECK: extract_strided_slice381// CHECK: insert_strided_slice382// CHECK: extract_strided_slice383// CHECK: insert_strided_slice384// CHECK: vector.insert {{.*}} [1] : vector<15xi8> into vector<2x15xi8>385func.func @non_dividing_gcd_increasing(%arg0 : vector<3x10xi8>) -> vector<2x15xi8> {386 %0 = vector.shape_cast %arg0 : vector<3x10xi8> to vector<2x15xi8>387 return %0 : vector<2x15xi8>388}389 390module attributes {transform.with_named_sequence} {391 transform.named_sequence @__transform_main(%module_op: !transform.any_op {transform.readonly}) {392 %f = transform.structured.match ops{["func.func"]} in %module_op393 : (!transform.any_op) -> !transform.any_op394 395 transform.apply_patterns to %f {396 transform.apply_patterns.vector.lower_shape_cast397 } : !transform.any_op398 transform.yield399 }400}401