diff options
| -rw-r--r-- | polly/include/polly/ScopInfo.h | 2 | ||||
| -rw-r--r-- | polly/lib/Analysis/ScopInfo.cpp | 44 | ||||
| -rw-r--r-- | polly/lib/CodeGen/IslAst.cpp | 16 |
3 files changed, 27 insertions, 35 deletions
diff --git a/polly/include/polly/ScopInfo.h b/polly/include/polly/ScopInfo.h index 0fa8aaaa5f8..22aa9957d9d 100644 --- a/polly/include/polly/ScopInfo.h +++ b/polly/include/polly/ScopInfo.h @@ -715,7 +715,7 @@ public: /// @brief Pair of minimal/maximal access vectors representing /// read write and read only accesses - using MinMaxVectorPairTy = std::pair<MinMaxVectorTy *, MinMaxVectorTy *>; + using MinMaxVectorPairTy = std::pair<MinMaxVectorTy, MinMaxVectorTy>; /// @brief Vector of pair of minimal/maximal access vectors representing /// non read only and read only accesses for each alias group. diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index e66245e4f29..19a5316d481 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -1469,7 +1469,7 @@ static __isl_give isl_set *getAccessDomain(MemoryAccess *MA) { static bool calculateMinMaxAccess(__isl_take isl_union_map *Accesses, __isl_take isl_union_set *Domains, __isl_take isl_set *AssumedContext, - Scop::MinMaxVectorTy *MinMaxAccesses) { + Scop::MinMaxVectorTy &MinMaxAccesses) { Accesses = isl_union_map_intersect_domain(Accesses, Domains); isl_union_set *Locations = isl_union_map_range(Accesses); @@ -1477,7 +1477,7 @@ static bool calculateMinMaxAccess(__isl_take isl_union_map *Accesses, Locations = isl_union_set_coalesce(Locations); Locations = isl_union_set_detect_equalities(Locations); bool Valid = (0 == isl_union_set_foreach_set(Locations, buildMinMaxAccess, - MinMaxAccesses)); + &MinMaxAccesses)); isl_union_set_free(Locations); return Valid; } @@ -1594,8 +1594,11 @@ bool Scop::buildAliasGroups(AliasAnalysis &AA) { } // Calculate minimal and maximal accesses for non read only accesses. - MinMaxVectorTy *MinMaxAccessesNonReadOnly = new MinMaxVectorTy(); - MinMaxAccessesNonReadOnly->reserve(AG.size()); + 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()); @@ -1609,19 +1612,12 @@ bool Scop::buildAliasGroups(AliasAnalysis &AA) { // Bail out if the number of values we need to compare is too large. // This is important as the number of comparisions grows quadratically with // the number of values we need to compare. - if (!Valid || (MinMaxAccessesNonReadOnly->size() + !ReadOnlyPairs.empty() > - RunTimeChecksMaxArraysPerGroup)) { - for (MinMaxAccessTy &MMA : *(MinMaxAccessesNonReadOnly)) { - isl_pw_multi_aff_free(MMA.first); - isl_pw_multi_aff_free(MMA.second); - } + if (!Valid || (MinMaxAccessesNonReadOnly.size() + !ReadOnlyPairs.empty() > + RunTimeChecksMaxArraysPerGroup)) return false; - } // Calculate minimal and maximal accesses for read only accesses. - MinMaxVectorTy *MinMaxAccessesReadOnly = new MinMaxVectorTy(); - MinMaxAccessesReadOnly->reserve(ReadOnlyPairs.size()); - + MinMaxAccessesReadOnly.reserve(ReadOnlyPairs.size()); Accesses = isl_union_map_empty(getParamSpace()); for (const auto &ReadOnlyPair : ReadOnlyPairs) @@ -1630,8 +1626,6 @@ bool Scop::buildAliasGroups(AliasAnalysis &AA) { Valid = calculateMinMaxAccess(Accesses, getDomains(), getAssumedContext(), MinMaxAccessesReadOnly); - MinMaxVectorPairTy pair(MinMaxAccessesNonReadOnly, MinMaxAccessesReadOnly); - MinMaxAliasGroups.push_back(pair); if (!Valid) return false; @@ -1698,16 +1692,14 @@ Scop::~Scop() { // Free the alias groups for (MinMaxVectorPairTy &MinMaxAccessPair : MinMaxAliasGroups) { - for (MinMaxAccessTy &MMA : *(MinMaxAccessPair.first)) { + for (MinMaxAccessTy &MMA : MinMaxAccessPair.first) { isl_pw_multi_aff_free(MMA.first); isl_pw_multi_aff_free(MMA.second); } - for (MinMaxAccessTy &MMA : *(MinMaxAccessPair.second)) { + for (MinMaxAccessTy &MMA : MinMaxAccessPair.second) { isl_pw_multi_aff_free(MMA.first); isl_pw_multi_aff_free(MMA.second); } - delete MinMaxAccessPair.first; - delete MinMaxAccessPair.second; } } @@ -1789,10 +1781,10 @@ void Scop::printContext(raw_ostream &OS) const { void Scop::printAliasAssumptions(raw_ostream &OS) const { int noOfGroups = 0; for (const MinMaxVectorPairTy &Pair : MinMaxAliasGroups) { - if (Pair.second->size() == 0) + if (Pair.second.size() == 0) noOfGroups += 1; else - noOfGroups += Pair.second->size(); + noOfGroups += Pair.second.size(); } OS.indent(4) << "Alias Groups (" << noOfGroups << "):\n"; @@ -1804,19 +1796,19 @@ void Scop::printAliasAssumptions(raw_ostream &OS) const { for (const MinMaxVectorPairTy &Pair : MinMaxAliasGroups) { // If the group has no read only accesses print the write accesses. - if (Pair.second->empty()) { + if (Pair.second.empty()) { OS.indent(8) << "[["; - for (MinMaxAccessTy &MMANonReadOnly : *(Pair.first)) { + for (const MinMaxAccessTy &MMANonReadOnly : Pair.first) { OS << " <" << MMANonReadOnly.first << ", " << MMANonReadOnly.second << ">"; } OS << " ]]\n"; } - for (MinMaxAccessTy &MMAReadOnly : *(Pair.second)) { + for (const MinMaxAccessTy &MMAReadOnly : Pair.second) { OS.indent(8) << "[["; OS << " <" << MMAReadOnly.first << ", " << MMAReadOnly.second << ">"; - for (MinMaxAccessTy &MMANonReadOnly : *(Pair.first)) { + for (const MinMaxAccessTy &MMANonReadOnly : Pair.first) { OS << " <" << MMANonReadOnly.first << ", " << MMANonReadOnly.second << ">"; } diff --git a/polly/lib/CodeGen/IslAst.cpp b/polly/lib/CodeGen/IslAst.cpp index 66b3f2995ad..12effd1eb91 100644 --- a/polly/lib/CodeGen/IslAst.cpp +++ b/polly/lib/CodeGen/IslAst.cpp @@ -304,9 +304,9 @@ static __isl_give isl_ast_node *AtEachDomain(__isl_take isl_ast_node *Node, } // Build alias check condition given a pair of minimal/maximal access. -static __isl_give isl_ast_expr *buildCondition(__isl_keep isl_ast_build *Build, - Scop::MinMaxAccessTy *It0, - Scop::MinMaxAccessTy *It1) { +static __isl_give isl_ast_expr * +buildCondition(__isl_keep isl_ast_build *Build, const Scop::MinMaxAccessTy *It0, + const Scop::MinMaxAccessTy *It1) { isl_ast_expr *NonAliasGroup, *MinExpr, *MaxExpr; MinExpr = isl_ast_expr_address_of(isl_ast_build_access_from_pw_multi_aff( Build, isl_pw_multi_aff_copy(It0->first))); @@ -334,16 +334,16 @@ void IslAst::buildRunCondition(__isl_keep isl_ast_build *Build) { // This operation is by construction quadratic in the read-write pointers and // linear int the read only pointers in each alias group. for (const Scop::MinMaxVectorPairTy &MinMaxAccessPair : S->getAliasGroups()) { - auto *MinMaxReadWrite = MinMaxAccessPair.first; - auto *MinMaxReadOnly = MinMaxAccessPair.second; - auto RWAccEnd = MinMaxReadWrite->end(); + auto &MinMaxReadWrite = MinMaxAccessPair.first; + auto &MinMaxReadOnly = MinMaxAccessPair.second; + auto RWAccEnd = MinMaxReadWrite.end(); - for (auto RWAccIt0 = MinMaxReadWrite->begin(); RWAccIt0 != RWAccEnd; + for (auto RWAccIt0 = MinMaxReadWrite.begin(); RWAccIt0 != RWAccEnd; ++RWAccIt0) { for (auto RWAccIt1 = RWAccIt0 + 1; RWAccIt1 != RWAccEnd; ++RWAccIt1) RunCondition = isl_ast_expr_and( RunCondition, buildCondition(Build, RWAccIt0, RWAccIt1)); - for (Scop::MinMaxAccessTy &ROAccIt : *MinMaxReadOnly) + for (const Scop::MinMaxAccessTy &ROAccIt : MinMaxReadOnly) RunCondition = isl_ast_expr_and( RunCondition, buildCondition(Build, RWAccIt0, &ROAccIt)); } |

