@@ -1469,6 +1469,45 @@ func.func @prefetch_canonicalize(%arg0: memref<512xf32>) -> () {
14691469
14701470// -----
14711471
1472+ // CHECK-LABEL: @delinearize_fold_constant
1473+ // CHECK-DAG: %[[C1:.+]] = arith.constant 1 : index
1474+ // CHECK-DAG: %[[C2:.+]] = arith.constant 2 : index
1475+ // CHECK-NOT: affine.delinearize_index
1476+ // CHECK: return %[[C1]], %[[C1]], %[[C2]]
1477+ func.func @delinearize_fold_constant () -> (index , index , index ) {
1478+ %c22 = arith.constant 22 : index
1479+ %0:3 = affine.delinearize_index %c22 into (2 , 3 , 5 ) : index , index , index
1480+ return %0#0 , %0#1 , %0#2 : index , index , index
1481+ }
1482+
1483+ // -----
1484+
1485+ // CHECK-LABEL: @delinearize_fold_negative_constant
1486+ // CHECK-DAG: %[[C_2:.+]] = arith.constant -2 : index
1487+ // CHECK-DAG: %[[C1:.+]] = arith.constant 1 : index
1488+ // CHECK-DAG: %[[C3:.+]] = arith.constant 3 : index
1489+ // CHECK-NOT: affine.delinearize_index
1490+ // CHECK: return %[[C_2]], %[[C1]], %[[C3]]
1491+ func.func @delinearize_fold_negative_constant () -> (index , index , index ) {
1492+ %c_22 = arith.constant -22 : index
1493+ %0:3 = affine.delinearize_index %c_22 into (2 , 3 , 5 ) : index , index , index
1494+ return %0#0 , %0#1 , %0#2 : index , index , index
1495+ }
1496+
1497+ // -----
1498+
1499+ // CHECK-LABEL: @delinearize_dont_fold_constant_dynamic_basis
1500+ // CHECK-DAG: %[[C22:.+]] = arith.constant 22 : index
1501+ // CHECK: %[[RET:.+]]:3 = affine.delinearize_index %[[C22]]
1502+ // CHECK: return %[[RET]]#0, %[[RET]]#1, %[[RET]]#2
1503+ func.func @delinearize_dont_fold_constant_dynamic_basis (%arg0: index ) -> (index , index , index ) {
1504+ %c22 = arith.constant 22 : index
1505+ %0:3 = affine.delinearize_index %c22 into (2 , %arg0 , 5 ) : index , index , index
1506+ return %0#0 , %0#1 , %0#2 : index , index , index
1507+ }
1508+
1509+ // -----
1510+
14721511func.func @drop_unit_basis_in_delinearize (%arg0 : index , %arg1 : index , %arg2 : index ) ->
14731512 (index , index , index , index , index , index ) {
14741513 %c1 = arith.constant 1 : index
@@ -1535,6 +1574,33 @@ func.func @delinearize_non_loop_like(%arg0: memref<?xi32>, %i : index) -> index
15351574
15361575// -----
15371576
1577+ // CHECK-LABEL: @linearize_fold_constants
1578+ // CHECK-DAG: %[[C22:.+]] = arith.constant 22 : index
1579+ // CHECK-NOT: affine.linearize
1580+ // CHECK: return %[[C22]]
1581+ func.func @linearize_fold_constants () -> index {
1582+ %c2 = arith.constant 2 : index
1583+ %c1 = arith.constant 1 : index
1584+
1585+ %ret = affine.linearize_index [%c1 , %c1 , %c2 ] by (2 , 3 , 5 ) : index
1586+ return %ret : index
1587+ }
1588+
1589+ // -----
1590+
1591+ // CHECK-LABEL: @linearize_dont_fold_dynamic_basis
1592+ // CHECK: %[[RET:.+]] = affine.linearize_index
1593+ // CHECK: return %[[RET]]
1594+ func.func @linearize_dont_fold_dynamic_basis (%arg0: index ) -> index {
1595+ %c2 = arith.constant 2 : index
1596+ %c1 = arith.constant 1 : index
1597+
1598+ %ret = affine.linearize_index [%c1 , %c1 , %c2 ] by (2 , %arg0 , 5 ) : index
1599+ return %ret : index
1600+ }
1601+
1602+ // -----
1603+
15381604// CHECK-LABEL: func @cancel_delinearize_linearize_disjoint_exact(
15391605// CHECK-SAME: %[[ARG0:[a-zA-Z0-9]+]]: index,
15401606// CHECK-SAME: %[[ARG1:[a-zA-Z0-9]+]]: index,
@@ -1676,3 +1742,17 @@ func.func @no_cancel_linearize_denearize_different_basis(%arg0: index, %arg1: in
16761742 %1 = affine.linearize_index [%0 #0 , %0 #1 , %0 #2 ] by (%arg1 , 8 , %arg2 ) : index
16771743 return %1 : index
16781744}
1745+
1746+ // -----
1747+
1748+ // CHECK-LABEL: func @affine_leading_zero(
1749+ // CHECK-SAME: %[[ARG0:[a-zA-Z0-9]+]]: index,
1750+ // CHECK-SAME: %[[ARG1:[a-zA-Z0-9]+]]: index)
1751+ // CHECK: %[[RET:.+]] = affine.linearize_index [%[[ARG0]], %[[ARG1]]] by (3, 5)
1752+ // CHECK: return %[[RET]]
1753+ func.func @affine_leading_zero (%arg0: index , %arg1: index ) -> index {
1754+ %c0 = arith.constant 0 : index
1755+ %ret = affine.linearize_index [%c0 , %arg0 , %arg1 ] by (2 , 3 , 5 ) : index
1756+ return %ret : index
1757+ }
1758+
0 commit comments