@@ -1740,11 +1740,11 @@ func.func @print_string() {
17401740
17411741// -----
17421742
1743- func.func @extract_strided_slice_f32 (%arg0: vector <4 xf32 >) -> vector <2 xf32 > {
1743+ func.func @extract_strided_slice_f32_1d_from_1d (%arg0: vector <4 xf32 >) -> vector <2 xf32 > {
17441744 %0 = vector.extract_strided_slice %arg0 {offsets = [2 ], sizes = [2 ], strides = [1 ]} : vector <4 xf32 > to vector <2 xf32 >
17451745 return %0 : vector <2 xf32 >
17461746}
1747- // CHECK-LABEL: @extract_strided_slice_f32(
1747+ // CHECK-LABEL: @extract_strided_slice_f32_1d_from_1d
17481748// CHECK-SAME: %[[A:.*]]: vector<4xf32>)
17491749// CHECK: %[[T0:.*]] = llvm.shufflevector %[[A]], %[[A]] [2, 3] : vector<4xf32>
17501750// CHECK: return %[[T0]] : vector<2xf32>
@@ -1753,11 +1753,11 @@ func.func @extract_strided_slice_f32(%arg0: vector<4xf32>) -> vector<2xf32> {
17531753
17541754// -----
17551755
1756- func.func @extract_strided_slice_index (%arg0: vector <4 xindex >) -> vector <2 xindex > {
1756+ func.func @extract_strided_slice_index_1d_from_1d (%arg0: vector <4 xindex >) -> vector <2 xindex > {
17571757 %0 = vector.extract_strided_slice %arg0 {offsets = [2 ], sizes = [2 ], strides = [1 ]} : vector <4 xindex > to vector <2 xindex >
17581758 return %0 : vector <2 xindex >
17591759}
1760- // CHECK-LABEL: @extract_strided_slice_index(
1760+ // CHECK-LABEL: @extract_strided_slice_index_1d_from_1d
17611761// CHECK-SAME: %[[A:.*]]: vector<4xindex>)
17621762// CHECK: %[[T0:.*]] = builtin.unrealized_conversion_cast %[[A]] : vector<4xindex> to vector<4xi64>
17631763// CHECK: %[[T2:.*]] = llvm.shufflevector %[[T0]], %[[T0]] [2, 3] : vector<4xi64>
@@ -1840,32 +1840,48 @@ func.func @extract_strided_slice_f32_2d_from_2d_scalable(%arg0: vector<4x[8]xf32
18401840
18411841// -----
18421842
1843- func.func @insert_strided_slice1 (%b: vector <4 x4 xf32 >, %c: vector <4 x4 x4 xf32 >) -> vector <4 x4 x4 xf32 > {
1843+ func.func @insert_strided_slice_f32_2d_into_3d (%b: vector <4 x4 xf32 >, %c: vector <4 x4 x4 xf32 >) -> vector <4 x4 x4 xf32 > {
18441844 %0 = vector.insert_strided_slice %b , %c {offsets = [2 , 0 , 0 ], strides = [1 , 1 ]} : vector <4 x4 xf32 > into vector <4 x4 x4 xf32 >
18451845 return %0 : vector <4 x4 x4 xf32 >
18461846}
1847- // CHECK-LABEL: @insert_strided_slice1
1847+ // CHECK-LABEL: @insert_strided_slice_f32_2d_into_3d
18481848// CHECK: llvm.extractvalue {{.*}}[2] : !llvm.array<4 x array<4 x vector<4xf32>>>
18491849// CHECK: llvm.insertvalue {{.*}}, {{.*}}[2] : !llvm.array<4 x array<4 x vector<4xf32>>>
18501850
1851+ func.func @insert_strided_slice_f32_2d_into_3d_scalable (%b: vector <4 x[4 ]xf32 >, %c: vector <4 x4 x[4 ]xf32 >) -> vector <4 x4 x[4 ]xf32 > {
1852+ %0 = vector.insert_strided_slice %b , %c {offsets = [2 , 0 , 0 ], strides = [1 , 1 ]} : vector <4 x[4 ]xf32 > into vector <4 x4 x[4 ]xf32 >
1853+ return %0 : vector <4 x4 x[4 ]xf32 >
1854+ }
1855+ // CHECK-LABEL: @insert_strided_slice_f32_2d_into_3d_scalable
1856+ // CHECK: llvm.extractvalue {{.*}}[2] : !llvm.array<4 x array<4 x vector<[4]xf32>>>
1857+ // CHECK: llvm.insertvalue {{.*}}, {{.*}}[2] : !llvm.array<4 x array<4 x vector<[4]xf32>>>
1858+
18511859// -----
18521860
1853- func.func @insert_strided_index_slice1 (%b: vector <4 x4 xindex >, %c: vector <4 x4 x4 xindex >) -> vector <4 x4 x4 xindex > {
1861+ func.func @insert_strided_index_slice_index_2d_into_3d (%b: vector <4 x4 xindex >, %c: vector <4 x4 x4 xindex >) -> vector <4 x4 x4 xindex > {
18541862 %0 = vector.insert_strided_slice %b , %c {offsets = [2 , 0 , 0 ], strides = [1 , 1 ]} : vector <4 x4 xindex > into vector <4 x4 x4 xindex >
18551863 return %0 : vector <4 x4 x4 xindex >
18561864}
1857- // CHECK-LABEL: @insert_strided_index_slice1(
1865+ // CHECK-LABEL: @insert_strided_index_slice_index_2d_into_3d
18581866// CHECK: llvm.extractvalue {{.*}}[2] : !llvm.array<4 x array<4 x vector<4xi64>>>
18591867// CHECK: llvm.insertvalue {{.*}}, {{.*}}[2] : !llvm.array<4 x array<4 x vector<4xi64>>>
18601868
1869+ func.func @insert_strided_index_slice_index_2d_into_3d_scalable (%b: vector <4 x[4 ]xindex >, %c: vector <4 x4 x[4 ]xindex >) -> vector <4 x4 x[4 ]xindex > {
1870+ %0 = vector.insert_strided_slice %b , %c {offsets = [2 , 0 , 0 ], strides = [1 , 1 ]} : vector <4 x[4 ]xindex > into vector <4 x4 x[4 ]xindex >
1871+ return %0 : vector <4 x4 x[4 ]xindex >
1872+ }
1873+ // CHECK-LABEL: @insert_strided_index_slice_index_2d_into_3d_scalable
1874+ // CHECK: llvm.extractvalue {{.*}}[2] : !llvm.array<4 x array<4 x vector<[4]xi64>>>
1875+ // CHECK: llvm.insertvalue {{.*}}, {{.*}}[2] : !llvm.array<4 x array<4 x vector<[4]xi64>>>
1876+
18611877// -----
18621878
1863- func.func @insert_strided_slice2 (%a: vector <2 x2 xf32 >, %b: vector <4 x4 xf32 >) -> vector <4 x4 xf32 > {
1879+ func.func @insert_strided_slice_f32_2d_into_2d (%a: vector <2 x2 xf32 >, %b: vector <4 x4 xf32 >) -> vector <4 x4 xf32 > {
18641880 %0 = vector.insert_strided_slice %a , %b {offsets = [2 , 2 ], strides = [1 , 1 ]} : vector <2 x2 xf32 > into vector <4 x4 xf32 >
18651881 return %0 : vector <4 x4 xf32 >
18661882}
18671883
1868- // CHECK-LABEL: @insert_strided_slice2
1884+ // CHECK-LABEL: @insert_strided_slice_f32_2d_into_2d
18691885//
18701886// Subvector vector<2xf32> @0 into vector<4xf32> @2
18711887// CHECK: %[[V2_0:.*]] = llvm.extractvalue {{.*}}[0] : !llvm.array<2 x vector<2xf32>>
@@ -1883,14 +1899,33 @@ func.func @insert_strided_slice2(%a: vector<2x2xf32>, %b: vector<4x4xf32>) -> ve
18831899// CHECK: %[[R4_3:.*]] = llvm.shufflevector %[[R4_2]], %[[V4_3]] [4, 5, 0, 1] : vector<4xf32>
18841900// CHECK: llvm.insertvalue %[[R4_3]], {{.*}}[3] : !llvm.array<4 x vector<4xf32>>
18851901
1902+ // NOTE: For scalable dimensions, the corresponding "base" size must match
1903+ // (i.e. we can only insert "full" scalable dimensions, e.g. [2] into [2], but
1904+ // not [2] from [4]).
1905+
1906+ func.func @insert_strided_slice_f32_2d_into_2d_scalable (%a: vector <2 x[2 ]xf32 >, %b: vector <4 x[2 ]xf32 >) -> vector <4 x[2 ]xf32 > {
1907+ %0 = vector.insert_strided_slice %a , %b {offsets = [2 , 0 ], strides = [1 , 1 ]} : vector <2 x[2 ]xf32 > into vector <4 x[2 ]xf32 >
1908+ return %0 : vector <4 x[2 ]xf32 >
1909+ }
1910+
1911+ // CHECK-LABEL: func.func @insert_strided_slice_f32_2d_into_2d_scalable
1912+ // Subvector vector<[2]xf32> @0 into vector<[4]xf32> @2
1913+ // CHECK: %[[A_0:.*]] = llvm.extractvalue {{.*}}[0] : !llvm.array<2 x vector<[2]xf32>>
1914+ // Element @0 -> element @2
1915+ // CHECK: %[[B_UPDATED:.*]] = llvm.insertvalue %[[A_0]], {{.*}}[2] : !llvm.array<4 x vector<[2]xf32>>
1916+ // Subvector vector<[2]xf32> @1 into vector<[4]xf32> @3
1917+ // CHECK: %[[A_1:.*]] = llvm.extractvalue {{.*}}[1] : !llvm.array<2 x vector<[2]xf32>>
1918+ // Element @0 -> element @2
1919+ // CHECK: llvm.insertvalue %[[A_1]], %[[B_UPDATED]][3] : !llvm.array<4 x vector<[2]xf32>>
1920+
18861921// -----
18871922
1888- func.func @insert_strided_slice3 (%arg0: vector <2 x4 xf32 >, %arg1: vector <16 x4 x8 xf32 >) -> vector <16 x4 x8 xf32 > {
1923+ func.func @insert_strided_slice_f32_2d_into_3d (%arg0: vector <2 x4 xf32 >, %arg1: vector <16 x4 x8 xf32 >) -> vector <16 x4 x8 xf32 > {
18891924 %0 = vector.insert_strided_slice %arg0 , %arg1 {offsets = [0 , 0 , 2 ], strides = [1 , 1 ]}:
18901925 vector <2 x4 xf32 > into vector <16 x4 x8 xf32 >
18911926 return %0 : vector <16 x4 x8 xf32 >
18921927}
1893- // CHECK-LABEL: func @insert_strided_slice3
1928+ // CHECK-LABEL: func @insert_strided_slice_f32_2d_into_3d
18941929// CHECK: %[[V4_0:.*]] = llvm.extractvalue {{.*}}[0] : !llvm.array<2 x vector<4xf32>>
18951930// CHECK: %[[V4_0_0:.*]] = llvm.extractvalue {{.*}}[0, 0] : !llvm.array<16 x array<4 x vector<8xf32>>>
18961931// CHECK: %[[R8_0:.*]] = llvm.shufflevector %[[V4_0]], %[[V4_0]] [0, 1, 2, 3, 0, 0, 0, 0] : vector<4xf32>
@@ -1903,26 +1938,31 @@ func.func @insert_strided_slice3(%arg0: vector<2x4xf32>, %arg1: vector<16x4x8xf3
19031938// CHECK: %[[R8_3:.*]] = llvm.shufflevector %[[R8_2]], %[[V4_0_1]] [8, 9, 0, 1, 2, 3, 14, 15] : vector<8xf32>
19041939// CHECK: llvm.insertvalue %[[R8_3]], {{.*}}[1] : !llvm.array<4 x vector<8xf32>>
19051940
1906- // -----
1941+ // NOTE: For scalable dimensions, the corresponding "base" size must match
1942+ // (i.e. we can only insert "full" scalable dimensions, e.g. [4] into [4], but
1943+ // not [4] from [8]).
19071944
1908- func.func @insert_strided_slice_scalable (%arg0 : vector <1 x1 x[4 ]xi32 >, %arg1: vector <1 x4 x[4 ]xi32 >) -> vector <1 x4 x[4 ]xi32 > {
1909- %0 = vector.insert_strided_slice %arg0 , %arg1 {offsets = [0 , 3 , 0 ], strides = [1 , 1 , 1 ]} : vector <1 x1 x[4 ]xi32 > into vector <1 x4 x[4 ]xi32 >
1910- return %0 : vector <1 x4 x[4 ]xi32 >
1945+ func.func @insert_strided_slice_f32_2d_into_3d_scalable (%arg0: vector <2 x[4 ]xf32 >, %arg1: vector <16 x4 x[4 ]xf32 >) -> vector <16 x4 x[4 ]xf32 > {
1946+ %0 = vector.insert_strided_slice %arg0 , %arg1 {offsets = [3 , 2 , 0 ], strides = [1 , 1 ]}:
1947+ vector <2 x[4 ]xf32 > into vector <16 x4 x[4 ]xf32 >
1948+ return %0 : vector <16 x4 x[4 ]xf32 >
19111949}
1912- // CHECK-LABEL: func.func @insert_strided_slice_scalable(
1913- // CHECK-SAME: %[[ARG_0:.*]]: vector<1x1x[4]xi32>,
1914- // CHECK-SAME: %[[ARG_1:.*]]: vector<1x4x[4]xi32>) -> vector<1x4x[4]xi32> {
19151950
1916- // CHECK-DAG: %[[CAST_1:.*]] = builtin.unrealized_conversion_cast %[[ARG_0]] : vector<1x1x[4]xi32> to !llvm.array<1 x array<1 x vector<[4]xi32>>>
1917- // CHECK-DAG: %[[CAST_2:.*]] = builtin.unrealized_conversion_cast %[[ARG_1]] : vector<1x4x[4]xi32> to !llvm.array<1 x array<4 x vector<[4]xi32>>>
1951+ // CHECK-LABEL: func.func @insert_strided_slice_f32_2d_into_3d_scalable(
1952+
1953+ // Subvector vector<4x[4]xf32> from vector<16x4x[4]xf32> @3
1954+ // CHECK: %[[ARG_1_0:.*]] = llvm.extractvalue {{.*}}[3] : !llvm.array<16 x array<4 x vector<[4]xf32>>>
19181955
1919- // CHECK: %[[EXT_1:.*]] = llvm.extractvalue %[[CAST_2]][0] : !llvm.array<1 x array<4 x vector<[4]xi32>>>
1920- // CHECK: %[[EXT_2:.*]] = llvm.extractvalue %[[CAST_1]][0, 0] : !llvm.array<1 x array<1 x vector<[4]xi32>>>
1956+ // Subvector vector<[4]xf32> @0 into vector<4x[4]xf32> @2
1957+ // CHECK: %[[ARG_0_0:.*]] = llvm.extractvalue {{.*}}[0] : !llvm.array<2 x vector<[4]xf32>>
1958+ // CHECK: %[[B_UPDATED_0:.*]] = llvm.insertvalue %[[ARG_0_0]], %[[ARG_1_0]][2] : !llvm.array<4 x vector<[4]xf32>>
19211959
1922- // CHECK: %[[INS_1:.*]] = llvm.insertvalue %[[EXT_2]], %[[EXT_1]][3] : !llvm.array<4 x vector<[4]xi32>>
1923- // CHECK: %[[INS_2:.*]] = llvm.insertvalue %[[INS_1]], %[[CAST_2]][0] : !llvm.array<1 x array<4 x vector<[4]xi32>>>
1960+ // Subvector vector<[4]xf32> @1 into vector<4x[4]xf32> @3
1961+ // CHECK: %[[ARG_0_1:.*]] = llvm.extractvalue {{.*}}[1] : !llvm.array<2 x vector<[4]xf32>>
1962+ // CHECK: %[[B_UPDATED_1:.*]] = llvm.insertvalue %[[ARG_0_1]], %[[B_UPDATED_0]][3] : !llvm.array<4 x vector<[4]xf32>>
19241963
1925- // CHECK: builtin.unrealized_conversion_cast %[[INS_2]] : !llvm.array<1 x array<4 x vector<[4]xi32>>> to vector<1x4x[4]xi32>
1964+ // Subvector vector<4x[4]xf32> into vector<16x4x[4]xf32> @3
1965+ // CHECK: llvm.insertvalue %[[B_UPDATED_1]], {{.*}}[3] : !llvm.array<16 x array<4 x vector<[4]xf32>>>
19261966
19271967// -----
19281968
0 commit comments