Skip to content

Commit dd7d81e

Browse files
authored
Fix simplification of x + x//c*-c to x mod c. (llvm#98909)
There was no check that rhs is actually a multiplication.
1 parent becceca commit dd7d81e

File tree

2 files changed

+11
-1
lines changed

2 files changed

+11
-1
lines changed

mlir/lib/IR/AffineExpr.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -751,8 +751,10 @@ static AffineExpr simplifyAdd(AffineExpr lhs, AffineExpr rhs) {
751751
}
752752

753753
// Process lrhs, which is 'expr floordiv c'.
754+
// expr + (expr // c * -c) = expr % c
754755
AffineBinaryOpExpr lrBinOpExpr = dyn_cast<AffineBinaryOpExpr>(lrhs);
755-
if (!lrBinOpExpr || lrBinOpExpr.getKind() != AffineExprKind::FloorDiv)
756+
if (!lrBinOpExpr || rhs.getKind() != AffineExprKind::Mul ||
757+
lrBinOpExpr.getKind() != AffineExprKind::FloorDiv)
756758
return nullptr;
757759

758760
llrhs = lrBinOpExpr.getLHS();

mlir/unittests/IR/AffineExprTest.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,11 @@ TEST(AffineExprTest, divisionSimplification) {
9898
ASSERT_EQ((d0 * 6).ceilDiv(4).getKind(), AffineExprKind::CeilDiv);
9999
ASSERT_EQ((d0 * 6).ceilDiv(-2), d0 * -3);
100100
}
101+
102+
TEST(AffineExprTest, modSimplificationRegression) {
103+
MLIRContext ctx;
104+
OpBuilder b(&ctx);
105+
auto d0 = b.getAffineDimExpr(0);
106+
auto sum = d0 + d0.floorDiv(3).floorDiv(-3);
107+
ASSERT_EQ(sum.getKind(), AffineExprKind::Add);
108+
}

0 commit comments

Comments
 (0)