@@ -1535,6 +1535,60 @@ func.func @delinearize_non_loop_like(%arg0: memref<?xi32>, %i : index) -> index
15351535
15361536// -----
15371537
1538+ // CHECK-LABEL: func @cancel_delinearize_linearize_disjoint_exact(
1539+ // CHECK-SAME: %[[ARG0:[a-zA-Z0-9]+]]: index,
1540+ // CHECK-SAME: %[[ARG1:[a-zA-Z0-9]+]]: index,
1541+ // CHECK-SAME: %[[ARG2:[a-zA-Z0-9]+]]: index,
1542+ // CHECK-SAME: %[[ARG3:[a-zA-Z0-9]+]]: index,
1543+ // CHECK-SAME: %[[ARG4:[a-zA-Z0-9]+]]: index)
1544+ // CHECK: return %[[ARG0]], %[[ARG1]], %[[ARG2]]
1545+ func.func @cancel_delinearize_linearize_disjoint_exact (%arg0: index , %arg1: index , %arg2: index , %arg3: index , %arg4: index ) -> (index , index , index ) {
1546+ %0 = affine.linearize_index disjoint [%arg0 , %arg1 , %arg2 ] by (%arg3 , 4 , %arg4 ) : index
1547+ %1:3 = affine.delinearize_index %0 into (%arg3 , 4 , %arg4 )
1548+ : index , index , index
1549+ return %1#0 , %1#1 , %1#2 : index , index , index
1550+ }
1551+
1552+ // -----
1553+
1554+ // Without `disjoint`, the cancelation isn't guaranteed to be the identity.
1555+ // CHECK-LABEL: func @no_cancel_delinearize_linearize_exact(
1556+ // CHECK-SAME: %[[ARG0:[a-zA-Z0-9]+]]: index,
1557+ // CHECK-SAME: %[[ARG1:[a-zA-Z0-9]+]]: index,
1558+ // CHECK-SAME: %[[ARG2:[a-zA-Z0-9]+]]: index,
1559+ // CHECK-SAME: %[[ARG3:[a-zA-Z0-9]+]]: index,
1560+ // CHECK-SAME: %[[ARG4:[a-zA-Z0-9]+]]: index)
1561+ // CHECK: %[[LIN:.+]] = affine.linearize_index [%[[ARG0]], %[[ARG1]], %[[ARG2]]] by (%[[ARG3]], 4, %[[ARG4]])
1562+ // CHECK: %[[DELIN:.+]]:3 = affine.delinearize_index %[[LIN]] into (%[[ARG3]], 4, %[[ARG4]])
1563+ // CHECK: return %[[DELIN]]#0, %[[DELIN]]#1, %[[DELIN]]#2
1564+ func.func @no_cancel_delinearize_linearize_exact (%arg0: index , %arg1: index , %arg2: index , %arg3: index , %arg4: index ) -> (index , index , index ) {
1565+ %0 = affine.linearize_index [%arg0 , %arg1 , %arg2 ] by (%arg3 , 4 , %arg4 ) : index
1566+ %1:3 = affine.delinearize_index %0 into (%arg3 , 4 , %arg4 )
1567+ : index , index , index
1568+ return %1#0 , %1#1 , %1#2 : index , index , index
1569+ }
1570+
1571+ // -----
1572+
1573+ // These don't cancel because the delinearize and linearize have a different basis.
1574+ // CHECK-LABEL: func @no_cancel_delinearize_linearize_different_basis(
1575+ // CHECK-SAME: %[[ARG0:[a-zA-Z0-9]+]]: index,
1576+ // CHECK-SAME: %[[ARG1:[a-zA-Z0-9]+]]: index,
1577+ // CHECK-SAME: %[[ARG2:[a-zA-Z0-9]+]]: index,
1578+ // CHECK-SAME: %[[ARG3:[a-zA-Z0-9]+]]: index,
1579+ // CHECK-SAME: %[[ARG4:[a-zA-Z0-9]+]]: index)
1580+ // CHECK: %[[LIN:.+]] = affine.linearize_index [%[[ARG0]], %[[ARG1]], %[[ARG2]]] by (%[[ARG3]], 4, %[[ARG4]])
1581+ // CHECK: %[[DELIN:.+]]:3 = affine.delinearize_index %[[LIN]] into (%[[ARG3]], 8, %[[ARG4]])
1582+ // CHECK: return %[[DELIN]]#0, %[[DELIN]]#1, %[[DELIN]]#2
1583+ func.func @no_cancel_delinearize_linearize_different_basis (%arg0: index , %arg1: index , %arg2: index , %arg3: index , %arg4: index ) -> (index , index , index ) {
1584+ %0 = affine.linearize_index [%arg0 , %arg1 , %arg2 ] by (%arg3 , 4 , %arg4 ) : index
1585+ %1:3 = affine.delinearize_index %0 into (%arg3 , 8 , %arg4 )
1586+ : index , index , index
1587+ return %1#0 , %1#1 , %1#2 : index , index , index
1588+ }
1589+
1590+ // -----
1591+
15381592// CHECK-LABEL: @linearize_unit_basis_disjoint
15391593// CHECK-SAME: (%[[arg0:.+]]: index, %[[arg1:.+]]: index, %[[arg2:.+]]: index, %[[arg3:.+]]: index)
15401594// CHECK: %[[ret:.+]] = affine.linearize_index disjoint [%[[arg0]], %[[arg2]]] by (3, %[[arg3]]) : index
@@ -1577,3 +1631,48 @@ func.func @linearize_one_element_basis(%arg0: index, %arg1: index) -> index {
15771631 %ret = affine.linearize_index [%arg0 ] by (%arg1 ) : index
15781632 return %ret : index
15791633}
1634+
1635+ // -----
1636+
1637+ // CHECK-LABEL: func @cancel_linearize_denearize_exact(
1638+ // CHECK-SAME: %[[ARG0:[a-zA-Z0-9]+]]: index,
1639+ // CHECK-SAME: %[[ARG1:[a-zA-Z0-9]+]]: index,
1640+ // CHECK-SAME: %[[ARG2:[a-zA-Z0-9]+]]: index)
1641+ // CHECK: return %[[ARG0]]
1642+ func.func @cancel_linearize_denearize_exact (%arg0: index , %arg1: index , %arg2: index ) -> index {
1643+ %0:3 = affine.delinearize_index %arg0 into (%arg1 , 4 , %arg2 ) : index , index , index
1644+ %1 = affine.linearize_index [%0 #0 , %0 #1 , %0 #2 ] by (%arg1 , 4 , %arg2 ) : index
1645+ return %1 : index
1646+ }
1647+
1648+ // -----
1649+
1650+ // Don't cancel because the values from the delinearize aren't used in order
1651+ // CHECK-LABEL: func @no_cancel_linearize_denearize_permuted(
1652+ // CHECK-SAME: %[[ARG0:[a-zA-Z0-9]+]]: index,
1653+ // CHECK-SAME: %[[ARG1:[a-zA-Z0-9]+]]: index,
1654+ // CHECK-SAME: %[[ARG2:[a-zA-Z0-9]+]]: index)
1655+ // CHECK: %[[DELIN:.+]]:3 = affine.delinearize_index %[[ARG0]] into (%[[ARG1]], 4, %[[ARG2]])
1656+ // CHECK: %[[LIN:.+]] = affine.linearize_index [%[[DELIN]]#0, %[[DELIN]]#2, %[[DELIN]]#1] by (%[[ARG1]], 4, %[[ARG2]])
1657+ // CHECK: return %[[LIN]]
1658+ func.func @no_cancel_linearize_denearize_permuted (%arg0: index , %arg1: index , %arg2: index ) -> index {
1659+ %0:3 = affine.delinearize_index %arg0 into (%arg1 , 4 , %arg2 ) : index , index , index
1660+ %1 = affine.linearize_index [%0 #0 , %0 #2 , %0 #1 ] by (%arg1 , 4 , %arg2 ) : index
1661+ return %1 : index
1662+ }
1663+
1664+ // -----
1665+
1666+ // Won't cancel because the linearize and delinearize are using a different basis
1667+ // CHECK-LABEL: func @no_cancel_linearize_denearize_different_basis(
1668+ // CHECK-SAME: %[[ARG0:[a-zA-Z0-9]+]]: index,
1669+ // CHECK-SAME: %[[ARG1:[a-zA-Z0-9]+]]: index,
1670+ // CHECK-SAME: %[[ARG2:[a-zA-Z0-9]+]]: index)
1671+ // CHECK: %[[DELIN:.+]]:3 = affine.delinearize_index %[[ARG0]] into (%[[ARG1]], 4, %[[ARG2]])
1672+ // CHECK: %[[LIN:.+]] = affine.linearize_index [%[[DELIN]]#0, %[[DELIN]]#1, %[[DELIN]]#2] by (%[[ARG1]], 8, %[[ARG2]])
1673+ // CHECK: return %[[LIN]]
1674+ func.func @no_cancel_linearize_denearize_different_basis (%arg0: index , %arg1: index , %arg2: index ) -> index {
1675+ %0:3 = affine.delinearize_index %arg0 into (%arg1 , 4 , %arg2 ) : index , index , index
1676+ %1 = affine.linearize_index [%0 #0 , %0 #1 , %0 #2 ] by (%arg1 , 8 , %arg2 ) : index
1677+ return %1 : index
1678+ }
0 commit comments