brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.3 KiB · 5011d8b Raw
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