My Project
AffineStructures.h
Go to the documentation of this file.
1 //===- AffineStructures.h - MLIR Affine Structures Class --------*- C++ -*-===//
2 //
3 // Part of the MLIR Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // Structures for affine/polyhedral analysis of ML functions.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef MLIR_ANALYSIS_AFFINE_STRUCTURES_H
14 #define MLIR_ANALYSIS_AFFINE_STRUCTURES_H
15 
16 #include "mlir/IR/AffineExpr.h"
17 #include "mlir/IR/OpDefinition.h"
19 
20 namespace mlir {
21 
22 class AffineApplyOp;
23 class AffineBound;
24 class AffineCondition;
25 class AffineMap;
26 class AffineForOp;
27 class IntegerSet;
28 class MLIRContext;
29 class Value;
30 class HyperRectangularSet;
31 class MemRefType;
32 
35 public:
38 
39  ArrayRef<AffineExpr> getResults() const { return results; }
40  AffineExpr getResult(unsigned idx) const { return results[idx]; }
41  void setResult(unsigned idx, AffineExpr result) { results[idx] = result; }
42  unsigned getNumResults() const { return results.size(); }
43  unsigned getNumDims() const { return numDims; }
44  void setNumDims(unsigned d) { numDims = d; }
45  unsigned getNumSymbols() const { return numSymbols; }
46  void setNumSymbols(unsigned d) { numSymbols = d; }
47  MLIRContext *getContext() const { return context; }
48 
50  bool isMultipleOf(unsigned idx, int64_t factor) const;
51 
53  void reset(AffineMap map);
54 
56  //-simplify-affine-expr pass).
57  void simplify();
61  AffineMap getAffineMap() const;
62 
63 private:
64  // Same meaning as AffineMap's fields.
66  unsigned numDims;
67  unsigned numSymbols;
70  MLIRContext *context;
71 };
72 
75 public:
77 
79  MutableIntegerSet(unsigned numDims, unsigned numSymbols,
80  MLIRContext *context);
81 
82  unsigned getNumDims() const { return numDims; }
83  unsigned getNumSymbols() const { return numSymbols; }
84  unsigned getNumConstraints() const { return constraints.size(); }
85 
86  void clear() {
87  constraints.clear();
88  eqFlags.clear();
89  }
90 
91 private:
92  unsigned numDims;
93  unsigned numSymbols;
94 
95  SmallVector<AffineExpr, 8> constraints;
96  SmallVector<bool, 8> eqFlags;
97 };
98 
104 // An affine value map can readily be constructed from an AffineApplyOp, or an
105 // AffineBound of a AffineForOp. It can be further transformed, substituted
106 // into, or simplified. Unlike AffineMap's, AffineValueMap's are created and
107 // destroyed during analysis. Only the AffineMap expressions that are pointed by
108 // them are unique'd. An affine value map, and the operations on it, maintain
109 // the invariant that operands are always positionally aligned with the
110 // AffineDimExpr and AffineSymbolExpr in the underlying AffineMap.
111 // TODO(bondhugula): Some of these classes could go into separate files.
113 public:
114  // Creates an empty AffineValueMap (users should call 'reset' to reset map
115  // and operands).
118  ArrayRef<Value> results = llvm::None);
119 
120  explicit AffineValueMap(AffineApplyOp applyOp);
121  explicit AffineValueMap(AffineBound bound);
122 
123  ~AffineValueMap();
124 
125  // Resets this AffineValueMap with 'map', 'operands', and 'results'.
126  void reset(AffineMap map, ArrayRef<Value> operands,
127  ArrayRef<Value> results = llvm::None);
128 
132  static void difference(const AffineValueMap &a, const AffineValueMap &b,
133  AffineValueMap *res);
134 
137  inline bool isMultipleOf(unsigned idx, int64_t factor) const;
138 
140  bool isFunctionOf(unsigned idx, Value value) const;
141 
144  bool isConstant(unsigned idx) const;
145 
147  bool isIdentity() const;
148 
149  void setResult(unsigned i, AffineExpr e) { map.setResult(i, e); }
150  AffineExpr getResult(unsigned i) { return map.getResult(i); }
151  inline unsigned getNumOperands() const { return operands.size(); }
152  inline unsigned getNumDims() const { return map.getNumDims(); }
153  inline unsigned getNumSymbols() const { return map.getNumSymbols(); }
154  inline unsigned getNumResults() const { return map.getNumResults(); }
155 
156  Value getOperand(unsigned i) const;
157  ArrayRef<Value> getOperands() const;
158  AffineMap getAffineMap() const;
159 
160 private:
161  // A mutable affine map.
163 
164  // TODO: make these trailing objects?
166  SmallVector<Value, 4> operands;
168  SmallVector<Value, 4> results;
169 };
170 
172 // Both, the integer set being pointed to and the operands can change during
173 // analysis, simplification, and transformation.
176  // This will lead to a single equality in 'set'.
177  explicit IntegerValueSet(const AffineValueMap &avm);
178 
190  // constructed ones), this method returns false conservatively.
191  bool isEmpty() const;
192 
193  bool getNumDims() const { return set.getNumDims(); }
194  bool getNumSymbols() const { return set.getNumSymbols(); }
195 
196 private:
197  // The set pointed to may itself change unlike in IR structures like
198  // 'AffineCondition'.
199  MutableIntegerSet set;
201  SmallVector<Value, 4> operands;
202 };
203 
230 public:
231  enum IdKind { Dimension, Symbol, Local };
232 
235  FlatAffineConstraints(unsigned numReservedInequalities,
236  unsigned numReservedEqualities,
237  unsigned numReservedCols, unsigned numDims = 0,
238  unsigned numSymbols = 0, unsigned numLocals = 0,
239  ArrayRef<Optional<Value>> idArgs = {})
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);
248  if (idArgs.empty())
249  ids.resize(numIds, None);
250  else
251  ids.append(idArgs.begin(), idArgs.end());
252  }
253 
256  FlatAffineConstraints(unsigned numDims = 0, unsigned numSymbols = 0,
257  unsigned numLocals = 0,
258  ArrayRef<Optional<Value>> idArgs = {})
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;
264  ids.reserve(numIds);
265  if (idArgs.empty())
266  ids.resize(numIds, None);
267  else
268  ids.append(idArgs.begin(), idArgs.end());
269  }
270 
271  explicit FlatAffineConstraints(const HyperRectangularSet &set);
272 
275  // TODO(bondhugula)
276  explicit FlatAffineConstraints(const AffineValueMap &avm);
278 
280  explicit FlatAffineConstraints(IntegerSet set);
281 
283  // TODO(bondhugula)
284  explicit FlatAffineConstraints(const IntegerValueSet &set);
285 
287 
289  IntegerSet set);
290 
292 
294 
295  // Clears any existing data and reserves memory for the specified constraints.
296  void reset(unsigned numReservedInequalities, unsigned numReservedEqualities,
297  unsigned numReservedCols, unsigned numDims, unsigned numSymbols,
298  unsigned numLocals = 0, ArrayRef<Value> idArgs = {});
299 
300  void reset(unsigned numDims = 0, unsigned numSymbols = 0,
301  unsigned numLocals = 0, ArrayRef<Value> idArgs = {});
302 
305  void append(const FlatAffineConstraints &other);
306 
307  // Checks for emptiness by performing variable elimination on all identifiers,
308  // running the GCD test on each equality constraint, and checking for invalid
309  // constraints.
310  // Returns true if the GCD test fails for any equality, or if any invalid
311  // constraints are discovered on any row. Returns false otherwise.
312  bool isEmpty() const;
313 
314  // Runs the GCD test on all equality constraints. Returns 'true' if this test
315  // fails on any equality. Returns 'false' otherwise.
316  // This test can be used to disprove the existence of a solution. If it
317  // returns true, no integer solution to the equality constraints can exist.
318  bool isEmptyByGCDTest() const;
319 
320  // Clones this object.
321  std::unique_ptr<FlatAffineConstraints> clone() const;
322 
324  inline int64_t atEq(unsigned i, unsigned j) const {
325  return equalities[i * numReservedCols + j];
326  }
327  inline int64_t &atEq(unsigned i, unsigned j) {
328  return equalities[i * numReservedCols + j];
329  }
330 
331  inline int64_t atIneq(unsigned i, unsigned j) const {
332  return inequalities[i * numReservedCols + j];
333  }
334 
335  inline int64_t &atIneq(unsigned i, unsigned j) {
336  return inequalities[i * numReservedCols + j];
337  }
338 
340  inline unsigned getNumCols() const { return numIds + 1; }
341 
342  inline unsigned getNumEqualities() const {
343  assert(equalities.size() % numReservedCols == 0 &&
344  "inconsistent equality buffer size");
345  return equalities.size() / numReservedCols;
346  }
347 
348  inline unsigned getNumInequalities() const {
349  assert(inequalities.size() % numReservedCols == 0 &&
350  "inconsistent inequality buffer size");
351  return inequalities.size() / numReservedCols;
352  }
353 
354  inline unsigned getNumReservedEqualities() const {
355  return equalities.capacity() / numReservedCols;
356  }
357 
358  inline unsigned getNumReservedInequalities() const {
359  return inequalities.capacity() / numReservedCols;
360  }
361 
362  inline ArrayRef<int64_t> getEquality(unsigned idx) const {
363  return ArrayRef<int64_t>(&equalities[idx * numReservedCols], getNumCols());
364  }
365 
366  inline ArrayRef<int64_t> getInequality(unsigned idx) const {
367  return ArrayRef<int64_t>(&inequalities[idx * numReservedCols],
368  getNumCols());
369  }
370 
371  AffineExpr toAffineExpr(unsigned idx, MLIRContext *context);
372 
382  // TODO(bondhugula): add support for non-unit strides.
383  LogicalResult addAffineForOpDomain(AffineForOp forOp);
384 
389  LogicalResult addLowerOrUpperBound(unsigned pos, AffineMap boundMap,
390  ArrayRef<Value> operands, bool eq,
391  bool lower = true);
392 
399  void getSliceBounds(unsigned offset, unsigned num, MLIRContext *context,
402 
409  LogicalResult addSliceBounds(ArrayRef<Value> values,
410  ArrayRef<AffineMap> lbMaps,
411  ArrayRef<AffineMap> ubMaps,
412  ArrayRef<Value> operands);
413 
414  // Adds an inequality (>= 0) from the coefficients specified in inEq.
415  void addInequality(ArrayRef<int64_t> inEq);
416  // Adds an equality from the coefficients specified in eq.
417  void addEquality(ArrayRef<int64_t> eq);
418 
420  void addConstantLowerBound(unsigned pos, int64_t lb);
422  void addConstantUpperBound(unsigned pos, int64_t ub);
423 
429  void addLocalFloorDiv(ArrayRef<int64_t> dividend, int64_t divisor);
430 
432  void addConstantLowerBound(ArrayRef<int64_t> expr, int64_t lb);
434  void addConstantUpperBound(ArrayRef<int64_t> expr, int64_t ub);
435 
437  void setIdToConstant(unsigned pos, int64_t val);
438 
441  void setIdToConstant(Value id, int64_t val);
442 
446  bool findId(Value id, unsigned *pos) const;
447 
450  bool containsId(Value id) const;
451 
452  // Add identifiers of the specified kind - specified positions are relative to
453  // the kind of identifier. The coefficient column corresponding to the added
454  // identifier is initialized to zero. 'id' is the Value corresponding to the
455  // identifier that can optionally be provided.
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);
460 
467  void addInductionVarOrTerminalSymbol(Value id);
468 
478  LogicalResult composeMap(const AffineValueMap *vMap);
479 
484  LogicalResult composeMatchingMap(AffineMap other);
485 
489  // TODO(bondhugula): deal with integer exactness when necessary - can return a
490  // value to mark exactness for example.
491  void projectOut(unsigned pos, unsigned num);
492  inline void projectOut(unsigned pos) { return projectOut(pos, 1); }
493 
495  void projectOut(Value id);
496 
497  void removeId(IdKind idKind, unsigned pos);
498  void removeId(unsigned pos);
499 
500  void removeDim(unsigned pos);
501 
502  void removeEquality(unsigned pos);
503  void removeInequality(unsigned pos);
504 
508  void setDimSymbolSeparation(unsigned newSymbolCount);
509 
511  void convertLoopIVSymbolsToDims();
512 
514  void setAndEliminate(unsigned pos, int64_t constVal);
515 
520  LogicalResult constantFoldId(unsigned pos);
521 
524  void constantFoldIdRange(unsigned pos, unsigned num);
525 
539  LogicalResult unionBoundingBox(const FlatAffineConstraints &other);
540 
544  bool areIdsAlignedWithOther(const FlatAffineConstraints &other);
545 
554  // Eg: Input: 'this' has ((%i %j) [%M %N])
555  // 'other' has (%k, %j) [%P, %N, %M])
556  // Output: both 'this', 'other' have (%i, %j, %k) [%M, %N, %P]
557  //
558  void mergeAndAlignIdsWithOther(unsigned offset, FlatAffineConstraints *other);
559 
560  unsigned getNumConstraints() const {
561  return getNumInequalities() + getNumEqualities();
562  }
563  inline unsigned getNumIds() const { return numIds; }
564  inline unsigned getNumDimIds() const { return numDims; }
565  inline unsigned getNumSymbolIds() const { return numSymbols; }
566  inline unsigned getNumDimAndSymbolIds() const { return numDims + numSymbols; }
567  inline unsigned getNumLocalIds() const {
568  return numIds - numDims - numSymbols;
569  }
570 
572  return {ids.data(), ids.size()};
573  }
575  return {ids.data(), ids.size()};
576  }
577 
579  inline Optional<Value> getId(unsigned pos) const { return ids[pos]; }
580  inline Optional<Value> &getId(unsigned pos) { return ids[pos]; }
581 
584  inline Value getIdValue(unsigned pos) const {
585  assert(ids[pos].hasValue() && "identifier's Value not set");
586  return ids[pos].getValue();
587  }
588 
591  void getIdValues(unsigned start, unsigned end,
592  SmallVectorImpl<Value> *values) const {
593  assert((start < numIds || start == end) && "invalid start position");
594  assert(end <= numIds && "invalid end position");
595  values->clear();
596  values->reserve(end - start);
597  for (unsigned i = start; i < end; i++) {
598  values->push_back(getIdValue(i));
599  }
600  }
601  inline void getAllIdValues(SmallVectorImpl<Value> *values) const {
602  getIdValues(0, numIds, values);
603  }
604 
606  inline void setIdValue(unsigned pos, Value val) {
607  assert(pos < numIds && "invalid id position");
608  ids[pos] = val;
609  }
611  void setIdValues(unsigned start, unsigned end, ArrayRef<Value> values) {
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];
617  }
618 
620  void clearAndCopyFrom(const FlatAffineConstraints &other);
621 
635  getConstantBoundOnDimSize(unsigned pos,
636  SmallVectorImpl<int64_t> *lb = nullptr,
637  int64_t *lbFloorDivisor = nullptr,
638  SmallVectorImpl<int64_t> *ub = nullptr) const;
639 
642  Optional<int64_t> getConstantLowerBound(unsigned pos) const;
643 
646  Optional<int64_t> getConstantUpperBound(unsigned pos) const;
647 
655  std::pair<AffineMap, AffineMap>
656  getLowerAndUpperBound(unsigned pos, unsigned offset, unsigned num,
657  unsigned symStartPos, ArrayRef<AffineExpr> localExprs,
658  MLIRContext *context) const;
659 
662  bool isHyperRectangular(unsigned pos, unsigned num) const;
663 
669  void removeTrivialRedundancy();
670 
673  void removeRedundantInequalities();
674 
675  // Removes all equalities and inequalities.
676  void clearConstraints();
677 
678  void print(raw_ostream &os) const;
679  void dump() const;
680 
681 private:
685  bool hasConsistentState() const;
686 
691  bool hasInvalidConstraint() const;
692 
695  template <bool isLower>
696  Optional<int64_t> computeConstantLowerOrUpperBound(unsigned pos);
697 
698  // Eliminates a single identifier at 'position' from equality and inequality
699  // constraints. Returns 'success' if the identifier was eliminated, and
700  // 'failure' otherwise.
701  inline LogicalResult gaussianEliminateId(unsigned position) {
702  return success(gaussianEliminateIds(position, position + 1) == 1);
703  }
704 
705  // Eliminates identifiers from equality and inequality constraints
706  // in column range [posStart, posLimit).
707  // Returns the number of variables eliminated.
708  unsigned gaussianEliminateIds(unsigned posStart, unsigned posLimit);
709 
716  // See implementation comments for more details.
717  void FourierMotzkinEliminate(unsigned pos, bool darkShadow = false,
718  bool *isResultIntegerExact = nullptr);
719 
726  void GCDTightenInequalities();
727 
729  void normalizeConstraintsByGCD();
730 
734  void removeIdRange(unsigned idStart, unsigned idLimit);
735 
737  SmallVector<int64_t, 64> equalities;
738 
740  SmallVector<int64_t, 64> inequalities;
741 
744  unsigned numReservedCols;
745 
747  unsigned numIds;
748 
750  unsigned numDims;
751 
754  unsigned numSymbols;
755 
761 
766  // The rationale for 32 is that in the typical simplest of cases, an
767  // identifier is expected to have one lower bound and one upper bound
768  // constraint. With a level of tiling or a connection to another identifier
769  // through a div or mod, an extra pair of bounds gets added. As a limit, we
770  // don't expect an identifier to have more than 32 lower/upper/equality
771  // constraints. This is conservatively set low and can be raised if needed.
772  constexpr static unsigned kExplosionFactor = 32;
773 };
774 
779 AffineExpr simplifyAffineExpr(AffineExpr expr, unsigned numDims,
780  unsigned numSymbols);
781 
789 LogicalResult getFlattenedAffineExpr(AffineExpr expr, unsigned numDims,
790  unsigned numSymbols,
791  SmallVectorImpl<int64_t> *flattenedExpr,
792  FlatAffineConstraints *cst = nullptr);
793 
806  std::vector<SmallVector<int64_t, 8>> *flattenedExprs,
807  FlatAffineConstraints *cst = nullptr);
810  std::vector<SmallVector<int64_t, 8>> *flattenedExprs,
811  FlatAffineConstraints *cst = nullptr);
812 
813 } // end namespace mlir.
814 
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
Definition: LLVM.h:40
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
Definition: LLVM.h:34
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: LLVM.h:37
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
Definition: LLVM.h:38
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
Definition: Value.h:38
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
Definition: LLVM.h:35
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&#39;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 &#39;map&#39;.
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