diff options
author | David L. Jones <dlj@google.com> | 2019-08-19 07:16:24 +0000 |
---|---|---|
committer | David L. Jones <dlj@google.com> | 2019-08-19 07:16:24 +0000 |
commit | b1752f670f3d6393306dd5d37546b6e23384d8a2 (patch) | |
tree | d0083fd6c7a4da52ed0c09efaed9af3a06474874 | |
parent | 0697bcd1276111e2917b090cde8535ee2f61fbe0 (diff) | |
download | bcm5719-llvm-b1752f670f3d6393306dd5d37546b6e23384d8a2.tar.gz bcm5719-llvm-b1752f670f3d6393306dd5d37546b6e23384d8a2.zip |
Revert [Attributor] Fix: Do not partially resolve returned calls.
This reverts r369160 (git commit f72d9b1c97b41fff48ad1eecbba59a29c171bff4)
r369160 caused some tests to fail under UBSAN. See thread on llvm-commits.
llvm-svn: 369236
-rw-r--r-- | llvm/lib/Transforms/IPO/Attributor.cpp | 39 |
1 files changed, 11 insertions, 28 deletions
diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp index 62ec3937dcf..882d0931f9f 100644 --- a/llvm/lib/Transforms/IPO/Attributor.cpp +++ b/llvm/lib/Transforms/IPO/Attributor.cpp @@ -943,35 +943,12 @@ ChangeStatus AAReturnedValuesImpl::updateImpl(Attributor &A) { << static_cast<const AbstractAttribute &>(RetValAA) << "\n"); - // 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; + // 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()); + // Now track transitively returned values. for (auto &RetValAAIt : RetValAA.returned_values()) { Value *RetVal = RetValAAIt.first; if (Argument *Arg = dyn_cast<Argument>(RetVal)) { @@ -990,6 +967,12 @@ 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); } } |