diff options
author | Siddharth Bhat <siddu.druid@gmail.com> | 2017-05-15 08:18:51 +0000 |
---|---|---|
committer | Siddharth Bhat <siddu.druid@gmail.com> | 2017-05-15 08:18:51 +0000 |
commit | 9746f817ea7a0fb7b4ccf277b6a63455456e9437 (patch) | |
tree | 011b383eb178c198a12c7701485265ebafb2d1ad | |
parent | 82b3d906bc2e141525b3e3e5dd24e60f5511de07 (diff) | |
download | bcm5719-llvm-9746f817ea7a0fb7b4ccf277b6a63455456e9437.tar.gz bcm5719-llvm-9746f817ea7a0fb7b4ccf277b6a63455456e9437.zip |
[Simplify] Fix r302986 that introduced non-inferrable templates.
- auto + decltype + template use was not inferrable in
`Transform/Simplify.cpp accessesInOrder`.
- changed code to explicitly construct required vector instead of using
higher order iterator helpers.
- Failing compiler spec:
Apple LLVM version 7.3.0 (clang-703.0.31)
Target: x86_64-apple-darwin15.6.0
llvm-svn: 303039
-rw-r--r-- | polly/lib/Transform/Simplify.cpp | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/polly/lib/Transform/Simplify.cpp b/polly/lib/Transform/Simplify.cpp index 920d835b6a2..b31634145f0 100644 --- a/polly/lib/Transform/Simplify.cpp +++ b/polly/lib/Transform/Simplify.cpp @@ -48,7 +48,7 @@ static bool isImplicitWrite(MemoryAccess *MA) { return MA->isWrite() && MA->isOriginalScalarKind(); } -/// Return an iterator range that iterates over MemoryAccesses in the order in +/// Return a vector that contains MemoryAccesses in the order in /// which they are executed. /// /// The order is: @@ -62,15 +62,23 @@ static bool isImplicitWrite(MemoryAccess *MA) { /// - Implicit writes (BlockGenerator::generateScalarStores) /// The order in which implicit writes are executed relative to each other is /// undefined. -static auto accessesInOrder(ScopStmt *Stmt) -> decltype(concat<MemoryAccess *>( - make_filter_range(make_range(Stmt->begin(), Stmt->end()), isImplicitRead), - make_filter_range(make_range(Stmt->begin(), Stmt->end()), isExplicitAccess), - make_filter_range(make_range(Stmt->begin(), Stmt->end()), - isImplicitWrite))) { - auto AllRange = make_range(Stmt->begin(), Stmt->end()); - return concat<MemoryAccess *>(make_filter_range(AllRange, isImplicitRead), - make_filter_range(AllRange, isExplicitAccess), - make_filter_range(AllRange, isImplicitWrite)); +static SmallVector<MemoryAccess *, 32> getAccessesInOrder(ScopStmt &Stmt) { + + SmallVector<MemoryAccess *, 32> Accesses; + + for (MemoryAccess *MemAcc : Stmt) + if (isImplicitRead(MemAcc)) + Accesses.push_back(MemAcc); + + for (MemoryAccess *MemAcc : Stmt) + if (isExplicitAccess(MemAcc)) + Accesses.push_back(MemAcc); + + for (MemoryAccess *MemAcc : Stmt) + if (isImplicitWrite(MemAcc)) + Accesses.push_back(MemAcc); + + return Accesses; } class Simplify : public ScopPass { @@ -175,9 +183,7 @@ private: isl::union_map WillBeOverwritten = isl::union_map::empty(give(S->getParamSpace())); - auto AccRange = accessesInOrder(&Stmt); - SmallVector<MemoryAccess *, 32> Accesses{AccRange.begin(), - AccRange.end()}; + SmallVector<MemoryAccess *, 32> Accesses(getAccessesInOrder(Stmt)); // Iterate in reverse order, so the overwrite comes before the write that // is to be removed. |