diff --git a/mlir/include/mlir/Analysis/AffineStructures.h b/mlir/include/mlir/Analysis/AffineStructures.h index ea20edd1036f..3f632dcc96a8 100644 --- a/mlir/include/mlir/Analysis/AffineStructures.h +++ b/mlir/include/mlir/Analysis/AffineStructures.h @@ -335,15 +335,7 @@ public: /// match. void mergeLocalIds(FlatAffineConstraints &other); - void print(raw_ostream &os) const; - void dump() const; - protected: - /// Returns false if the fields corresponding to various identifier counts, or - /// equality/inequality buffer sizes aren't consistent; true otherwise. This - /// is meant to be used within an assert internally. - virtual bool hasConsistentState() const; - /// Checks all rows of equality/inequality constraints for trivial /// contradictions (for example: 1 == 0, 0 >= 1), which may have surfaced /// after elimination. Returns true if an invalid constraint is found; @@ -419,6 +411,11 @@ protected: /// equalities. bool isColZero(unsigned pos) const; + /// Prints the number of constraints, dimensions, symbols and locals in the + /// FlatAffineConstraints. Also, prints for each identifier whether there is + /// an SSA Value attached to it. + void printSpace(raw_ostream &os) const override; + /// A parameter that controls detection of an unrealistic number of /// constraints. If the number of constraints is this many times the number of /// variables, we consider such a system out of line with the intended use diff --git a/mlir/include/mlir/Analysis/Presburger/IntegerPolyhedron.h b/mlir/include/mlir/Analysis/Presburger/IntegerPolyhedron.h index c7eae0cd29ee..b46874fb8072 100644 --- a/mlir/include/mlir/Analysis/Presburger/IntegerPolyhedron.h +++ b/mlir/include/mlir/Analysis/Presburger/IntegerPolyhedron.h @@ -195,7 +195,19 @@ public: SmallVectorImpl *eqIndices = nullptr, unsigned offset = 0, unsigned num = 0) const; + void print(raw_ostream &os) const; + void dump() const; + protected: + /// Returns false if the fields corresponding to various identifier counts, or + /// equality/inequality buffer sizes aren't consistent; true otherwise. This + /// is meant to be used within an assert internally. + virtual bool hasConsistentState() const; + + /// Prints the number of constraints, dimensions, symbols and locals in the + /// IntegerPolyhedron. + virtual void printSpace(raw_ostream &os) const; + /// Return the index at which the specified kind of id starts. unsigned getIdKindOffset(IdKind kind) const; diff --git a/mlir/lib/Analysis/AffineStructures.cpp b/mlir/lib/Analysis/AffineStructures.cpp index 520262d6fddc..205abe280d9b 100644 --- a/mlir/lib/Analysis/AffineStructures.cpp +++ b/mlir/lib/Analysis/AffineStructures.cpp @@ -747,19 +747,6 @@ void FlatAffineConstraints::normalizeConstraintsByGCD() { } } -bool FlatAffineConstraints::hasConsistentState() const { - if (!inequalities.hasConsistentState()) - return false; - if (!equalities.hasConsistentState()) - return false; - - // Catches errors where numDims, numSymbols, numIds aren't consistent. - if (numDims > numIds || numSymbols > numIds || numDims + numSymbols > numIds) - return false; - - return true; -} - bool FlatAffineValueConstraints::hasConsistentState() const { return FlatAffineConstraints::hasConsistentState() && values.size() == getNumIds(); @@ -2587,11 +2574,8 @@ bool FlatAffineConstraints::isHyperRectangular(unsigned pos, return true; } -void FlatAffineConstraints::print(raw_ostream &os) const { - assert(hasConsistentState()); - os << "\nConstraints (" << getNumDimIds() << " dims, " << getNumSymbolIds() - << " symbols, " << getNumLocalIds() << " locals), (" << getNumConstraints() - << " constraints)\n"; +void FlatAffineConstraints::printSpace(raw_ostream &os) const { + IntegerPolyhedron::printSpace(os); os << "("; for (unsigned i = 0, e = getNumIds(); i < e; i++) { if (auto *valueCstr = dyn_cast(this)) { @@ -2604,23 +2588,8 @@ void FlatAffineConstraints::print(raw_ostream &os) const { } } os << " const)\n"; - for (unsigned i = 0, e = getNumEqualities(); i < e; ++i) { - for (unsigned j = 0, f = getNumCols(); j < f; ++j) { - os << atEq(i, j) << " "; - } - os << "= 0\n"; - } - for (unsigned i = 0, e = getNumInequalities(); i < e; ++i) { - for (unsigned j = 0, f = getNumCols(); j < f; ++j) { - os << atIneq(i, j) << " "; - } - os << ">= 0\n"; - } - os << '\n'; } -void FlatAffineConstraints::dump() const { print(llvm::errs()); } - /// Removes duplicate constraints, trivially true constraints, and constraints /// that can be detected as redundant as a result of differing only in their /// constant term part. A constraint of the form >= 0 is diff --git a/mlir/lib/Analysis/Presburger/IntegerPolyhedron.cpp b/mlir/lib/Analysis/Presburger/IntegerPolyhedron.cpp index 958f52e2625e..4eed7ca91dd4 100644 --- a/mlir/lib/Analysis/Presburger/IntegerPolyhedron.cpp +++ b/mlir/lib/Analysis/Presburger/IntegerPolyhedron.cpp @@ -271,3 +271,42 @@ void IntegerPolyhedron::getLowerAndUpperBoundIndices( eqIndices->push_back(r); } } + +bool IntegerPolyhedron::hasConsistentState() const { + if (!inequalities.hasConsistentState()) + return false; + if (!equalities.hasConsistentState()) + return false; + + // Catches errors where numDims, numSymbols, numIds aren't consistent. + if (numDims > numIds || numSymbols > numIds || numDims + numSymbols > numIds) + return false; + + return true; +} + +void IntegerPolyhedron::printSpace(raw_ostream &os) const { + os << "\nConstraints (" << getNumDimIds() << " dims, " << getNumSymbolIds() + << " symbols, " << getNumLocalIds() << " locals), (" << getNumConstraints() + << " constraints)\n"; +} + +void IntegerPolyhedron::print(raw_ostream &os) const { + assert(hasConsistentState()); + printSpace(os); + for (unsigned i = 0, e = getNumEqualities(); i < e; ++i) { + for (unsigned j = 0, f = getNumCols(); j < f; ++j) { + os << atEq(i, j) << " "; + } + os << "= 0\n"; + } + for (unsigned i = 0, e = getNumInequalities(); i < e; ++i) { + for (unsigned j = 0, f = getNumCols(); j < f; ++j) { + os << atIneq(i, j) << " "; + } + os << ">= 0\n"; + } + os << '\n'; +} + +void IntegerPolyhedron::dump() const { print(llvm::errs()); }