Changeset View
Changeset View
Standalone View
Standalone View
lib/Support/ISLTools.cpp
Show First 20 Lines • Show All 360 Lines • ▼ Show 20 Lines | polly::computeArrayUnused(isl::union_map Schedule, isl::union_map Writes, | ||||
isl::union_map Reads, bool ReadEltInSameInst, | isl::union_map Reads, bool ReadEltInSameInst, | ||||
bool IncludeLastRead, bool IncludeWrite) { | bool IncludeLastRead, bool IncludeWrite) { | ||||
// { Element[] -> Scatter[] } | // { Element[] -> Scatter[] } | ||||
auto ReadActions = | auto ReadActions = | ||||
give(isl_union_map_apply_domain(Schedule.copy(), Reads.take())); | give(isl_union_map_apply_domain(Schedule.copy(), Reads.take())); | ||||
auto WriteActions = | auto WriteActions = | ||||
give(isl_union_map_apply_domain(Schedule.copy(), Writes.copy())); | give(isl_union_map_apply_domain(Schedule.copy(), Writes.copy())); | ||||
// { [Element[] -> Scatter[] } | |||||
auto AfterReads = afterScatter(ReadActions, ReadEltInSameInst); | |||||
auto WritesBeforeAnyReads = | |||||
give(isl_union_map_subtract(WriteActions.take(), AfterReads.take())); | |||||
auto BeforeWritesBeforeAnyReads = | |||||
beforeScatter(WritesBeforeAnyReads, !IncludeWrite); | |||||
// { [Element[] -> DomainWrite[]] -> Scatter[] } | // { [Element[] -> DomainWrite[]] -> Scatter[] } | ||||
auto EltDomWrites = give(isl_union_map_apply_range( | auto EltDomWrites = give(isl_union_map_apply_range( | ||||
isl_union_map_range_map(isl_union_map_reverse(Writes.copy())), | isl_union_map_range_map(isl_union_map_reverse(Writes.copy())), | ||||
Schedule.copy())); | Schedule.copy())); | ||||
// { [Element[] -> Scatter[]] -> DomainWrite[] } | // { [Element[] -> Scatter[]] -> DomainWrite[] } | ||||
auto ReachingOverwrite = computeReachingWrite( | auto ReachingOverwrite = computeReachingWrite( | ||||
Schedule, Writes, true, ReadEltInSameInst, !ReadEltInSameInst); | Schedule, Writes, true, ReadEltInSameInst, !ReadEltInSameInst); | ||||
// { [Element[] -> Scatter[]] -> DomainWrite[] } | // { [Element[] -> Scatter[]] -> DomainWrite[] } | ||||
auto ReadsOverwritten = give(isl_union_map_intersect_domain( | auto ReadsOverwritten = give(isl_union_map_intersect_domain( | ||||
ReachingOverwrite.take(), isl_union_map_wrap(ReadActions.take()))); | ReachingOverwrite.take(), isl_union_map_wrap(ReadActions.take()))); | ||||
// { [Element[] -> DomainWrite[]] -> Scatter[] } | // { [Element[] -> DomainWrite[]] -> Scatter[] } | ||||
auto ReadsOverwrittenRotated = give(isl_union_map_reverse( | auto ReadsOverwrittenRotated = give(isl_union_map_reverse( | ||||
isl_union_map_curry(reverseDomain(ReadsOverwritten).take()))); | isl_union_map_curry(reverseDomain(ReadsOverwritten).take()))); | ||||
auto LastOverwrittenRead = | auto LastOverwrittenRead = | ||||
give(isl_union_map_lexmax(ReadsOverwrittenRotated.take())); | give(isl_union_map_lexmax(ReadsOverwrittenRotated.copy())); | ||||
// { [Element[] -> DomainWrite[]] -> Scatter[] } | // { [Element[] -> DomainWrite[]] -> Scatter[] } | ||||
auto BetweenLastReadOverwrite = betweenScatter( | auto BetweenLastReadOverwrite = betweenScatter( | ||||
LastOverwrittenRead, EltDomWrites, IncludeLastRead, IncludeWrite); | LastOverwrittenRead, EltDomWrites, IncludeLastRead, IncludeWrite); | ||||
return give(isl_union_map_union( | // { [Element[] -> Scatter[]] -> DomainWrite[] } | ||||
BeforeWritesBeforeAnyReads.take(), | isl::union_map ReachingOverwriteZone = computeReachingWrite( | ||||
isl_union_map_domain_factor_domain(BetweenLastReadOverwrite.take()))); | Schedule, Writes, true, IncludeLastRead, IncludeWrite); | ||||
// { [Element[] -> DomainWrite[]] -> Scatter[] } | |||||
isl::union_map ReachingOverwriteRotated = | |||||
reverseDomain(ReachingOverwriteZone).curry().reverse(); | |||||
// { [Element[] -> DomainWrite[]] -> Scatter[] } | |||||
isl::union_map WritesWithoutReads = ReachingOverwriteRotated.subtract_domain( | |||||
ReadsOverwrittenRotated.domain()); | |||||
return BetweenLastReadOverwrite.unite(WritesWithoutReads) | |||||
.domain_factor_domain(); | |||||
} | } | ||||
isl::union_set polly::convertZoneToTimepoints(isl::union_set Zone, | isl::union_set polly::convertZoneToTimepoints(isl::union_set Zone, | ||||
bool InclStart, bool InclEnd) { | bool InclStart, bool InclEnd) { | ||||
if (!InclStart && InclEnd) | if (!InclStart && InclEnd) | ||||
return Zone; | return Zone; | ||||
auto ShiftedZone = shiftDim(Zone, -1, -1); | auto ShiftedZone = shiftDim(Zone, -1, -1); | ||||
▲ Show 20 Lines • Show All 122 Lines • Show Last 20 Lines |