28#include "llvm/ADT/Sequence.h"
29#include "llvm/Support/Debug.h"
43#define DEBUG_TYPE "polly-dependence"
46 "polly-dependences-computeout",
47 cl::desc(
"Bound the dependence analysis by a maximal amount of "
48 "computational steps (0 means no bound)"),
53 cl::desc(
"Disable polly legality check"), cl::Hidden,
58 cl::desc(
"Exploit reductions in dependence analysis"),
64 "polly-dependences-analysis-type",
65 cl::desc(
"The kind of dependence analysis to use"),
67 "Exact dependences without transitive dependences"),
69 "Overapproximation of dependences")),
73 "polly-dependences-analysis-level",
74 cl::desc(
"The level of dependence analysis"),
76 "Statement-level analysis"),
78 "Memory reference level analysis that distinguish"
79 " accessed references in the same statement"),
81 "Memory reference level analysis that distinguish"
82 " access instructions in the same statement")),
119 isl_space *Space =
S.getParamSpace().release();
126 SmallPtrSet<const ScopArrayInfo *, 8> ReductionArrays;
130 if (MA->isReductionLike())
131 ReductionArrays.insert(MA->getScopArrayInfo());
135 isl_set *domcp = Stmt.getDomain().release();
136 isl_map *accdom = MA->getAccessRelation().release();
140 if (ReductionArrays.count(MA->getScopArrayInfo())) {
156 accdom =
tag(accdom, MA, Level);
158 isl_map *StmtScheduleMap = Stmt.getSchedule().release();
160 "Schedules that contain extension nodes require special "
162 isl_map *Schedule =
tag(StmtScheduleMap, MA, Level);
169 else if (MA->isMayWrite())
181 StmtSchedule,
S.getAssumedContext().release());
194 *User = User->
unite(Zero);
273 for (
unsigned u = 0; u < 3; u++) {
312 isl_union_map *Read, *MustWrite, *MayWrite, *ReductionTagMap;
318 collectInfo(
S, Read, MustWrite, MayWrite, ReductionTagMap, TaggedStmtDomain,
324 dbgs() <<
"MustWrite: " << MustWrite <<
'\n';
325 dbgs() <<
"MayWrite: " << MayWrite <<
'\n';
326 dbgs() <<
"ReductionTagMap: " << ReductionTagMap <<
'\n';
327 dbgs() <<
"TaggedStmtDomain: " << TaggedStmtDomain <<
'\n';);
329 Schedule =
S.getScheduleTree().release();
331 if (!HasReductions) {
365 dbgs() <<
"MustWrite: " << MustWrite <<
"\n";
366 dbgs() <<
"MayWrite: " << MayWrite <<
"\n";
367 dbgs() <<
"Schedule: " << Schedule <<
"\n");
441 Flow =
buildFlow(Read, MustWrite, MayWrite,
nullptr, Schedule);
445 Flow =
buildFlow(Write, MustWrite, MayWrite,
nullptr, Schedule);
451 Flow =
buildFlow(Write,
nullptr, Read, MustWrite, Schedule);
455 Flow =
buildFlow(Read,
nullptr, Write,
nullptr, Schedule);
459 Flow =
buildFlow(Write,
nullptr, Read,
nullptr, Schedule);
463 Flow =
buildFlow(Write,
nullptr, Write,
nullptr, Schedule);
509 dbgs() <<
"Wrapped Dependences:\n";
532 if (!MA->isReductionLike())
558 dbgs() <<
"Final Wrapped Dependences:\n";
577 if (!MA->isReductionLike())
597 "Intersecting the reduction dependence domain with the wrapped access "
598 "relation is not enough, we need to loosen the access relation also");
608 dbgs() <<
"Zipped Dependences:\n";
620 dbgs() <<
"Unwrapped Dependences:\n";
643 auto Stmt =
reinterpret_cast<ScopStmt *
>(
645 NewSchedules[Stmt] = NewMap;
664 auto Lookup = NewSchedule.find(&Stmt);
665 if (Lookup == NewSchedule.end())
666 StmtScat = Stmt.getSchedule();
668 StmtScat = Lookup->second;
670 "Schedules that contain extension nodes require special handling.");
675 Schedule = Schedule.
unite(StmtScat);
730 for (
unsigned i = 0; i < Dimension; i++)
737 for (
unsigned i = 0; i < Dimension; i++)
744 if (IsParallel || !MinDistancePtr) {
768 OS <<
"\tRAW dependences:\n\t\t";
770 OS <<
"\tWAR dependences:\n\t\t";
772 OS <<
"\tWAW dependences:\n\t\t";
774 OS <<
"\tReduction dependences:\n\t\t";
776 OS <<
"\tTransitive closure of reduction dependences:\n\t\t";
822 return (
RAW !=
nullptr) && (
WAR !=
nullptr) && (
WAW !=
nullptr);
833 "Reduction dependences set twice!");
847 D[Level].reset(
new Dependences(
S.getSharedIslCtx(), Level));
853 for (std::unique_ptr<Dependences> &Deps : D)
873 return PreservedAnalyses::all();
881 return PreservedAnalyses::all();
889 return recomputeDependences(Level);
894 D[Level].reset(
new Dependences(
S->getSharedIslCtx(), Level));
900 for (std::unique_ptr<Dependences> &Deps : D)
925 AU.setPreservesAll();
933 "Polly - Calculate dependences",
false,
false);
936 "Polly - Calculate dependences",
false,
false)
942class DependenceInfoPrinterLegacyPass final :
public ScopPass {
946 DependenceInfoPrinterLegacyPass() : DependenceInfoPrinterLegacyPass(outs()) {}
948 explicit DependenceInfoPrinterLegacyPass(llvm::raw_ostream &OS)
951 bool runOnScop(
Scop &
S)
override {
954 OS <<
"Printing analysis '" << P.getPassName() <<
"' for "
955 <<
"region: '" <<
S.getRegion().getNameStr() <<
"' in function '"
956 <<
S.getFunction().getName() <<
"':\n";
962 void getAnalysisUsage(AnalysisUsage &AU)
const override {
965 AU.setPreservesAll();
969 llvm::raw_ostream &OS;
972char DependenceInfoPrinterLegacyPass::ID = 0;
976 return new DependenceInfoPrinterLegacyPass(OS);
980 "polly-print-dependences",
"Polly - Print dependences",
984 "Polly - Print dependences",
false,
false)
991 auto It = ScopToDepsMap.find(
S);
992 if (It != ScopToDepsMap.end())
994 if (It->second->getDependenceLevel() == Level)
995 return *It->second.get();
997 return recomputeDependences(
S, Level);
1002 std::unique_ptr<Dependences> D(
new Dependences(
S->getSharedIslCtx(), Level));
1003 D->calculateDependences(*
S);
1004 auto Inserted = ScopToDepsMap.insert(std::make_pair(
S, std::move(D)));
1005 return *Inserted.first->second;
1009 auto &SI = *getAnalysis<ScopInfoWrapperPass>().getSI();
1010 for (
auto &It : SI) {
1011 assert(It.second &&
"Invalid SCoP object!");
1018 for (
auto &It : ScopToDepsMap) {
1019 assert((It.first && It.second) &&
"Invalid Scop or Dependence object!\n");
1020 It.second->print(OS);
1026 AU.setPreservesAll();
1037 "Polly - Calculate dependences for all the SCoPs of a function",
false,
1049class DependenceInfoPrinterLegacyFunctionPass final :
public FunctionPass {
1053 DependenceInfoPrinterLegacyFunctionPass()
1054 : DependenceInfoPrinterLegacyFunctionPass(outs()) {}
1056 explicit DependenceInfoPrinterLegacyFunctionPass(llvm::raw_ostream &OS)
1057 : FunctionPass(ID), OS(OS) {}
1059 bool runOnFunction(
Function &F)
override {
1062 OS <<
"Printing analysis '" << P.getPassName() <<
"' for function '"
1063 << F.getName() <<
"':\n";
1069 void getAnalysisUsage(AnalysisUsage &AU)
const override {
1070 FunctionPass::getAnalysisUsage(AU);
1072 AU.setPreservesAll();
1076 llvm::raw_ostream &OS;
1079char DependenceInfoPrinterLegacyFunctionPass::ID = 0;
1083 return new DependenceInfoPrinterLegacyFunctionPass(OS);
1087 DependenceInfoPrinterLegacyFunctionPass,
"polly-print-function-dependences",
1088 "Polly - Print dependences for all the SCoPs of a function",
false,
false);
1091 "polly-print-function-dependences",
1092 "Polly - Print dependences for all the SCoPs of a function",
INITIALIZE_PASS_BEGIN(DependenceInfo, "polly-dependences", "Polly - Calculate dependences", false, false)
static __isl_give isl_union_flow * buildFlow(__isl_keep isl_union_map *Snk, __isl_keep isl_union_map *Src, __isl_keep isl_union_map *MaySrc, __isl_keep isl_union_map *Kill, __isl_keep isl_schedule *Schedule)
static cl::opt< int > OptComputeOut("polly-dependences-computeout", cl::desc("Bound the dependence analysis by a maximal amount of " "computational steps (0 means no bound)"), cl::Hidden, cl::init(500000), cl::cat(PollyCategory))
static cl::opt< Dependences::AnalysisLevel > OptAnalysisLevel("polly-dependences-analysis-level", cl::desc("The level of dependence analysis"), cl::values(clEnumValN(Dependences::AL_Statement, "statement-wise", "Statement-level analysis"), clEnumValN(Dependences::AL_Reference, "reference-wise", "Memory reference level analysis that distinguish" " accessed references in the same statement"), clEnumValN(Dependences::AL_Access, "access-wise", "Memory reference level analysis that distinguish" " access instructions in the same statement")), cl::Hidden, cl::init(Dependences::AL_Statement), cl::cat(PollyCategory))
static void printDependencyMap(raw_ostream &OS, __isl_keep isl_union_map *DM)
static cl::opt< bool > LegalityCheckDisabled("disable-polly-legality", cl::desc("Disable polly legality check"), cl::Hidden, cl::cat(PollyCategory))
static void fixSetToZero(isl::set Zero, isl::union_set *User)
Fix all dimension of Zero to 0 and add it to user.
static cl::opt< enum AnalysisType > OptAnalysisType("polly-dependences-analysis-type", cl::desc("The kind of dependence analysis to use"), cl::values(clEnumValN(VALUE_BASED_ANALYSIS, "value-based", "Exact dependences without transitive dependences"), clEnumValN(MEMORY_BASED_ANALYSIS, "memory-based", "Overapproximation of dependences")), cl::Hidden, cl::init(VALUE_BASED_ANALYSIS), cl::cat(PollyCategory))
INITIALIZE_PASS_END(DependenceInfo, "polly-dependences", "Polly - Calculate dependences", false, false) namespace
INITIALIZE_PASS_DEPENDENCY(ScopInfoRegionPass)
static void collectInfo(Scop &S, isl_union_map *&Read, isl_union_map *&MustWrite, isl_union_map *&MayWrite, isl_union_map *&ReductionTagMap, isl_union_set *&TaggedStmtDomain, Dependences::AnalysisLevel Level)
Collect information about the SCoP S.
static __isl_give isl_map * tag(__isl_take isl_map *Relation, __isl_take isl_id *TagId)
Tag the Relation domain with TagId.
static cl::opt< bool > UseReductions("polly-dependences-use-reductions", cl::desc("Exploit reductions in dependence analysis"), cl::Hidden, cl::init(true), cl::cat(PollyCategory))
polly dump Polly Dump Function
llvm::cl::OptionCategory PollyCategory
polly prune Polly Prune unprofitable SCoPs
static RegisterPass< ScopPrinterWrapperPass > M("dot-scops", "Polly - Print Scops of function")
__isl_export __isl_give isl_multi_aff * isl_multi_aff_domain_map(__isl_take isl_space *space)
__isl_export __isl_give isl_union_pw_multi_aff * isl_union_pw_multi_aff_union_add(__isl_take isl_union_pw_multi_aff *upma1, __isl_take isl_union_pw_multi_aff *upma2)
__isl_export __isl_give isl_pw_aff * isl_pw_aff_coalesce(__isl_take isl_pw_aff *pa)
__isl_give isl_union_pw_multi_aff * isl_union_pw_multi_aff_from_union_map(__isl_take isl_union_map *umap)
struct isl_union_pw_multi_aff isl_union_pw_multi_aff
struct isl_multi_aff isl_multi_aff
for(int c0=1;c0< 3 *M - 1;c0+=3)
__isl_give isl_id * release()
static isl::map universe(isl::space space)
isl::map lex_le_at(isl::multi_pw_aff mpa) const
isl::map intersect_range(isl::set set) const
isl::space get_space() const
isl::map intersect_domain(isl::set set) const
static isl::multi_pw_aff identity_on_domain(isl::space space)
isl::union_map get_map() const
static isl::set universe(isl::space space)
isl::set fix_si(isl::dim type, unsigned int pos, int value) const
class size tuple_dim() const
isl::space get_space() const
isl::space map_from_set() const
isl::union_map unite(isl::union_map umap2) const
isl::map_list get_map_list() const
isl::union_map coalesce() const
static isl::union_map empty(isl::ctx ctx)
isl::union_map detect_equalities() const
__isl_give isl_union_set * release()
isl::union_set unite(isl::union_set uset2) const
Construct a new DependenceInfoWrapper pass.
bool runOnFunction(Function &F) override
Compute the dependence information on-the-fly for the function.
void getAnalysisUsage(AnalysisUsage &AU) const override
Register all analyses and transformation required.
const Dependences & recomputeDependences(Scop *S, Dependences::AnalysisLevel Level)
Recompute dependences from schedule and memory accesses.
void print(raw_ostream &OS, const Module *M=nullptr) const override
Print the dependences for the current function to OS.
void printScop(raw_ostream &OS, Scop &) const override
Print the dependences for the given SCoP to OS.
void getAnalysisUsage(AnalysisUsage &AU) const override
Register all analyses and transformation required.
const Dependences & getDependences(Dependences::AnalysisLevel Level)
Return the dependence information for the current SCoP.
const Dependences & recomputeDependences(Dependences::AnalysisLevel Level)
Recompute dependences from schedule and memory accesses.
bool runOnScop(Scop &S) override
Compute the dependence information for the SCoP S.
void abandonDependences()
Invalidate the dependence information and recompute it when needed again.
The accumulated dependence information for a SCoP.
void setReductionDependences(MemoryAccess *MA, __isl_take isl_map *Deps)
Set the reduction dependences for MA to Deps.
DenseMap< ScopStmt *, isl::map > StatementToIslMapTy
Map type to associate statements with schedules.
isl_union_map * TC_RED
The (reverse) transitive closure of reduction dependences.
void addPrivatizationDependences()
Calculate and add at the privatization dependences.
bool isParallel(__isl_keep isl_union_map *Schedule, __isl_take isl_union_map *Deps, __isl_give isl_pw_aff **MinDistancePtr=nullptr) const
Check if a partial schedule is parallel wrt to Deps.
const AnalysisLevel Level
Granularity of this dependence analysis.
void print(llvm::raw_ostream &OS) const
Print the stored dependence information.
const ReductionDependencesMapTy & getReductionDependences() const
Return all reduction dependences.
void calculateDependences(Scop &S)
Calculate the dependences for a certain SCoP S.
bool hasValidDependences() const
Report if valid dependences are available.
isl_union_map * RED
The special reduction dependences.
isl_union_map * RAW
The different basic kinds of dependences we calculate.
void dump() const
Dump the dependence information stored to the dbgs stream.
isl::union_map getDependences(int Kinds) const
Get the dependences of type Kinds.
bool isValidSchedule(Scop &S, const StatementToIslMapTy &NewSchedules) const
Check if a new schedule is valid.
void releaseMemory()
Free the objects associated with this Dependences struct.
std::shared_ptr< isl_ctx > IslCtx
Isl context from the SCoP.
ReductionDependencesMapTy ReductionDependences
Mapping from memory accesses to their reduction dependences.
Scoped limit of ISL operations.
Represent memory accesses in statements.
isl::id getArrayId() const
Old name of getOriginalArrayId().
isl::id getId() const
Get identifier for the memory access.
The legacy pass manager's analysis pass to compute scop information for a region.
The legacy pass manager's analysis pass to compute scop information for the whole function.
ScopPass - This class adapts the RegionPass interface to allow convenient creation of passes that ope...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
enum isl_error isl_ctx_last_error(isl_ctx *ctx)
void isl_ctx_reset_error(isl_ctx *ctx)
__isl_export __isl_give isl_union_access_info * isl_union_access_info_set_schedule(__isl_take isl_union_access_info *access, __isl_take isl_schedule *schedule)
__isl_null isl_union_flow * isl_union_flow_free(__isl_take isl_union_flow *flow)
__isl_export __isl_give isl_union_access_info * isl_union_access_info_set_may_source(__isl_take isl_union_access_info *access, __isl_take isl_union_map *may_source)
__isl_export __isl_give isl_union_access_info * isl_union_access_info_set_must_source(__isl_take isl_union_access_info *access, __isl_take isl_union_map *must_source)
__isl_constructor __isl_give isl_union_access_info * isl_union_access_info_from_sink(__isl_take isl_union_map *sink)
__isl_export __isl_give isl_union_access_info * isl_union_access_info_set_kill(__isl_take isl_union_access_info *access, __isl_take isl_union_map *kill)
__isl_export __isl_give isl_union_flow * isl_union_access_info_compute_flow(__isl_take isl_union_access_info *access)
__isl_export __isl_give isl_union_map * isl_union_flow_get_must_dependence(__isl_keep isl_union_flow *flow)
__isl_export __isl_give isl_union_map * isl_union_flow_get_may_dependence(__isl_keep isl_union_flow *flow)
static int all(int *con, unsigned len, int status)
__isl_export __isl_give isl_set * isl_map_domain(__isl_take isl_map *bmap)
__isl_export __isl_give isl_map * isl_map_zip(__isl_take isl_map *map)
__isl_give isl_map * isl_map_copy(__isl_keep isl_map *map)
__isl_export __isl_give isl_space * isl_map_get_space(__isl_keep isl_map *map)
__isl_give isl_map * isl_map_from_domain_and_range(__isl_take isl_set *domain, __isl_take isl_set *range)
__isl_export __isl_give isl_map * isl_map_intersect_domain(__isl_take isl_map *map, __isl_take isl_set *set)
__isl_export __isl_give isl_set * isl_map_deltas(__isl_take isl_map *map)
__isl_give isl_map * isl_map_range_map(__isl_take isl_map *map)
__isl_export __isl_give isl_map * isl_set_unwrap(__isl_take isl_set *set)
__isl_export __isl_give isl_set * isl_map_wrap(__isl_take isl_map *map)
isl_size isl_map_dim(__isl_keep isl_map *map, enum isl_dim_type type)
__isl_overload __isl_give isl_map * isl_map_preimage_domain_multi_aff(__isl_take isl_map *map, __isl_take isl_multi_aff *ma)
__isl_give isl_map * isl_map_equate(__isl_take isl_map *map, enum isl_dim_type type1, int pos1, enum isl_dim_type type2, int pos2)
__isl_null isl_map * isl_map_free(__isl_take isl_map *map)
aff manage_copy(__isl_keep isl_aff *ptr)
boolean manage(isl_bool val)
This file contains the declaration of the PolyhedralInfo class, which will provide an interface to ex...
llvm::Pass * createDependenceInfoPass()
llvm::iota_range< unsigned > rangeIslSize(unsigned Begin, isl::size End)
Check that End is valid and return an iterator from Begin to End.
llvm::Pass * createDependenceInfoWrapperPassPass()
llvm::Pass * createDependenceInfoPrinterLegacyPass(llvm::raw_ostream &OS)
llvm::Pass * createDependenceInfoPrinterLegacyFunctionPass(llvm::raw_ostream &OS)
AnalysisManager< Scop, ScopStandardAnalysisResults & > ScopAnalysisManager
isl::map singleton(isl::union_map UMap, isl::space ExpectedSpace)
If by construction a union map is known to contain only a single map, return it.
__isl_null isl_schedule * isl_schedule_free(__isl_take isl_schedule *sched)
__isl_give isl_schedule * isl_schedule_copy(__isl_keep isl_schedule *sched)
isl_ctx * isl_schedule_get_ctx(__isl_keep isl_schedule *sched)
__isl_overload __isl_give isl_schedule * isl_schedule_pullback_union_pw_multi_aff(__isl_take isl_schedule *schedule, __isl_take isl_union_pw_multi_aff *upma)
__isl_export __isl_give isl_set * isl_set_universe(__isl_take isl_space *space)
__isl_export __isl_give isl_set * isl_set_coalesce(__isl_take isl_set *set)
__isl_export __isl_give isl_space * isl_set_get_space(__isl_keep isl_set *set)
__isl_give isl_set * isl_set_lower_bound_si(__isl_take isl_set *set, enum isl_dim_type type, unsigned pos, int value)
__isl_give isl_pw_aff * isl_set_dim_min(__isl_take isl_set *set, int pos)
__isl_null isl_set * isl_set_free(__isl_take isl_set *set)
__isl_give isl_set * isl_set_copy(__isl_keep isl_set *set)
__isl_give isl_set * isl_set_project_out(__isl_take isl_set *set, enum isl_dim_type type, unsigned first, unsigned n)
__isl_export __isl_give isl_set * isl_set_intersect(__isl_take isl_set *set1, __isl_take isl_set *set2)
__isl_give isl_set * isl_set_fix_si(__isl_take isl_set *set, enum isl_dim_type type, unsigned pos, int value)
__isl_export isl_bool isl_set_is_empty(__isl_keep isl_set *set)
__isl_give isl_space * isl_space_set_tuple_id(__isl_take isl_space *space, enum isl_dim_type type, __isl_take isl_id *id)
__isl_give isl_space * isl_space_copy(__isl_keep isl_space *space)
__isl_give isl_space * isl_space_drop_dims(__isl_take isl_space *space, enum isl_dim_type type, unsigned first, unsigned num)
const Dependences & getDependences(Dependences::AnalysisLevel Level)
Return the dependence information for the current SCoP.
std::unique_ptr< Dependences > D[Dependences::NumAnalysisLevels]
const Dependences & recomputeDependences(Dependences::AnalysisLevel Level)
Recompute dependences from schedule and memory accesses.
void abandonDependences()
Invalidate the dependence information and recompute it when needed again.
Result run(Scop &S, ScopAnalysisManager &SAM, ScopStandardAnalysisResults &SAR)
PreservedAnalyses run(Scop &S, ScopAnalysisManager &, ScopStandardAnalysisResults &, SPMUpdater &)
__isl_null isl_union_map * isl_union_map_free(__isl_take isl_union_map *umap)
__isl_export __isl_give isl_space * isl_union_map_get_space(__isl_keep isl_union_map *umap)
__isl_export __isl_give isl_union_map * isl_union_map_reverse(__isl_take isl_union_map *umap)
__isl_give isl_union_map * isl_union_map_add_map(__isl_take isl_union_map *umap, __isl_take isl_map *map)
__isl_give isl_map * isl_map_from_union_map(__isl_take isl_union_map *umap)
__isl_export __isl_give isl_union_set * isl_union_map_deltas(__isl_take isl_union_map *umap)
__isl_export __isl_give isl_union_map * isl_union_set_identity(__isl_take isl_union_set *uset)
__isl_export __isl_give isl_union_map * isl_union_map_coalesce(__isl_take isl_union_map *umap)
__isl_export __isl_give isl_union_pw_multi_aff * isl_union_map_domain_map_union_pw_multi_aff(__isl_take isl_union_map *umap)
__isl_export __isl_give isl_union_map * isl_union_map_apply_range(__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
__isl_give isl_union_map * isl_union_map_copy(__isl_keep isl_union_map *umap)
__isl_export __isl_give isl_union_map * isl_union_map_subtract(__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
__isl_export isl_bool isl_union_map_is_empty(__isl_keep isl_union_map *umap)
__isl_export __isl_give isl_union_map * isl_union_map_apply_domain(__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
__isl_give isl_union_map * isl_union_map_empty(__isl_take isl_space *space)
__isl_export isl_bool isl_union_map_is_equal(__isl_keep isl_union_map *umap1, __isl_keep isl_union_map *umap2)
__isl_export __isl_give isl_union_map * isl_union_map_union(__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
__isl_give isl_union_map * isl_union_map_intersect_domain(__isl_take isl_union_map *umap, __isl_take isl_union_set *uset)
__isl_export __isl_give isl_union_map * isl_union_map_zip(__isl_take isl_union_map *umap)
__isl_give isl_union_map * isl_union_map_transitive_closure(__isl_take isl_union_map *umap, isl_bool *exact)
__isl_export __isl_give isl_union_map * isl_union_set_unwrap(__isl_take isl_union_set *uset)
__isl_export __isl_give isl_union_set * isl_union_map_domain(__isl_take isl_union_map *umap)
__isl_export __isl_give isl_union_map * isl_union_map_intersect_params(__isl_take isl_union_map *umap, __isl_take isl_set *set)
__isl_export __isl_give isl_union_map * isl_union_map_intersect(__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
struct isl_union_set isl_union_set
__isl_export __isl_give isl_union_set * isl_union_set_universe(__isl_take isl_union_set *uset)
__isl_give isl_union_set * isl_union_set_empty(__isl_take isl_space *space)
__isl_export __isl_give isl_space * isl_union_set_get_space(__isl_keep isl_union_set *uset)
__isl_constructor __isl_give isl_union_set * isl_union_set_from_set(__isl_take isl_set *set)
__isl_give isl_union_map * isl_union_set_lex_le_union_set(__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2)
__isl_give isl_union_set * isl_union_set_copy(__isl_keep isl_union_set *uset)
__isl_null isl_union_set * isl_union_set_free(__isl_take isl_union_set *uset)