blob: 41dfc0018efab9538c602c9c24a3052ee184d312 [file] [log] [blame]
//===- Set.h - MLIR PresburgerSet 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
//
//===----------------------------------------------------------------------===//
//
// A class to represent unions of FlatAffineConstraints.
//
//===----------------------------------------------------------------------===//
#ifndef MLIR_ANALYSIS_PRESBURGERSET_H
#define MLIR_ANALYSIS_PRESBURGERSET_H
#include "mlir/Analysis/AffineStructures.h"
namespace mlir {
/// This class can represent a union of FlatAffineConstraints, with support for
/// union, intersection, subtraction and complement operations, as well as
/// sampling.
///
/// The FlatAffineConstraints (FACs) are stored in a vector, and the set
/// represents the union of these FACs. An empty list corresponds to the empty
/// set.
///
/// Note that there are no invariants guaranteed on the list of FACs other than
/// that they are all in the same space, i.e., they all have the same number of
/// dimensions and symbols. For example, the FACs may overlap each other.
class PresburgerSet {
public:
explicit PresburgerSet(const FlatAffineConstraints &fac);
/// Return the number of FACs in the union.
unsigned getNumFACs() const;
/// Return the number of real dimensions.
unsigned getNumDims() const;
/// Return the number of symbolic dimensions.
unsigned getNumSyms() const;
/// Return a reference to the list of FlatAffineConstraints.
ArrayRef<FlatAffineConstraints> getAllFlatAffineConstraints() const;
/// Return the FlatAffineConstraints at the specified index.
const FlatAffineConstraints &getFlatAffineConstraints(unsigned index) const;
/// Mutate this set, turning it into the union of this set and the given
/// FlatAffineConstraints.
void unionFACInPlace(const FlatAffineConstraints &fac);
/// Mutate this set, turning it into the union of this set and the given set.
void unionSetInPlace(const PresburgerSet &set);
/// Return the union of this set and the given set.
PresburgerSet unionSet(const PresburgerSet &set) const;
/// Return the intersection of this set and the given set.
PresburgerSet intersect(const PresburgerSet &set) const;
/// Return true if the set contains the given point, and false otherwise.
bool containsPoint(ArrayRef<int64_t> point) const;
/// Print the set's internal state.
void print(raw_ostream &os) const;
void dump() const;
/// Return the complement of this set. All local variables in the set must
/// correspond to floor divisions.
PresburgerSet complement() const;
/// Return the set difference of this set and the given set, i.e.,
/// return `this \ set`. All local variables in `set` must correspond
/// to floor divisions, but local variables in `this` need not correspond to
/// divisions.
PresburgerSet subtract(const PresburgerSet &set) const;
/// Return true if this set is equal to the given set, and false otherwise.
/// All local variables in both sets must correspond to floor divisions.
bool isEqual(const PresburgerSet &set) const;
/// Return a universe set of the specified type that contains all points.
static PresburgerSet getUniverse(unsigned nDim = 0, unsigned nSym = 0);
/// Return an empty set of the specified type that contains no points.
static PresburgerSet getEmptySet(unsigned nDim = 0, unsigned nSym = 0);
/// Return true if all the sets in the union are known to be integer empty
/// false otherwise.
bool isIntegerEmpty() const;
/// Find an integer sample from the given set. This should not be called if
/// any of the FACs in the union are unbounded.
bool findIntegerSample(SmallVectorImpl<int64_t> &sample);
private:
/// Construct an empty PresburgerSet.
PresburgerSet(unsigned nDim = 0, unsigned nSym = 0)
: nDim(nDim), nSym(nSym) {}
/// Return the set difference fac \ set.
static PresburgerSet getSetDifference(FlatAffineConstraints fac,
const PresburgerSet &set);
/// Number of identifiers corresponding to real dimensions.
unsigned nDim;
/// Number of symbolic dimensions, unknown but constant for analysis, as in
/// FlatAffineConstraints.
unsigned nSym;
/// The list of flatAffineConstraints that this set is the union of.
SmallVector<FlatAffineConstraints, 2> flatAffineConstraints;
};
} // namespace mlir
#endif // MLIR_ANALYSIS_PRESBURGERSET_H