From b1752f670f3d6393306dd5d37546b6e23384d8a2 Mon Sep 17 00:00:00 2001 From: "David L. Jones" Date: Mon, 19 Aug 2019 07:16:24 +0000 Subject: [PATCH] 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 --- llvm/lib/Transforms/IPO/Attributor.cpp | 39 ++++++++++------------------------ 1 file changed, 11 insertions(+), 28 deletions(-) diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp index 62ec393..882d093 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(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(RetVal) || isa(RetVal) || - isa(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(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); } } -- 2.7.4