//===- AffineStructures.h - MLIR Affine Structures Class --------*- 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 // //===----------------------------------------------------------------------===// // // Structures for affine/polyhedral analysis of ML functions. // //===----------------------------------------------------------------------===// #ifndef MLIR_DIALECT_AFFINE_ANALYSIS_AFFINESTRUCTURES_H #define MLIR_DIALECT_AFFINE_ANALYSIS_AFFINESTRUCTURES_H #include "mlir/Analysis/FlatLinearValueConstraints.h" #include "mlir/Analysis/Presburger/IntegerRelation.h" #include "mlir/Analysis/Presburger/Matrix.h" #include "mlir/IR/AffineExpr.h" #include "mlir/IR/OpDefinition.h" #include <optional> namespace mlir { class AffineMap; class IntegerSet; class MemRefType; class MLIRContext; struct MutableAffineMap; class Value; namespace presburger { class MultiAffineFunction; } // namespace presburger namespace affine { class AffineCondition; class AffineForOp; class AffineIfOp; class AffineParallelOp; class AffineValueMap; /// FlatAffineValueConstraints is an extension of FlatLinearValueConstraints /// with helper functions for Affine dialect ops. class FlatAffineValueConstraints : public FlatLinearValueConstraints { … }; /// A FlatAffineRelation represents a set of ordered pairs (domain -> range) /// where "domain" and "range" are tuples of variables. The relation is /// represented as a FlatAffineValueConstraints with separation of dimension /// variables into domain and range. The variables are stored as: /// [domainVars, rangeVars, symbolVars, localVars, constant]. /// /// Deprecated: use IntegerRelation and store SSA Values in the PresburgerSpace /// of the relation using PresburgerSpace::identifiers. Note that /// FlatAffineRelation::numDomainDims and FlatAffineRelation::numRangeDims are /// independent of numDomain and numRange of the relation's space. In /// particular, operations such as FlatAffineRelation::compose do not ensure /// consistency between numDomainDims/numRangeDims and numDomain/numRange which /// may lead to unexpected behaviour. class FlatAffineRelation : public FlatAffineValueConstraints { … }; /// Builds a relation from the given AffineMap/AffineValueMap `map`, containing /// all pairs of the form `operands -> result` that satisfy `map`. `rel` is set /// to the relation built. For example, give the AffineMap: /// /// (d0, d1)[s0] -> (d0 + s0, d0 - s0) /// /// the resulting relation formed is: /// /// (d0, d1) -> (r1, r2) /// [d0 d1 r1 r2 s0 const] /// 1 0 -1 0 1 0 = 0 /// 0 1 0 -1 -1 0 = 0 /// /// For AffineValueMap, the domain and symbols have Value set corresponding to /// the Value in `map`. Returns failure if the AffineMap could not be flattened /// (i.e., semi-affine is not yet handled). LogicalResult getRelationFromMap(AffineMap &map, presburger::IntegerRelation &rel); LogicalResult getRelationFromMap(const AffineValueMap &map, presburger::IntegerRelation &rel); } // namespace affine } // namespace mlir #endif // MLIR_DIALECT_AFFINE_ANALYSIS_AFFINESTRUCTURES_H