@@ -1795,6 +1795,72 @@ func.func @no_cancel_delinearize_linearize_different_basis(%arg0: index, %arg1:
17951795
17961796// -----
17971797
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+
17981864// CHECK-LABEL: @linearize_unit_basis_disjoint
17991865// CHECK-SAME: (%[[arg0:.+]]: index, %[[arg1:.+]]: index, %[[arg2:.+]]: index, %[[arg3:.+]]: index)
18001866// CHECK: %[[ret:.+]] = affine.linearize_index disjoint [%[[arg0]], %[[arg2]]] by (3, %[[arg3]]) : index
0 commit comments