diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp index 62ec3937dcfc..882d0931f9f4 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); } }