xref: /llvm-project/mlir/lib/IR/IntegerSet.cpp (revision e45705ad5051247e1cb2355094ef77316ae24c37)
18a663870SUday Bondhugula //===- IntegerSet.cpp - MLIR Integer Set class ----------------------------===//
28a663870SUday Bondhugula //
3*30857107SMehdi Amini // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
456222a06SMehdi Amini // See https://llvm.org/LICENSE.txt for license information.
556222a06SMehdi Amini // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
68a663870SUday Bondhugula //
756222a06SMehdi Amini //===----------------------------------------------------------------------===//
88a663870SUday Bondhugula 
98a663870SUday Bondhugula #include "mlir/IR/IntegerSet.h"
10b04f881dSNicolas Vasilache #include "IntegerSetDetail.h"
118a663870SUday Bondhugula 
128a663870SUday Bondhugula using namespace mlir;
13b04f881dSNicolas Vasilache using namespace mlir::detail;
148a663870SUday Bondhugula 
getNumDims() const15b04f881dSNicolas Vasilache unsigned IntegerSet::getNumDims() const { return set->dimCount; }
getNumSymbols() const16b04f881dSNicolas Vasilache unsigned IntegerSet::getNumSymbols() const { return set->symbolCount; }
getNumInputs() const17854a384fSUday Bondhugula unsigned IntegerSet::getNumInputs() const {
18b04f881dSNicolas Vasilache   return set->dimCount + set->symbolCount;
19b04f881dSNicolas Vasilache }
2080610c2fSUday Bondhugula 
getNumConstraints() const2180610c2fSUday Bondhugula unsigned IntegerSet::getNumConstraints() const {
2280610c2fSUday Bondhugula   return set->constraints.size();
2380610c2fSUday Bondhugula }
24b04f881dSNicolas Vasilache 
getNumEqualities() const2554132393SMLIR Team unsigned IntegerSet::getNumEqualities() const {
2654132393SMLIR Team   unsigned numEqualities = 0;
2754132393SMLIR Team   for (unsigned i = 0, e = getNumConstraints(); i < e; i++)
2854132393SMLIR Team     if (isEq(i))
2954132393SMLIR Team       ++numEqualities;
3054132393SMLIR Team   return numEqualities;
3154132393SMLIR Team }
3254132393SMLIR Team 
getNumInequalities() const3354132393SMLIR Team unsigned IntegerSet::getNumInequalities() const {
3454132393SMLIR Team   return getNumConstraints() - getNumEqualities();
3554132393SMLIR Team }
3654132393SMLIR Team 
isEmptyIntegerSet() const3780610c2fSUday Bondhugula bool IntegerSet::isEmptyIntegerSet() const {
3880610c2fSUday Bondhugula   return *this == getEmptySet(set->dimCount, set->symbolCount, getContext());
3980610c2fSUday Bondhugula }
4080610c2fSUday Bondhugula 
getConstraints() const41b04f881dSNicolas Vasilache ArrayRef<AffineExpr> IntegerSet::getConstraints() const {
42b04f881dSNicolas Vasilache   return set->constraints;
43b04f881dSNicolas Vasilache }
44b04f881dSNicolas Vasilache 
getConstraint(unsigned idx) const45b04f881dSNicolas Vasilache AffineExpr IntegerSet::getConstraint(unsigned idx) const {
46b04f881dSNicolas Vasilache   return getConstraints()[idx];
47b04f881dSNicolas Vasilache }
48b04f881dSNicolas Vasilache 
49b04f881dSNicolas Vasilache /// Returns the equality bits, which specify whether each of the constraints
50b04f881dSNicolas Vasilache /// is an equality or inequality.
getEqFlags() const51b04f881dSNicolas Vasilache ArrayRef<bool> IntegerSet::getEqFlags() const { return set->eqFlags; }
52b04f881dSNicolas Vasilache 
53b04f881dSNicolas Vasilache /// Returns true if the idx^th constraint is an equality, false if it is an
54b04f881dSNicolas Vasilache /// inequality.
isEq(unsigned idx) const55b04f881dSNicolas Vasilache bool IntegerSet::isEq(unsigned idx) const { return getEqFlags()[idx]; }
5654132393SMLIR Team 
getContext() const5754132393SMLIR Team MLIRContext *IntegerSet::getContext() const {
5854132393SMLIR Team   return getConstraint(0).getContext();
5954132393SMLIR Team }
60854a384fSUday Bondhugula 
61854a384fSUday Bondhugula /// Walk all of the AffineExpr's in this set. Each node in an expression
62854a384fSUday Bondhugula /// tree is visited in postorder.
walkExprs(function_ref<void (AffineExpr)> callback) const634562e389SRiver Riddle void IntegerSet::walkExprs(function_ref<void(AffineExpr)> callback) const {
64854a384fSUday Bondhugula   for (auto expr : getConstraints())
65854a384fSUday Bondhugula     expr.walk(callback);
66854a384fSUday Bondhugula }
67854a384fSUday Bondhugula 
replaceDimsAndSymbols(ArrayRef<AffineExpr> dimReplacements,ArrayRef<AffineExpr> symReplacements,unsigned numResultDims,unsigned numResultSyms)68854a384fSUday Bondhugula IntegerSet IntegerSet::replaceDimsAndSymbols(
69854a384fSUday Bondhugula     ArrayRef<AffineExpr> dimReplacements, ArrayRef<AffineExpr> symReplacements,
70854a384fSUday Bondhugula     unsigned numResultDims, unsigned numResultSyms) {
71854a384fSUday Bondhugula   SmallVector<AffineExpr, 8> constraints;
72854a384fSUday Bondhugula   constraints.reserve(getNumConstraints());
73854a384fSUday Bondhugula   for (auto cst : getConstraints())
74854a384fSUday Bondhugula     constraints.push_back(
75854a384fSUday Bondhugula         cst.replaceDimsAndSymbols(dimReplacements, symReplacements));
76854a384fSUday Bondhugula 
77854a384fSUday Bondhugula   return get(numResultDims, numResultSyms, constraints, getEqFlags());
78854a384fSUday Bondhugula }
79