[Mlir-commits] [mlir] 9329438 - [mlir][linalg] Remove ConstraintsSet class

Matthias Springer llvmlistbot at llvm.org
Wed Aug 18 19:00:52 PDT 2021


Author: Matthias Springer
Date: 2021-08-19T10:57:35+09:00
New Revision: 93294382449d29be122c39e08ff738b41c331daa

URL: https://github.com/llvm/llvm-project/commit/93294382449d29be122c39e08ff738b41c331daa
DIFF: https://github.com/llvm/llvm-project/commit/93294382449d29be122c39e08ff738b41c331daa.diff

LOG: [mlir][linalg] Remove ConstraintsSet class

The same functionality can be implemented with FlatAffineValueConstraints.

Differential Revision: https://reviews.llvm.org/D108179

Added: 
    

Modified: 
    mlir/lib/Dialect/Linalg/Analysis/CMakeLists.txt
    mlir/lib/Dialect/Linalg/Transforms/Hoisting.cpp
    utils/bazel/llvm-project-overlay/mlir/BUILD.bazel

Removed: 
    mlir/include/mlir/Dialect/Linalg/Analysis/ConstraintsSet.h
    mlir/lib/Dialect/Linalg/Analysis/ConstraintsSet.cpp


################################################################################
diff  --git a/mlir/include/mlir/Dialect/Linalg/Analysis/ConstraintsSet.h b/mlir/include/mlir/Dialect/Linalg/Analysis/ConstraintsSet.h
deleted file mode 100644
index 4cb381b0f2177..0000000000000
--- a/mlir/include/mlir/Dialect/Linalg/Analysis/ConstraintsSet.h
+++ /dev/null
@@ -1,67 +0,0 @@
-//===- ConstraintsSet.h - Ext. for FlatAffineValueConstraints ---*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// Linalg-specific constraints set extensions.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef MLIR_DIALECT_LINALG_ANALYSIS_CONSTRAINTS_SET_H_
-#define MLIR_DIALECT_LINALG_ANALYSIS_CONSTRAINTS_SET_H_
-
-#include "mlir/Analysis/AffineStructures.h"
-#include "mlir/IR/AffineMap.h"
-
-namespace mlir {
-class ValueRange;
-
-/// Linalg-specific constraints set extensions.
-class ConstraintsSet : public FlatAffineValueConstraints {
-public:
-  ConstraintsSet() : FlatAffineValueConstraints() {}
-
-  /// Assuming `val` is defined by `val = affine.min map (operands)`, introduce
-  /// all the constraints `val <= expr_i(operands)`, where expr_i are all the
-  /// results of `map`.
-  // This API avoids taking a dependence on the AffineMinOp definition.
-  LogicalResult composeMin(Value val, AffineMap map, ValueRange operands) {
-    return composeMinOrMaxMapAndOperands(val, map, operands, /*min=*/true);
-  }
-
-  /// Assuming `val` is defined by `val = affine.max map (operands)`, introduce
-  /// all the constraints `val >= expr_i(operands)`, where expr_i are all the
-  /// results of `map`.
-  // This API avoids taking a dependence on the AffineMaxOp definition.
-  LogicalResult composeMax(Value val, AffineMap map, ValueRange operands) {
-    return composeMinOrMaxMapAndOperands(val, map, operands, /*min=*/false);
-  }
-
-  /// Assuming `val` is defined by `val = affine.apply map (operands)`, call
-  /// composeMap.
-  // This API avoids taking a dependence on the AffineMApplyOp definition.
-  LogicalResult composeAffineApply(Value val, AffineMap map,
-                                   ValueRange operands);
-
-  /// Asserts the identifier `id` is in the constraints set and returns it.
-  unsigned lookupPos(Value id) const;
-
-  /// If v is not in the constraint set, insert it as a dim or symbol depending
-  /// on `asDim`.
-  /// Return success if v is of dim id type when `asDim` is true and of symbol
-  /// id type when `asDim` is false.
-  /// Return failure otherwise.
-  LogicalResult ensureIdOfType(Value v, bool asDim);
-
-private:
-  /// Implementation detail for composeMin/Max.
-  LogicalResult composeMinOrMaxMapAndOperands(Value val, AffineMap map,
-                                              ValueRange operands, bool min);
-};
-
-} // namespace mlir
-
-#endif // MLIR_DIALECT_LINALG_ANALYSIS_CONSTRAINTS_SET_H_

