[polly] r292137 - ScopInfo: Do not modify the original alias group [NFC]
Tobias Grosser via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 16 07:49:04 PST 2017
Author: grosser
Date: Mon Jan 16 09:49:04 2017
New Revision: 292137
URL: http://llvm.org/viewvc/llvm-project?rev=292137&view=rev
Log:
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.
Modified:
polly/trunk/lib/Analysis/ScopInfo.cpp
Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=292137&r1=292136&r2=292137&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
+++ polly/trunk/lib/Analysis/ScopInfo.cpp Mon Jan 16 09:49:04 2017
@@ -2160,10 +2160,17 @@ static __isl_give isl_set *getAccessDoma
}
/// 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(AliasAnalysi
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(AliasAnalysi
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());
- // AG contains only non read only accesses.
- for (MemoryAccess *MA : AG)
- Accesses = isl_union_map_add_map(Accesses, MA->getAccessRelation());
+ bool Valid;
+ Valid = calculateMinMaxAccess(ReadWriteAccesses, *this,
+ MinMaxAccessesNonReadOnly);
- 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;
More information about the llvm-commits
mailing list