-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[mlir][affine] ValueBoundsConstraintSet: Fully compose affine.apply #68899
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[mlir][affine] ValueBoundsConstraintSet: Fully compose affine.apply #68899
Conversation
@llvm/pr-subscribers-mlir-affine @llvm/pr-subscribers-mlir Author: Matthias Springer (matthias-springer) ChangesFully compose Details for future improvements of
Full diff: https://github.com/llvm/llvm-project/pull/68899.diff 2 Files Affected:
diff --git a/mlir/lib/Dialect/Affine/IR/ValueBoundsOpInterfaceImpl.cpp b/mlir/lib/Dialect/Affine/IR/ValueBoundsOpInterfaceImpl.cpp
index 97dd70e4f1d2b7e..f564a26dfae6f76 100644
--- a/mlir/lib/Dialect/Affine/IR/ValueBoundsOpInterfaceImpl.cpp
+++ b/mlir/lib/Dialect/Affine/IR/ValueBoundsOpInterfaceImpl.cpp
@@ -27,12 +27,22 @@ struct AffineApplyOpInterface
assert(applyOp.getAffineMap().getNumResults() == 1 &&
"expected single result");
+ // Fully compose this affine.apply with other ops because the folding logic
+ // can see opportunities for simplifying the affine map that
+ // `FlatLinearConstraints` can currently not see.
+ AffineMap map = applyOp.getAffineMap();
+ SmallVector<Value> operands = llvm::to_vector(applyOp.getOperands());
+ fullyComposeAffineMapAndOperands(&map, &operands);
+
// Align affine map result with dims/symbols in the constraint set.
- AffineExpr expr = applyOp.getAffineMap().getResult(0);
- SmallVector<AffineExpr> dimReplacements = llvm::to_vector(llvm::map_range(
- applyOp.getDimOperands(), [&](Value v) { return cstr.getExpr(v); }));
- SmallVector<AffineExpr> symReplacements = llvm::to_vector(llvm::map_range(
- applyOp.getSymbolOperands(), [&](Value v) { return cstr.getExpr(v); }));
+ AffineExpr expr = map.getResult(0);
+ SmallVector<AffineExpr> dimReplacements, symReplacements;
+ for (int64_t i = 0, e = map.getNumDims(); i < e; ++i)
+ dimReplacements.push_back(cstr.getExpr(operands[i]));
+ for (int64_t i = map.getNumDims(),
+ e = map.getNumDims() + map.getNumSymbols();
+ i < e; ++i)
+ symReplacements.push_back(cstr.getExpr(operands[i]));
AffineExpr bound =
expr.replaceDimsAndSymbols(dimReplacements, symReplacements);
cstr.bound(value) == bound;
diff --git a/mlir/test/Dialect/Affine/value-bounds-op-interface-impl.mlir b/mlir/test/Dialect/Affine/value-bounds-op-interface-impl.mlir
index 338c48c5b210bc1..03d38475d7f4e0c 100644
--- a/mlir/test/Dialect/Affine/value-bounds-op-interface-impl.mlir
+++ b/mlir/test/Dialect/Affine/value-bounds-op-interface-impl.mlir
@@ -58,3 +58,22 @@ func.func @affine_min_lb(%a: index) -> (index) {
%2 = "test.reify_bound"(%1) {type = "LB"}: (index) -> (index)
return %2 : index
}
+
+// -----
+
+// CHECK-LABEL: func @composed_affine_apply(
+// CHECK: %[[cst:.*]] = arith.constant -8 : index
+// CHECK: return %[[cst]]
+func.func @composed_affine_apply(%i1 : index) -> (index) {
+ // The ValueBoundsOpInterface implementation of affine.apply fully composes
+ // the affine map (and its operands) with other affine.apply ops drawn from
+ // its operands before adding it to the constraint set. This is to work
+ // around a limitation in `FlatLinearConstraints`, which can currently not
+ // compute a constant bound for %s. (The affine map simplification logic can
+ // simplify %s to -8.)
+ %i2 = affine.apply affine_map<(d0) -> ((d0 floordiv 32) * 16)>(%i1)
+ %i3 = affine.apply affine_map<(d0) -> ((d0 floordiv 32) * 16 + 8)>(%i1)
+ %s = affine.apply affine_map<()[s0, s1] -> (s0 - s1)>()[%i2, %i3]
+ %reified = "test.reify_constant_bound"(%s) {type = "EQ"} : (index) -> (index)
+ return %reified : index
+}
|
Fully compose `affine.apply` ops before adding them to the underlying `FlatLinearConstraints`. This works around a limitation of `FlatLinearConstraints`, which cannot deduce a constant bound if it involves two identical local variables. Details for future improvements of `FlatLinearConstraints`: The constraint set infrastructure fails to compute a constant bound of -8 for the first variable. ``` Domain: 0, Range: 1, Symbols: 4, Locals: 2 8 constraints (None None None None None Local Local const) 1 -1 0 0 0 0 0 0 = 0 0 1 -1 1 0 0 0 0 = 0 0 0 1 0 0 0 -16 0 = 0 0 0 0 1 0 -16 0 -8 = 0 0 0 0 0 -1 0 32 31 >= 0 0 0 0 0 1 0 -32 0 >= 0 0 0 0 0 -1 32 0 31 >= 0 0 0 0 0 1 -32 0 0 >= 0 ```
eca7891
to
cce0c62
Compare
…lvm#68899) Fully compose `affine.apply` ops before adding them to the underlying `FlatLinearConstraints`. This works around a limitation of `FlatLinearConstraints`, which cannot deduce a constant bound if it involves two identical local variables. Details for future improvements of `FlatLinearConstraints`: The constraint set infrastructure fails to compute a constant bound of -8 for the first variable. ``` Domain: 0, Range: 1, Symbols: 4, Locals: 2 8 constraints (None None None None None Local Local const) 1 -1 0 0 0 0 0 0 = 0 0 1 -1 1 0 0 0 0 = 0 0 0 1 0 0 0 -16 0 = 0 0 0 0 1 0 -16 0 -8 = 0 0 0 0 0 -1 0 32 31 >= 0 0 0 0 0 1 0 -32 0 >= 0 0 0 0 0 -1 32 0 31 >= 0 0 0 0 0 1 -32 0 0 >= 0 ```
…lvm#68899) Fully compose `affine.apply` ops before adding them to the underlying `FlatLinearConstraints`. This works around a limitation of `FlatLinearConstraints`, which cannot deduce a constant bound if it involves two identical local variables. Details for future improvements of `FlatLinearConstraints`: The constraint set infrastructure fails to compute a constant bound of -8 for the first variable. ``` Domain: 0, Range: 1, Symbols: 4, Locals: 2 8 constraints (None None None None None Local Local const) 1 -1 0 0 0 0 0 0 = 0 0 1 -1 1 0 0 0 0 = 0 0 0 1 0 0 0 -16 0 = 0 0 0 0 1 0 -16 0 -8 = 0 0 0 0 0 -1 0 32 31 >= 0 0 0 0 0 1 0 -32 0 >= 0 0 0 0 0 -1 32 0 31 >= 0 0 0 0 0 1 -32 0 0 >= 0 ```
…lvm#68899) Fully compose `affine.apply` ops before adding them to the underlying `FlatLinearConstraints`. This works around a limitation of `FlatLinearConstraints`, which cannot deduce a constant bound if it involves two identical local variables. Details for future improvements of `FlatLinearConstraints`: The constraint set infrastructure fails to compute a constant bound of -8 for the first variable. ``` Domain: 0, Range: 1, Symbols: 4, Locals: 2 8 constraints (None None None None None Local Local const) 1 -1 0 0 0 0 0 0 = 0 0 1 -1 1 0 0 0 0 = 0 0 0 1 0 0 0 -16 0 = 0 0 0 0 1 0 -16 0 -8 = 0 0 0 0 0 -1 0 32 31 >= 0 0 0 0 0 1 0 -32 0 >= 0 0 0 0 0 -1 32 0 31 >= 0 0 0 0 0 1 -32 0 0 >= 0 ```
…lvm#68899) Fully compose `affine.apply` ops before adding them to the underlying `FlatLinearConstraints`. This works around a limitation of `FlatLinearConstraints`, which cannot deduce a constant bound if it involves two identical local variables. Details for future improvements of `FlatLinearConstraints`: The constraint set infrastructure fails to compute a constant bound of -8 for the first variable. ``` Domain: 0, Range: 1, Symbols: 4, Locals: 2 8 constraints (None None None None None Local Local const) 1 -1 0 0 0 0 0 0 = 0 0 1 -1 1 0 0 0 0 = 0 0 0 1 0 0 0 -16 0 = 0 0 0 0 1 0 -16 0 -8 = 0 0 0 0 0 -1 0 32 31 >= 0 0 0 0 0 1 0 -32 0 >= 0 0 0 0 0 -1 32 0 31 >= 0 0 0 0 0 1 -32 0 0 >= 0 ```
Fully compose
affine.apply
ops before adding them to the underlyingFlatLinearConstraints
. This works around a limitation ofFlatLinearConstraints
, which cannot deduce a constant bound if it involves two identical local variables.Details for future improvements of
FlatLinearConstraints
: The constraint set infrastructure fails to compute a constant bound of -8 for the first variable.