@@ -1535,6 +1535,60 @@ func.func @delinearize_non_loop_like(%arg0: memref<?xi32>, %i : index) -> index
1535
1535
1536
1536
// -----
1537
1537
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
+
1538
1592
// CHECK-LABEL: @linearize_unit_basis_disjoint
1539
1593
// CHECK-SAME: (%[[arg0:.+]]: index, %[[arg1:.+]]: index, %[[arg2:.+]]: index, %[[arg3:.+]]: index)
1540
1594
// 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 {
1577
1631
%ret = affine.linearize_index [%arg0 ] by (%arg1 ) : index
1578
1632
return %ret : index
1579
1633
}
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