diff options
author | Michael Kruse <llvm@meinersbur.de> | 2018-05-31 22:44:23 +0000 |
---|---|---|
committer | Michael Kruse <llvm@meinersbur.de> | 2018-05-31 22:44:23 +0000 |
commit | d51fbfca46ca75ff70daba3661702257703a331b (patch) | |
tree | 914863be2392431b29b6f7ed3f47bd4402b082b8 | |
parent | 91ab25bbe3802c6c67060e3fc5065cb8b7147f0f (diff) | |
download | bcm5719-llvm-d51fbfca46ca75ff70daba3661702257703a331b.tar.gz bcm5719-llvm-d51fbfca46ca75ff70daba3661702257703a331b.zip |
[ZoneAlgo] Make ZoneAlgorithm::isNormalized out-of-quota safe.
The aosp-O3-polly-before-vectorizer-unprofitable buildbot currently
fails in ZoneAlgorithm::isNormalized, presumably because an
out-of-quota happens in that function.
Modify ZoneAlgorithm::isNormalized to return an isl::boolean such
it can report an error.
In the failing case, it was called in an assertion in ForwardOpTree.
Allow to pass the assertion in an out-of-quota event, a condition that
is later checked before forwarding an operand tree.
llvm-svn: 333709
-rw-r--r-- | polly/include/polly/ZoneAlgo.h | 4 | ||||
-rw-r--r-- | polly/lib/Transform/ForwardOpTree.cpp | 3 | ||||
-rw-r--r-- | polly/lib/Transform/ZoneAlgo.cpp | 30 |
3 files changed, 23 insertions, 14 deletions
diff --git a/polly/include/polly/ZoneAlgo.h b/polly/include/polly/ZoneAlgo.h index 43a9da9eb32..5f009c8befc 100644 --- a/polly/include/polly/ZoneAlgo.h +++ b/polly/include/polly/ZoneAlgo.h @@ -336,8 +336,8 @@ protected: /// should have been replaced by their incoming values. /// /// @see #NormalizedPHI - bool isNormalized(isl::map Map); - bool isNormalized(isl::union_map Map); + isl::boolean isNormalized(isl::map Map); + isl::boolean isNormalized(isl::union_map Map); /// @} public: diff --git a/polly/lib/Transform/ForwardOpTree.cpp b/polly/lib/Transform/ForwardOpTree.cpp index 9a643916781..9c24170bcd5 100644 --- a/polly/lib/Transform/ForwardOpTree.cpp +++ b/polly/lib/Transform/ForwardOpTree.cpp @@ -500,7 +500,8 @@ public: // { DomainDef[] -> ValInst[] } isl::map ExpectedVal = makeValInst(Inst, UseStmt, UseLoop); - assert(isNormalized(ExpectedVal) && "LoadInsts are always normalized"); + assert(!isNormalized(ExpectedVal).is_false() && + "LoadInsts are always normalized"); // { DomainUse[] -> DomainTarget[] } isl::map UseToTarget = getDefToTarget(UseStmt, TargetStmt); diff --git a/polly/lib/Transform/ZoneAlgo.cpp b/polly/lib/Transform/ZoneAlgo.cpp index 2ad40d83d36..a34fcb37754 100644 --- a/polly/lib/Transform/ZoneAlgo.cpp +++ b/polly/lib/Transform/ZoneAlgo.cpp @@ -842,20 +842,26 @@ bool ZoneAlgorithm::isNormalizable(MemoryAccess *MA) { return true; } -bool ZoneAlgorithm::isNormalized(isl::map Map) { +isl::boolean ZoneAlgorithm::isNormalized(isl::map Map) { isl::space Space = Map.get_space(); isl::space RangeSpace = Space.range(); - if (!RangeSpace.is_wrapping()) - return true; + isl::boolean IsWrapping = RangeSpace.is_wrapping(); + if (!IsWrapping.is_true()) + return !IsWrapping; + isl::space Unwrapped = RangeSpace.unwrap(); - auto *PHI = dyn_cast<PHINode>(static_cast<Value *>( - RangeSpace.unwrap().get_tuple_id(isl::dim::out).get_user())); + isl::id OutTupleId = Unwrapped.get_tuple_id(isl::dim::out); + if (OutTupleId.is_null()) + return isl::boolean(); + auto *PHI = dyn_cast<PHINode>(static_cast<Value *>(OutTupleId.get_user())); if (!PHI) return true; - auto *IncomingStmt = static_cast<ScopStmt *>( - RangeSpace.unwrap().get_tuple_id(isl::dim::in).get_user()); + isl::id InTupleId = Unwrapped.get_tuple_id(isl::dim::in); + if (OutTupleId.is_null()) + return isl::boolean(); + auto *IncomingStmt = static_cast<ScopStmt *>(InTupleId.get_user()); MemoryAccess *PHIRead = IncomingStmt->lookupPHIReadOf(PHI); if (!isNormalizable(PHIRead)) return true; @@ -863,13 +869,15 @@ bool ZoneAlgorithm::isNormalized(isl::map Map) { return false; } -bool ZoneAlgorithm::isNormalized(isl::union_map UMap) { - auto Result = UMap.foreach_map([this](isl::map Map) -> isl::stat { - if (isNormalized(Map)) +isl::boolean ZoneAlgorithm::isNormalized(isl::union_map UMap) { + isl::boolean Result = true; + UMap.foreach_map([this, &Result](isl::map Map) -> isl::stat { + Result = isNormalized(Map); + if (Result.is_true()) return isl::stat::ok; return isl::stat::error; }); - return Result == isl::stat::ok; + return Result; } void ZoneAlgorithm::computeCommon() { |