@@ -1795,6 +1795,72 @@ func.func @no_cancel_delinearize_linearize_different_basis(%arg0: index, %arg1:
1795
1795
1796
1796
// -----
1797
1797
1798
+ // CHECK-LABEL: func @split_delinearize_spanning_final_part
1799
+ // CHECK-SAME: %[[ARG0:[a-zA-Z0-9]+]]: index,
1800
+ // CHECK-SAME: %[[ARG1:[a-zA-Z0-9]+]]: index,
1801
+ // CHECK-SAME: %[[ARG2:[a-zA-Z0-9]+]]: index)
1802
+ // CHECK: %[[LIN:.+]] = affine.linearize_index disjoint [%[[ARG0]], %[[ARG1]]] by (2, 4)
1803
+ // CHECK: %[[DELIN1:.+]]:2 = affine.delinearize_index %[[LIN]] into (2)
1804
+ // CHECK: %[[DELIN2:.+]]:2 = affine.delinearize_index %[[ARG2]] into (8, 8)
1805
+ // CHECK: return %[[DELIN1]]#0, %[[DELIN1]]#1, %[[DELIN2]]#0, %[[DELIN2]]#1
1806
+ func.func @split_delinearize_spanning_final_part (%arg0: index , %arg1: index , %arg2: index ) -> (index , index , index , index ) {
1807
+ %0 = affine.linearize_index disjoint [%arg0 , %arg1 , %arg2 ] by (2 , 4 , 64 ) : index
1808
+ %1:4 = affine.delinearize_index %0 into (2 , 8 , 8 )
1809
+ : index , index , index , index
1810
+ return %1#0 , %1#1 , %1#2 , %1#3 : index , index , index , index
1811
+ }
1812
+
1813
+ // -----
1814
+
1815
+ // CHECK-LABEL: func @split_delinearize_spanning_final_part_and_cancel
1816
+ // CHECK-SAME: %[[ARG0:[a-zA-Z0-9]+]]: index,
1817
+ // CHECK-SAME: %[[ARG1:[a-zA-Z0-9]+]]: index,
1818
+ // CHECK-SAME: %[[ARG2:[a-zA-Z0-9]+]]: index)
1819
+ // CHECK: %[[DELIN:.+]]:2 = affine.delinearize_index %[[ARG2]] into (8, 8)
1820
+ // CHECK: return %[[ARG0]], %[[ARG1]], %[[DELIN]]#0, %[[DELIN]]#1
1821
+ func.func @split_delinearize_spanning_final_part_and_cancel (%arg0: index , %arg1: index , %arg2: index ) -> (index , index , index , index ) {
1822
+ %0 = affine.linearize_index disjoint [%arg0 , %arg1 , %arg2 ] by (2 , 4 , 64 ) : index
1823
+ %1:4 = affine.delinearize_index %0 into (2 , 4 , 8 , 8 )
1824
+ : index , index , index , index
1825
+ return %1#0 , %1#1 , %1#2 , %1#3 : index , index , index , index
1826
+ }
1827
+
1828
+ // -----
1829
+
1830
+ // The delinearize basis doesn't match the last basis element before
1831
+ // overshooting it, don't simplify.
1832
+ // CHECK-LABEL: func @dont_split_delinearize_overshooting_target
1833
+ // CHECK-SAME: %[[ARG0:[a-zA-Z0-9]+]]: index,
1834
+ // CHECK-SAME: %[[ARG1:[a-zA-Z0-9]+]]: index,
1835
+ // CHECK-SAME: %[[ARG2:[a-zA-Z0-9]+]]: index)
1836
+ // CHECK: %[[LIN:.+]] = affine.linearize_index disjoint [%[[ARG0]], %[[ARG1]], %[[ARG2]]] by (2, 4, 64)
1837
+ // CHECK: %[[DELIN:.+]]:4 = affine.delinearize_index %[[LIN]] into (2, 16, 8)
1838
+ // CHECK: return %[[DELIN]]#0, %[[DELIN]]#1, %[[DELIN]]#2, %[[DELIN]]#3
1839
+ func.func @dont_split_delinearize_overshooting_target (%arg0: index , %arg1: index , %arg2: index ) -> (index , index , index , index ) {
1840
+ %0 = affine.linearize_index disjoint [%arg0 , %arg1 , %arg2 ] by (2 , 4 , 64 ) : index
1841
+ %1:4 = affine.delinearize_index %0 into (2 , 16 , 8 )
1842
+ : index , index , index , index
1843
+ return %1#0 , %1#1 , %1#2 , %1#3 : index , index , index , index
1844
+ }
1845
+
1846
+ // -----
1847
+
1848
+ // The delinearize basis doesn't fully multiply to the final basis element.
1849
+ // CHECK-LABEL: func @dont_split_delinearize_undershooting_target
1850
+ // CHECK-SAME: %[[ARG0:[a-zA-Z0-9]+]]: index,
1851
+ // CHECK-SAME: %[[ARG1:[a-zA-Z0-9]+]]: index)
1852
+ // CHECK: %[[LIN:.+]] = affine.linearize_index disjoint [%[[ARG0]], %[[ARG1]]] by (2, 64)
1853
+ // CHECK: %[[DELIN:.+]]:3 = affine.delinearize_index %[[LIN]] into (4, 8)
1854
+ // CHECK: return %[[DELIN]]#0, %[[DELIN]]#1
1855
+ func.func @dont_split_delinearize_undershooting_target (%arg0: index , %arg1: index ) -> (index , index , index ) {
1856
+ %0 = affine.linearize_index disjoint [%arg0 , %arg1 ] by (2 , 64 ) : index
1857
+ %1:3 = affine.delinearize_index %0 into (4 , 8 )
1858
+ : index , index , index
1859
+ return %1#0 , %1#1 , %1#2 : index , index , index
1860
+ }
1861
+
1862
+ // -----
1863
+
1798
1864
// CHECK-LABEL: @linearize_unit_basis_disjoint
1799
1865
// CHECK-SAME: (%[[arg0:.+]]: index, %[[arg1:.+]]: index, %[[arg2:.+]]: index, %[[arg3:.+]]: index)
1800
1866
// CHECK: %[[ret:.+]] = affine.linearize_index disjoint [%[[arg0]], %[[arg2]]] by (3, %[[arg3]]) : index
0 commit comments