@@ -1740,11 +1740,11 @@ func.func @print_string() {
1740
1740
1741
1741
// -----
1742
1742
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 > {
1744
1744
%0 = vector.extract_strided_slice %arg0 {offsets = [2 ], sizes = [2 ], strides = [1 ]} : vector <4 xf32 > to vector <2 xf32 >
1745
1745
return %0 : vector <2 xf32 >
1746
1746
}
1747
- // CHECK-LABEL: @extract_strided_slice_f32(
1747
+ // CHECK-LABEL: @extract_strided_slice_f32_1d_from_1d
1748
1748
// CHECK-SAME: %[[A:.*]]: vector<4xf32>)
1749
1749
// CHECK: %[[T0:.*]] = llvm.shufflevector %[[A]], %[[A]] [2, 3] : vector<4xf32>
1750
1750
// CHECK: return %[[T0]] : vector<2xf32>
@@ -1753,11 +1753,11 @@ func.func @extract_strided_slice_f32(%arg0: vector<4xf32>) -> vector<2xf32> {
1753
1753
1754
1754
// -----
1755
1755
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 > {
1757
1757
%0 = vector.extract_strided_slice %arg0 {offsets = [2 ], sizes = [2 ], strides = [1 ]} : vector <4 xindex > to vector <2 xindex >
1758
1758
return %0 : vector <2 xindex >
1759
1759
}
1760
- // CHECK-LABEL: @extract_strided_slice_index(
1760
+ // CHECK-LABEL: @extract_strided_slice_index_1d_from_1d
1761
1761
// CHECK-SAME: %[[A:.*]]: vector<4xindex>)
1762
1762
// CHECK: %[[T0:.*]] = builtin.unrealized_conversion_cast %[[A]] : vector<4xindex> to vector<4xi64>
1763
1763
// 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
1840
1840
1841
1841
// -----
1842
1842
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 > {
1844
1844
%0 = vector.insert_strided_slice %b , %c {offsets = [2 , 0 , 0 ], strides = [1 , 1 ]} : vector <4 x4 xf32 > into vector <4 x4 x4 xf32 >
1845
1845
return %0 : vector <4 x4 x4 xf32 >
1846
1846
}
1847
- // CHECK-LABEL: @insert_strided_slice1
1847
+ // CHECK-LABEL: @insert_strided_slice_f32_2d_into_3d
1848
1848
// CHECK: llvm.extractvalue {{.*}}[2] : !llvm.array<4 x array<4 x vector<4xf32>>>
1849
1849
// CHECK: llvm.insertvalue {{.*}}, {{.*}}[2] : !llvm.array<4 x array<4 x vector<4xf32>>>
1850
1850
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
+
1851
1859
// -----
1852
1860
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 > {
1854
1862
%0 = vector.insert_strided_slice %b , %c {offsets = [2 , 0 , 0 ], strides = [1 , 1 ]} : vector <4 x4 xindex > into vector <4 x4 x4 xindex >
1855
1863
return %0 : vector <4 x4 x4 xindex >
1856
1864
}
1857
- // CHECK-LABEL: @insert_strided_index_slice1(
1865
+ // CHECK-LABEL: @insert_strided_index_slice_index_2d_into_3d
1858
1866
// CHECK: llvm.extractvalue {{.*}}[2] : !llvm.array<4 x array<4 x vector<4xi64>>>
1859
1867
// CHECK: llvm.insertvalue {{.*}}, {{.*}}[2] : !llvm.array<4 x array<4 x vector<4xi64>>>
1860
1868
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
+
1861
1877
// -----
1862
1878
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 > {
1864
1880
%0 = vector.insert_strided_slice %a , %b {offsets = [2 , 2 ], strides = [1 , 1 ]} : vector <2 x2 xf32 > into vector <4 x4 xf32 >
1865
1881
return %0 : vector <4 x4 xf32 >
1866
1882
}
1867
1883
1868
- // CHECK-LABEL: @insert_strided_slice2
1884
+ // CHECK-LABEL: @insert_strided_slice_f32_2d_into_2d
1869
1885
//
1870
1886
// Subvector vector<2xf32> @0 into vector<4xf32> @2
1871
1887
// 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
1883
1899
// CHECK: %[[R4_3:.*]] = llvm.shufflevector %[[R4_2]], %[[V4_3]] [4, 5, 0, 1] : vector<4xf32>
1884
1900
// CHECK: llvm.insertvalue %[[R4_3]], {{.*}}[3] : !llvm.array<4 x vector<4xf32>>
1885
1901
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
+
1886
1921
// -----
1887
1922
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 > {
1889
1924
%0 = vector.insert_strided_slice %arg0 , %arg1 {offsets = [0 , 0 , 2 ], strides = [1 , 1 ]}:
1890
1925
vector <2 x4 xf32 > into vector <16 x4 x8 xf32 >
1891
1926
return %0 : vector <16 x4 x8 xf32 >
1892
1927
}
1893
- // CHECK-LABEL: func @insert_strided_slice3
1928
+ // CHECK-LABEL: func @insert_strided_slice_f32_2d_into_3d
1894
1929
// CHECK: %[[V4_0:.*]] = llvm.extractvalue {{.*}}[0] : !llvm.array<2 x vector<4xf32>>
1895
1930
// CHECK: %[[V4_0_0:.*]] = llvm.extractvalue {{.*}}[0, 0] : !llvm.array<16 x array<4 x vector<8xf32>>>
1896
1931
// 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
1903
1938
// CHECK: %[[R8_3:.*]] = llvm.shufflevector %[[R8_2]], %[[V4_0_1]] [8, 9, 0, 1, 2, 3, 14, 15] : vector<8xf32>
1904
1939
// CHECK: llvm.insertvalue %[[R8_3]], {{.*}}[1] : !llvm.array<4 x vector<8xf32>>
1905
1940
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]).
1907
1944
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 >
1911
1949
}
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> {
1915
1950
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>>>
1918
1955
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>>
1921
1959
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>>
1924
1963
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>>>
1926
1966
1927
1967
// -----
1928
1968
0 commit comments