diff options
| author | Johannes Doerfert <jdoerfert@anl.gov> | 2019-08-19 21:35:31 +0000 |
|---|---|---|
| committer | Johannes Doerfert <jdoerfert@anl.gov> | 2019-08-19 21:35:31 +0000 |
| commit | de7674ce76e06971e46e7ba7bef55fb3394e5102 (patch) | |
| tree | f426aeff5861de26b072eade2075796f17c4a274 /llvm/lib/Transforms | |
| parent | 12bd490427d7d19425ba1a7e5c55c3b22d8aa61d (diff) | |
| download | bcm5719-llvm-de7674ce76e06971e46e7ba7bef55fb3394e5102.tar.gz bcm5719-llvm-de7674ce76e06971e46e7ba7bef55fb3394e5102.zip | |
Recommit "[Attributor] Fix: Do not partially resolve returned calls."
This reverts commit b1752f670f3d6393306dd5d37546b6e23384d8a2.
Fixed the issue with a different commit, reapply this one as it was,
afaik, not broken.
llvm-svn: 369303
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/IPO/Attributor.cpp | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp index 34fe5552a40..5ad9d4cb977 100644 --- a/llvm/lib/Transforms/IPO/Attributor.cpp +++ b/llvm/lib/Transforms/IPO/Attributor.cpp @@ -943,12 +943,35 @@ ChangeStatus AAReturnedValuesImpl::updateImpl(Attributor &A) { << static_cast<const AbstractAttribute &>(RetValAA) << "\n"); - // If we know something but not everyting about the returned values, keep - // track of that too. Hence, remember transitively unresolved calls. - UnresolvedCalls.insert(RetValAA.getUnresolvedCalls().begin(), - RetValAA.getUnresolvedCalls().end()); + // Do not try to learn partial information. If the callee has unresolved + // return values we will treat the call as unresolved/opaque. + auto &RetValAAUnresolvedCalls = RetValAA.getUnresolvedCalls(); + if (!RetValAAUnresolvedCalls.empty()) { + UnresolvedCalls.insert(CB); + continue; + } + + // Now check if we can track transitively returned values. If possible, thus + // if all return value can be represented in the current scope, do so. + bool Unresolved = false; + for (auto &RetValAAIt : RetValAA.returned_values()) { + Value *RetVal = RetValAAIt.first; + if (isa<Argument>(RetVal) || isa<CallBase>(RetVal) || + isa<Constant>(RetVal)) + continue; + // Anything that did not fit in the above categories cannot be resolved, + // mark the call as unresolved. + LLVM_DEBUG(dbgs() << "[AAReturnedValues] transitively returned value " + "cannot be translated: " + << *RetVal << "\n"); + UnresolvedCalls.insert(CB); + Unresolved = true; + break; + } + + if (Unresolved) + continue; - // Now track transitively returned values. for (auto &RetValAAIt : RetValAA.returned_values()) { Value *RetVal = RetValAAIt.first; if (Argument *Arg = dyn_cast<Argument>(RetVal)) { @@ -967,12 +990,6 @@ ChangeStatus AAReturnedValuesImpl::updateImpl(Attributor &A) { NewRVsMap[RetVal].insert(It.second.begin(), It.second.end()); continue; } - // Anything that did not fit in the above categories cannot be resolved, - // mark the call as unresolved. - LLVM_DEBUG(dbgs() << "[AAReturnedValues] transitively returned value " - "cannot be translated: " - << *RetVal << "\n"); - UnresolvedCalls.insert(CB); } } |