diff  --git a/mlir/lib/Dialect/Linalg/Analysis/CMakeLists.txt b/mlir/lib/Dialect/Linalg/Analysis/CMakeLists.txt
index 966d6a7bc956b..bc7a107831716 100644
--- a/mlir/lib/Dialect/Linalg/Analysis/CMakeLists.txt
+++ b/mlir/lib/Dialect/Linalg/Analysis/CMakeLists.txt
@@ -1,5 +1,4 @@
 add_mlir_dialect_library(MLIRLinalgAnalysis
-  ConstraintsSet.cpp
   DependenceAnalysis.cpp
 
   ADDITIONAL_HEADER_DIRS

diff  --git a/mlir/lib/Dialect/Linalg/Analysis/ConstraintsSet.cpp b/mlir/lib/Dialect/Linalg/Analysis/ConstraintsSet.cpp
deleted file mode 100644
index 7e37da5546a72..0000000000000
--- a/mlir/lib/Dialect/Linalg/Analysis/ConstraintsSet.cpp
+++ /dev/null
@@ -1,87 +0,0 @@
-//===- ConstraintsSet.cpp - Extensions for FlatAffineConstraints ----------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// Linalg-specific constraints set extensions.
-//
-//===----------------------------------------------------------------------===//
-
-#include "mlir/Dialect/Linalg/Analysis/ConstraintsSet.h"
-#include "mlir/Dialect/Affine/IR/AffineValueMap.h"
-#include "mlir/IR/AffineMap.h"
-
-using namespace mlir;
-
-unsigned ConstraintsSet::lookupPos(Value id) const {
-  unsigned pos;
-  if (!findId(id, &pos)) {
-    llvm::errs() << "Lookup failed: " << id << "\n";
-    llvm_unreachable("Lookup failed");
-  }
-  return pos;
-}
-
-LogicalResult ConstraintsSet::ensureIdOfType(Value v, bool asDim) {
-  if (!containsId(v)) {
-    if (asDim)
-      addDimId(getNumDimIds(), v);
-    else
-      addSymbolId(getNumSymbolIds(), v);
-    return success();
-  }
-  unsigned pos = lookupPos(v);
-  return success((asDim && pos < getNumDimIds()) ||
-                 (!asDim && getNumDimIds() <= pos &&
-                  pos < getNumDimIds() + getNumSymbolIds()));
-}
-
-LogicalResult ConstraintsSet::composeAffineApply(Value val, AffineMap map,
-                                                 ValueRange operands) {
-  AffineValueMap avm(map, operands, val);
-  return composeMap(&avm);
-}
-
-LogicalResult ConstraintsSet::composeMinOrMaxMapAndOperands(Value val,
-                                                            AffineMap map,
-                                                            ValueRange operands,
-                                                            bool min) {
-  ConstraintsSet localCst;
-  std::vector<SmallVector<int64_t, 8>> flatExprs;
-  if (failed(getFlattenedAffineExprs(map, &flatExprs, &localCst)))
-    return failure();
-  assert(flatExprs.size() == map.getNumResults() &&
-         "incorrect number of flattened expressiosn");
-
-  // Local vars on a per-need basis.
-  if (localCst.getNumLocalIds() != 0)
-    return failure();
-
-  // Add one inequality for each result connecting `val` to the other ids in
-  // `operands`. For instance, uf the expression is:
-  //   `16 * i0 + i1` and
-  //   `min` is true
-  // add:
-  //  -d_val + 16 * i0 + i1 >= 0.
-  for (const auto &flatExpr : flatExprs) {
-    assert(flatExpr.size() >= operands.size() + 1);
-    SmallVector<int64_t, 8> ineq(getNumCols(), 0);
-    for (unsigned i = 0, e = operands.size(); i < e; i++)
-      ineq[lookupPos(operands[i])] = min ? flatExpr[i] : -flatExpr[i];
-
-    // Set the coefficient for `d_val`.
-    ineq[lookupPos(val)] = min ? -1 : 1;
-
-    // Set the constant term (upper bound in flatExpr is exclusive).
-    ineq[getNumCols() - 1] = min ? flatExpr[flatExpr.size() - 1] - 1
-                                 : -flatExpr[flatExpr.size() - 1];
-
-    // Add the inequality connecting the result of the map to the rest.
-    addInequality(ineq);
-  }
-
-  return success();
-}

diff  --git a/mlir/lib/Dialect/Linalg/Transforms/Hoisting.cpp b/mlir/lib/Dialect/Linalg/Transforms/Hoisting.cpp
index 24a202f27f491..3a41a68cb3ac2 100644
--- a/mlir/lib/Dialect/Linalg/Transforms/Hoisting.cpp
+++ b/mlir/lib/Dialect/Linalg/Transforms/Hoisting.cpp
@@ -14,8 +14,8 @@
 #include "mlir/Dialect/Linalg/Transforms/Hoisting.h"
 #include "mlir/Analysis/AffineStructures.h"
 #include "mlir/Analysis/SliceAnalysis.h"
+#include "mlir/Dialect/Affine/IR/AffineValueMap.h"
 #include "mlir/Dialect/Affine/Utils.h"
-#include "mlir/Dialect/Linalg/Analysis/ConstraintsSet.h"
 #include "mlir/Dialect/Linalg/IR/LinalgOps.h"
 #include "mlir/Dialect/Linalg/Transforms/Transforms.h"
 #include "mlir/Dialect/SCF/SCF.h"
@@ -555,8 +555,9 @@ static Value buildLoopIterationCount(OpBuilder &b, scf::ForOp outer,
 /// Given a set of loops, assumed to be scf::ForOp, create a constraint set
 /// containing the inequalities `iv - lb >= 0` and `-iv + ub - 1 >= 0` for each
 /// loop.
-static ConstraintsSet initLoopIvsAndBounds(ArrayRef<Operation *> loops) {
-  ConstraintsSet constraints;
+static FlatAffineValueConstraints
+initLoopIvsAndBounds(ArrayRef<Operation *> loops) {
+  FlatAffineValueConstraints constraints;
   for (Operation *op : loops)
     constraints.addDimId(constraints.getNumDimIds(),
                          cast<scf::ForOp>(op).getInductionVar());
@@ -598,7 +599,7 @@ static ConstraintsSet initLoopIvsAndBounds(ArrayRef<Operation *> loops) {
 /// If any other operation is met, return failure.
 // TODO: extend on a per-need basis.
 static LogicalResult
-foldUpperBoundsIntoConstraintsSet(ConstraintsSet &constraints,
+foldUpperBoundsIntoConstraintsSet(FlatAffineValueConstraints &constraints,
                                   scf::ForOp outerLimit,
                                   ArrayRef<Operation *> loops) {
   SetVector<Value> toProjectOut;
@@ -622,7 +623,13 @@ foldUpperBoundsIntoConstraintsSet(ConstraintsSet &constraints,
         continue;
       // Ensure there is a
       auto ensureIdFailed = [&](Value v) {
-        return failed(constraints.ensureIdOfType(v, /*asDim=*/true));
+        if (constraints.containsId(v)) {
+          unsigned pos;
+          constraints.findId(v, &pos);
+          return pos >= constraints.getNumDimIds();
+        }
+        constraints.addDimId(constraints.getNumDimIds(), v);
+        return false;
       };
 
       // Ensure all ids exist and add results for later projection.
@@ -636,16 +643,22 @@ foldUpperBoundsIntoConstraintsSet(ConstraintsSet &constraints,
 
       // Compose supported ops.
       if (auto affineApplyOp = dyn_cast<AffineApplyOp>(op)) {
-        if (failed(constraints.composeAffineApply(affineApplyOp.getResult(),
-                                                  affineApplyOp.getAffineMap(),
-                                                  affineApplyOp.getOperands())))
+        AffineValueMap avm(affineApplyOp.getAffineMap(),
+                           affineApplyOp.getOperands(),
+                           affineApplyOp.getResult());
+        if (failed(constraints.composeMap(&avm)))
           return failure();
         continue;
       }
       auto affineMinOp = cast<AffineMinOp>(op);
-      if (failed(constraints.composeMin(affineMinOp.getResult(),
-                                        affineMinOp.getAffineMap(),
-                                        affineMinOp.operands())))
+      unsigned pos;
+      bool foundMinOp = constraints.findId(affineMinOp.getResult(), &pos);
+      (void)foundMinOp;
+      assert(foundMinOp);
+      AffineMap alignedMap = constraints.computeAlignedMap(
+          affineMinOp.getAffineMap(), affineMinOp.getOperands());
+      if (failed(
+              constraints.addBound(FlatAffineConstraints::UB, pos, alignedMap)))
         return failure();
     }
   }
@@ -654,25 +667,6 @@ foldUpperBoundsIntoConstraintsSet(ConstraintsSet &constraints,
   return success();
 }
 
-/// Compute dynamic tensor sizes, independent of any value defined inside
-/// `outer` and such that every n-D iteration of the packingLoops has its own
-/// space (so that each packed buffer has a storage location). This is achieved
-/// by computing the extent for each of the packing loops.
-static LogicalResult computeBounds(scf::ForOp outer,
-                                   ArrayRef<Operation *> packingLoops,
-                                   SmallVector<AffineMap> &lbs,
-                                   SmallVector<AffineMap> &ubs) {
-  // Packing loop IVs are introduced as the first positions.
-  ConstraintsSet constraints = initLoopIvsAndBounds(packingLoops);
-  if (failed(
-          foldUpperBoundsIntoConstraintsSet(constraints, outer, packingLoops)))
-    return failure();
-  // Compute the bounds of the first positions, assuming the others are fixed.
-  constraints.getSliceBounds(/*pos=*/0, /*num=*/packingLoops.size(),
-                             outer->getContext(), &lbs, &ubs);
-  return success();
-}
-
 /// Ensure prerequisites that guarantee pad op hoisting can occur.
 /// Return failure in the cases when we cannot perform hoisting; i.e. if either:
 ///   1. There exists a use of `padTensorOp` that is not a linalg input operand.
@@ -758,15 +752,17 @@ hoistPaddingOnTensorsPrerequisites(linalg::PadTensorOp padTensorOp, int nLevels,
 
   scf::ForOp outer = cast<scf::ForOp>(outermostEnclosingForOp);
 
-  ConstraintsSet constraints = initLoopIvsAndBounds(packingLoops.getArrayRef());
+  FlatAffineValueConstraints constraints =
+      initLoopIvsAndBounds(packingLoops.getArrayRef());
   if (failed(foldUpperBoundsIntoConstraintsSet(constraints, outer,
                                                packingLoops.getArrayRef())))
     return failure();
 
   unsigned numLoops = packingLoops.size();
   SmallVector<AffineMap> lbs(numLoops), ubs(numLoops);
-  if (failed(computeBounds(outer, packingLoops.getArrayRef(), lbs, ubs)))
-    return failure();
+  // Compute the bounds of the first positions, assuming the others are fixed.
+  constraints.getSliceBounds(/*pos=*/0, /*num=*/packingLoops.size(),
+                             outer->getContext(), &lbs, &ubs);
 
   SmallVector<Value> allValues;
   constraints.getAllValues(&allValues);

diff  --git a/utils/bazel/llvm-project-overlay/mlir/BUILD.bazel b/utils/bazel/llvm-project-overlay/mlir/BUILD.bazel
index 433754d94730a..f1947f6b8b585 100644
--- a/utils/bazel/llvm-project-overlay/mlir/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/mlir/BUILD.bazel
@@ -6085,12 +6085,10 @@ cc_library(
         "lib/Dialect/Linalg/Transforms/*.cpp",
         "lib/Dialect/Linalg/Transforms/*.h",
     ]) + [
-        "lib/Dialect/Linalg/Analysis/ConstraintsSet.cpp",
         "lib/Dialect/Linalg/Analysis/DependenceAnalysis.cpp",
         "lib/Dialect/Linalg/Utils/Utils.cpp",
     ],
     hdrs = [
-        "include/mlir/Dialect/Linalg/Analysis/ConstraintsSet.h",
         "include/mlir/Dialect/Linalg/Analysis/DependenceAnalysis.h",
         "include/mlir/Dialect/Linalg/Passes.h",
         "include/mlir/Dialect/Linalg/Transforms/CodegenStrategy.h",


        


More information about the Mlir-commits mailing list