[Mlir-commits] [mlir] 41a8b46 - [MLIR] Fix AffineExpr getLargestKnownDivisor for ceildiv and floordiv
Uday Bondhugula
llvmlistbot at llvm.org
Tue Oct 26 03:51:56 PDT 2021
Author: Uday Bondhugula
Date: 2021-10-26T16:21:29+05:30
New Revision: 41a8b4600731b0ce702adb6087c73133089c78d5
URL: https://github.com/llvm/llvm-project/commit/41a8b4600731b0ce702adb6087c73133089c78d5
DIFF: https://github.com/llvm/llvm-project/commit/41a8b4600731b0ce702adb6087c73133089c78d5.diff
LOG: [MLIR] Fix AffineExpr getLargestKnownDivisor for ceildiv and floordiv
Fix AffineExpr `getLargestKnownDivisor` for ceil/floor div cases.
In these cases, nothing can be inferred on the divisor of the
result.
Add test case for `mod` as well.
Differential Revision: https://reviews.llvm.org/D112523
Added:
Modified:
mlir/lib/IR/AffineExpr.cpp
mlir/test/Dialect/Affine/unroll.mlir
Removed:
################################################################################
diff --git a/mlir/lib/IR/AffineExpr.cpp b/mlir/lib/IR/AffineExpr.cpp
index 2e13d6ae62c4..b98731031521 100644
--- a/mlir/lib/IR/AffineExpr.cpp
+++ b/mlir/lib/IR/AffineExpr.cpp
@@ -216,9 +216,11 @@ bool AffineExpr::isPureAffine() const {
int64_t AffineExpr::getLargestKnownDivisor() const {
AffineBinaryOpExpr binExpr(nullptr);
switch (getKind()) {
- case AffineExprKind::SymbolId:
+ case AffineExprKind::CeilDiv:
LLVM_FALLTHROUGH;
case AffineExprKind::DimId:
+ case AffineExprKind::FloorDiv:
+ case AffineExprKind::SymbolId:
return 1;
case AffineExprKind::Constant:
return std::abs(this->cast<AffineConstantExpr>().getValue());
@@ -229,8 +231,6 @@ int64_t AffineExpr::getLargestKnownDivisor() const {
}
case AffineExprKind::Add:
LLVM_FALLTHROUGH;
- case AffineExprKind::FloorDiv:
- case AffineExprKind::CeilDiv:
case AffineExprKind::Mod: {
binExpr = cast<AffineBinaryOpExpr>();
return llvm::GreatestCommonDivisor64(
diff --git a/mlir/test/Dialect/Affine/unroll.mlir b/mlir/test/Dialect/Affine/unroll.mlir
index 4b302c45b036..fe7b8e4c10ad 100644
--- a/mlir/test/Dialect/Affine/unroll.mlir
+++ b/mlir/test/Dialect/Affine/unroll.mlir
@@ -468,6 +468,30 @@ func @loop_nest_operand2() {
return
}
+// UNROLL-BY-4-LABEL: func @floordiv_mod_ub
+func @floordiv_mod_ub(%M : index, %N : index) {
+ affine.for %i = 0 to %N step 4 {
+ // A cleanup should be generated here.
+ affine.for %j = 0 to min affine_map<(d0)[s0] -> ((16 * d0) floordiv (4 * s0))>(%i)[%N] {
+ "test.foo"() : () -> ()
+ }
+ }
+ // UNROLL-BY-4-NEXT: affine.for
+ // UNROLL-BY-4-NEXT: affine.for %{{.*}} = 0 to {{.*}} step 4
+ // UNROLL-BY-4: affine.for
+ affine.for %i = 0 to %N step 4 {
+ // No cleanup needed here.
+ affine.for %j = 0 to min affine_map<(d0)[s0] -> ((16 * d0) mod (4 * s0))>(%i)[%N] {
+ "test.foo"() : () -> ()
+ }
+ }
+ // UNROLL-BY-4: affine.for
+ // UNROLL-BY-4-NEXT: affine.for %{{.*}} = 0 to {{.*}} step 4
+ // UNROLL-BY-4-NOT: affine.for
+ // UNROLL-BY-4: return
+ return
+}
+
// Difference between loop bounds is constant, but not a multiple of unroll
// factor. The cleanup loop happens to be a single iteration one and is promoted.
// UNROLL-BY-4-LABEL: func @loop_nest_operand3() {
More information about the Mlir-commits
mailing list