13 #ifndef MLIR_ANALYSIS_AFFINE_STRUCTURES_H 14 #define MLIR_ANALYSIS_AFFINE_STRUCTURES_H 24 class AffineCondition;
30 class HyperRectangularSet;
137 inline bool isMultipleOf(
unsigned idx, int64_t factor)
const;
140 bool isFunctionOf(
unsigned idx,
Value value)
const;
144 bool isConstant(
unsigned idx)
const;
147 bool isIdentity()
const;
156 Value getOperand(
unsigned i)
const;
191 bool isEmpty()
const;
193 bool getNumDims()
const {
return set.getNumDims(); }
236 unsigned numReservedEqualities,
237 unsigned numReservedCols,
unsigned numDims = 0,
238 unsigned numSymbols = 0,
unsigned numLocals = 0,
240 : numReservedCols(numReservedCols), numDims(numDims),
241 numSymbols(numSymbols) {
242 assert(numReservedCols >= numDims + numSymbols + 1);
243 assert(idArgs.empty() || idArgs.size() == numDims + numSymbols + numLocals);
244 equalities.reserve(numReservedCols * numReservedEqualities);
245 inequalities.reserve(numReservedCols * numReservedInequalities);
246 numIds = numDims + numSymbols + numLocals;
247 ids.reserve(numReservedCols);
249 ids.resize(numIds,
None);
251 ids.append(idArgs.begin(), idArgs.end());
257 unsigned numLocals = 0,
259 : numReservedCols(numDims + numSymbols + numLocals + 1), numDims(numDims),
260 numSymbols(numSymbols) {
261 assert(numReservedCols >= numDims + numSymbols + 1);
262 assert(idArgs.empty() || idArgs.size() == numDims + numSymbols + numLocals);
263 numIds = numDims + numSymbols + numLocals;
266 ids.resize(numIds,
None);
268 ids.append(idArgs.begin(), idArgs.end());
296 void reset(
unsigned numReservedInequalities,
unsigned numReservedEqualities,
297 unsigned numReservedCols,
unsigned numDims,
unsigned numSymbols,
300 void reset(
unsigned numDims = 0,
unsigned numSymbols = 0,
312 bool isEmpty()
const;
318 bool isEmptyByGCDTest()
const;
321 std::unique_ptr<FlatAffineConstraints> clone()
const;
324 inline int64_t
atEq(
unsigned i,
unsigned j)
const {
325 return equalities[i * numReservedCols + j];
327 inline int64_t &
atEq(
unsigned i,
unsigned j) {
328 return equalities[i * numReservedCols + j];
331 inline int64_t
atIneq(
unsigned i,
unsigned j)
const {
332 return inequalities[i * numReservedCols + j];
335 inline int64_t &
atIneq(
unsigned i,
unsigned j) {
336 return inequalities[i * numReservedCols + j];
343 assert(equalities.size() % numReservedCols == 0 &&
344 "inconsistent equality buffer size");
345 return equalities.size() / numReservedCols;
349 assert(inequalities.size() % numReservedCols == 0 &&
350 "inconsistent inequality buffer size");
351 return inequalities.size() / numReservedCols;
355 return equalities.capacity() / numReservedCols;
359 return inequalities.capacity() / numReservedCols;
399 void getSliceBounds(
unsigned offset,
unsigned num,
MLIRContext *context,
420 void addConstantLowerBound(
unsigned pos, int64_t lb);
422 void addConstantUpperBound(
unsigned pos, int64_t ub);
437 void setIdToConstant(
unsigned pos, int64_t val);
441 void setIdToConstant(
Value id, int64_t val);
446 bool findId(
Value id,
unsigned *pos)
const;
450 bool containsId(
Value id)
const;
456 void addDimId(
unsigned pos,
Value id =
nullptr);
457 void addSymbolId(
unsigned pos,
Value id =
nullptr);
458 void addLocalId(
unsigned pos);
459 void addId(
IdKind kind,
unsigned pos,
Value id =
nullptr);
467 void addInductionVarOrTerminalSymbol(
Value id);
491 void projectOut(
unsigned pos,
unsigned num);
495 void projectOut(
Value id);
497 void removeId(
IdKind idKind,
unsigned pos);
498 void removeId(
unsigned pos);
500 void removeDim(
unsigned pos);
502 void removeEquality(
unsigned pos);
503 void removeInequality(
unsigned pos);
508 void setDimSymbolSeparation(
unsigned newSymbolCount);
511 void convertLoopIVSymbolsToDims();
514 void setAndEliminate(
unsigned pos, int64_t constVal);
524 void constantFoldIdRange(
unsigned pos,
unsigned num);
561 return getNumInequalities() + getNumEqualities();
568 return numIds - numDims - numSymbols;
572 return {ids.data(), ids.size()};
575 return {ids.data(), ids.size()};
585 assert(ids[pos].hasValue() &&
"identifier's Value not set");
586 return ids[pos].getValue();
593 assert((start < numIds || start == end) &&
"invalid start position");
594 assert(end <= numIds &&
"invalid end position");
596 values->reserve(end - start);
597 for (
unsigned i = start; i < end; i++) {
598 values->push_back(getIdValue(i));
602 getIdValues(0, numIds, values);
607 assert(pos < numIds &&
"invalid id position");
612 assert((start < numIds || end == start) &&
"invalid start position");
613 assert(end <= numIds &&
"invalid end position");
614 assert(values.size() == end - start);
615 for (
unsigned i = start; i < end; ++i)
616 ids[i] = values[i - start];
635 getConstantBoundOnDimSize(
unsigned pos,
637 int64_t *lbFloorDivisor =
nullptr,
655 std::pair<AffineMap, AffineMap>
656 getLowerAndUpperBound(
unsigned pos,
unsigned offset,
unsigned num,
662 bool isHyperRectangular(
unsigned pos,
unsigned num)
const;
669 void removeTrivialRedundancy();
673 void removeRedundantInequalities();
676 void clearConstraints();
678 void print(raw_ostream &os)
const;
685 bool hasConsistentState()
const;
691 bool hasInvalidConstraint()
const;
695 template <
bool isLower>
701 inline LogicalResult gaussianEliminateId(
unsigned position) {
702 return success(gaussianEliminateIds(position, position + 1) == 1);
708 unsigned gaussianEliminateIds(
unsigned posStart,
unsigned posLimit);
717 void FourierMotzkinEliminate(
unsigned pos,
bool darkShadow =
false,
718 bool *isResultIntegerExact =
nullptr);
726 void GCDTightenInequalities();
729 void normalizeConstraintsByGCD();
734 void removeIdRange(
unsigned idStart,
unsigned idLimit);
744 unsigned numReservedCols;
772 constexpr
static unsigned kExplosionFactor = 32;
780 unsigned numSymbols);
815 #endif // MLIR_ANALYSIS_AFFINE_STRUCTURES_H Definition: InferTypeOpInterface.cpp:20
unsigned getNumInequalities() const
Definition: AffineStructures.h:348
LogicalResult getFlattenedAffineExprs(AffineMap map, std::vector< SmallVector< int64_t, 8 >> *flattenedExprs, FlatAffineConstraints *cst=nullptr)
Definition: AffineStructures.cpp:115
Optional< Value > getId(unsigned pos) const
Returns the optional Value corresponding to the pos^th identifier.
Definition: AffineStructures.h:579
unsigned getNumEqualities() const
Definition: AffineStructures.h:342
void setIdValue(unsigned pos, Value val)
Sets Value associated with the pos^th identifier.
Definition: AffineStructures.h:606
unsigned getNumSymbols() const
Definition: AffineMap.cpp:154
unsigned getNumDims() const
Definition: AffineMap.cpp:150
int64_t & atEq(unsigned i, unsigned j)
Definition: AffineStructures.h:327
Optional< Value > & getId(unsigned pos)
Definition: AffineStructures.h:580
unsigned getNumConstraints() const
Definition: AffineStructures.h:84
Definition: Attributes.h:129
int64_t & atIneq(unsigned i, unsigned j)
Definition: AffineStructures.h:335
unsigned getNumConstraints() const
Definition: AffineStructures.h:560
unsigned getNumResults() const
Definition: AffineStructures.h:42
AffineExpr getResult(unsigned i)
Definition: AffineStructures.h:150
void setNumDims(unsigned d)
Definition: AffineStructures.h:44
void simplify()
Simplify the (result) expressions in this map using analysis (used by.
Definition: AffineStructures.cpp:172
void clear()
Definition: AffineStructures.h:86
ArrayRef< int64_t > getInequality(unsigned idx) const
Definition: AffineStructures.h:366
ArrayRef< int64_t > getEquality(unsigned idx) const
Definition: AffineStructures.h:362
FlatAffineConstraints(unsigned numDims=0, unsigned numSymbols=0, unsigned numLocals=0, ArrayRef< Optional< Value >> idArgs={})
Definition: AffineStructures.h:256
unsigned getNumDimAndSymbolIds() const
Definition: AffineStructures.h:566
AffineExpr simplifyAffineExpr(AffineExpr expr, unsigned numDims, unsigned numSymbols)
Simplify the affine expression by flattening it and reconstructing it.
Definition: AffineExpr.cpp:839
AffineExpr getResult(unsigned idx) const
Definition: AffineMap.cpp:171
IdKind
Definition: AffineStructures.h:231
LogicalResult success(bool isSuccess=true)
Definition: LogicalResult.h:25
Definition: AffineStructures.h:229
unsigned getNumDimIds() const
Definition: AffineStructures.h:564
Definition: LogicalResult.h:18
Definition: AffineOps.h:62
int64_t atIneq(unsigned i, unsigned j) const
Definition: AffineStructures.h:331
LogicalResult getFlattenedAffineExpr(AffineExpr expr, unsigned numDims, unsigned numSymbols, SmallVectorImpl< int64_t > *flattenedExpr, FlatAffineConstraints *cst=nullptr)
Definition: AffineStructures.cpp:102
A mutable affine map. Its affine expressions are however unique.
Definition: AffineStructures.h:34
unsigned getNumOperands() const
Definition: AffineStructures.h:151
auto map(Fn fun, IterType begin, IterType end) -> SmallVector< typename std::result_of< Fn(decltype(*begin))>::type, 8 >
Map with iterators.
Definition: Functional.h:28
void getIdValues(unsigned start, unsigned end, SmallVectorImpl< Value > *values) const
Definition: AffineStructures.h:591
unsigned getNumSymbols() const
Definition: AffineStructures.h:45
Definition: AffineExpr.h:66
unsigned getNumResults() const
Definition: AffineMap.cpp:158
Definition: AffineMap.h:37
~FlatAffineConstraints()
Definition: AffineStructures.h:293
void setIdValues(unsigned start, unsigned end, ArrayRef< Value > values)
Sets Values associated with identifiers in the range [start, end).
Definition: AffineStructures.h:611
unsigned getNumCols() const
Returns the number of columns in the constraint system.
Definition: AffineStructures.h:340
Definition: AffineOps.h:571
unsigned getNumSymbolIds() const
Definition: AffineStructures.h:565
void setResult(unsigned i, AffineExpr e)
Definition: AffineStructures.h:149
int64_t atEq(unsigned i, unsigned j) const
Returns the value at the specified equality row and column.
Definition: AffineStructures.h:324
unsigned getNumSymbols() const
Definition: AffineStructures.h:83
A mutable integer set. Its affine expressions are however unique.
Definition: AffineStructures.h:74
unsigned getNumDims() const
Definition: AffineStructures.h:152
MLIRContext * getContext() const
Definition: AffineStructures.h:47
unsigned getNumReservedEqualities() const
Definition: AffineStructures.h:354
An IntegerValueSet is an integer set plus its operands.
Definition: AffineStructures.h:174
unsigned getNumIds() const
Definition: AffineStructures.h:563
AffineExpr getResult(unsigned idx) const
Definition: AffineStructures.h:40
ArrayRef< Optional< Value > > getIds() const
Definition: AffineStructures.h:571
unsigned getNumLocalIds() const
Definition: AffineStructures.h:567
void setResult(unsigned idx, AffineExpr result)
Definition: AffineStructures.h:41
void setNumSymbols(unsigned d)
Definition: AffineStructures.h:46
unsigned getNumDims() const
Definition: AffineStructures.h:43
ArrayRef< AffineExpr > getResults() const
Definition: AffineStructures.h:39
void projectOut(unsigned pos)
Definition: AffineStructures.h:492
bool isMultipleOf(unsigned idx, int64_t factor) const
Returns true if the idx'th result expression is a multiple of factor.
Definition: AffineStructures.cpp:161
Definition: MLIRContext.h:34
void print(OpAsmPrinter &p, AffineIfOp op)
Definition: AffineOps.cpp:1671
MutableArrayRef< Optional< Value > > getIds()
Definition: AffineStructures.h:574
FlatAffineConstraints(unsigned numReservedInequalities, unsigned numReservedEqualities, unsigned numReservedCols, unsigned numDims=0, unsigned numSymbols=0, unsigned numLocals=0, ArrayRef< Optional< Value >> idArgs={})
Definition: AffineStructures.h:235
AffineMap getAffineMap() const
Definition: AffineStructures.cpp:180
unsigned getNumSymbols() const
Definition: AffineStructures.h:153
Definition: StandardTypes.h:63
unsigned getNumReservedInequalities() const
Definition: AffineStructures.h:358
Definition: AffineStructures.h:112
AffineValueMap()
Definition: AffineStructures.h:116
AffineExpr toAffineExpr(ArrayRef< int64_t > eq, unsigned numDims, unsigned numSymbols, ArrayRef< AffineExpr > localExprs, MLIRContext *context)
Definition: AffineExpr.cpp:594
void getAllIdValues(SmallVectorImpl< Value > *values) const
Definition: AffineStructures.h:601
MutableAffineMap()
Definition: AffineStructures.h:36
unsigned getNumDims() const
Definition: AffineStructures.h:82
Definition: Attributes.h:135
void reset(AffineMap map)
Resets this MutableAffineMap with 'map'.
Definition: AffineStructures.cpp:151
Value getIdValue(unsigned pos) const
Definition: AffineStructures.h:584
Definition: AffineStructures.h:231
unsigned getNumResults() const
Definition: AffineStructures.h:154
Definition: IntegerSet.h:42