ScopInfo: Do not modify the original alias group [NFC]

Instead of modifying the original alias group and repurposing it as read-write
access group when splitting accesses in read-only and read-write accesses, we
just keep all three groups: the original alias group, the set of read-only
accesses and the set of read-write accesses.  This allows us to remove some
complicated iterator handling and also allows for more code-reuse in
calculateMinMaxAccess.

llvm-svn: 292137
This commit is contained in:
Tobias Grosser 2017-01-16 15:49:04 +00:00
parent a83a1a69c5
commit e95222343c
1 changed files with 23 additions and 37 deletions

View File

@ -2160,10 +2160,17 @@ static __isl_give isl_set *getAccessDomain(MemoryAccess *MA) {
}
/// Wrapper function to calculate minimal/maximal accesses to each array.
static bool calculateMinMaxAccess(__isl_take isl_union_map *Accesses,
__isl_take isl_union_set *Domains,
static bool calculateMinMaxAccess(Scop::AliasGroupTy AliasGroup, Scop &S,
Scop::MinMaxVectorTy &MinMaxAccesses) {
MinMaxAccesses.reserve(AliasGroup.size());
isl_union_set *Domains = S.getDomains();
isl_union_map *Accesses = isl_union_map_empty(S.getParamSpace());
for (MemoryAccess *MA : AliasGroup)
Accesses = isl_union_map_add_map(Accesses, MA->getAccessRelation());
Accesses = isl_union_map_intersect_domain(Accesses, Domains);
isl_union_set *Locations = isl_union_map_range(Accesses);
Locations = isl_union_set_coalesce(Locations);
@ -2979,24 +2986,24 @@ bool Scop::buildAliasGroups(AliasAnalysis &AA) {
auto &F = getFunction();
for (AliasGroupTy &AG : AliasGroups) {
AliasGroupTy ReadOnlyAccesses;
AliasGroupTy ReadWriteAccesses;
SmallPtrSet<const Value *, 4> NonReadOnlyBaseValues;
if (AG.size() < 2)
continue;
for (auto II = AG.begin(); II != AG.end();) {
for (MemoryAccess *Access : AG) {
emitOptimizationRemarkAnalysis(
F.getContext(), DEBUG_TYPE, F,
(*II)->getAccessInstruction()->getDebugLoc(),
Access->getAccessInstruction()->getDebugLoc(),
"Possibly aliasing pointer, use restrict keyword.");
Value *BaseAddr = (*II)->getBaseAddr();
Value *BaseAddr = Access->getBaseAddr();
if (HasWriteAccess.count(BaseAddr)) {
NonReadOnlyBaseValues.insert(BaseAddr);
II++;
ReadWriteAccesses.push_back(Access);
} else {
ReadOnlyAccesses.push_back(*II);
II = AG.erase(II);
ReadOnlyAccesses.push_back(Access);
}
}
@ -3020,49 +3027,28 @@ bool Scop::buildAliasGroups(AliasAnalysis &AA) {
addRequiredInvariantLoad(
cast<LoadInst>(BasePtrMA->getAccessInstruction()));
}
for (MemoryAccess *MA : ReadOnlyAccesses) {
if (!MA->isAffine()) {
invalidate(ALIASING, MA->getAccessInstruction()->getDebugLoc());
return false;
}
if (MemoryAccess *BasePtrMA = lookupBasePtrAccess(MA))
addRequiredInvariantLoad(
cast<LoadInst>(BasePtrMA->getAccessInstruction()));
}
// Calculate minimal and maximal accesses for non read only accesses.
MinMaxAliasGroups.emplace_back();
MinMaxVectorPairTy &pair = MinMaxAliasGroups.back();
MinMaxVectorTy &MinMaxAccessesNonReadOnly = pair.first;
MinMaxVectorTy &MinMaxAccessesReadOnly = pair.second;
MinMaxAccessesNonReadOnly.reserve(AG.size());
isl_union_map *Accesses = isl_union_map_empty(getParamSpace());
bool Valid;
Valid = calculateMinMaxAccess(ReadWriteAccesses, *this,
MinMaxAccessesNonReadOnly);
// AG contains only non read only accesses.
for (MemoryAccess *MA : AG)
Accesses = isl_union_map_add_map(Accesses, MA->getAccessRelation());
bool Valid = calculateMinMaxAccess(Accesses, getDomains(),
MinMaxAccessesNonReadOnly);
if (!Valid)
return false;
// Bail out if the number of values we need to compare is too large.
// This is important as the number of comparisons grows quadratically with
// the number of values we need to compare.
if (!Valid ||
(MinMaxAccessesNonReadOnly.size() + ReadOnlyAccesses.size() >
RunTimeChecksMaxArraysPerGroup))
if (MinMaxAccessesNonReadOnly.size() + ReadOnlyAccesses.size() >
RunTimeChecksMaxArraysPerGroup)
return false;
// Calculate minimal and maximal accesses for read only accesses.
MinMaxAccessesReadOnly.reserve(ReadOnlyAccesses.size());
Accesses = isl_union_map_empty(getParamSpace());
for (MemoryAccess *MA : ReadOnlyAccesses)
Accesses = isl_union_map_add_map(Accesses, MA->getAccessRelation());
Valid =
calculateMinMaxAccess(Accesses, getDomains(), MinMaxAccessesReadOnly);
calculateMinMaxAccess(ReadOnlyAccesses, *this, MinMaxAccessesReadOnly);
if (!Valid)
return false;