const DataLayout &getDataLayout() const { return InfoCache.DL; }
private:
+ /// Check \p Pred on all call sites of \p Fn.
+ ///
+ /// This method will evaluate \p Pred on call sites and return
+ /// true if \p Pred holds in every call sites. However, this is only possible
+ /// all call sites are known, hence the function has internal linkage.
+ bool checkForAllCallSites(const function_ref<bool(AbstractCallSite)> &Pred,
+ const Function &Fn, bool RequireAllCallSites,
+ const AbstractAttribute *QueryingAA);
+
/// The private version of getAAFor that allows to omit a querying abstract
/// attribute. See also the public getAAFor method.
template <typename AAType>
return false;
}
- if (RequireAllCallSites && !AssociatedFunction->hasLocalLinkage()) {
+ return checkForAllCallSites(Pred, *AssociatedFunction, RequireAllCallSites,
+ &QueryingAA);
+}
+
+bool Attributor::checkForAllCallSites(
+ const function_ref<bool(AbstractCallSite)> &Pred, const Function &Fn,
+ bool RequireAllCallSites, const AbstractAttribute *QueryingAA) {
+ if (RequireAllCallSites && !Fn.hasLocalLinkage()) {
LLVM_DEBUG(
dbgs()
- << "[Attributor] Function " << AssociatedFunction->getName()
+ << "[Attributor] Function " << Fn.getName()
<< " has no internal linkage, hence not all call sites are known\n");
return false;
}
- for (const Use &U : AssociatedFunction->uses()) {
+ for (const Use &U : Fn.uses()) {
AbstractCallSite ACS(&U);
if (!ACS) {
LLVM_DEBUG(dbgs() << "[Attributor] Function "
- << AssociatedFunction->getName()
+ << Fn.getName()
<< " has non call site use " << *U.get() << " in "
<< *U.getUser() << "\n");
return false;
Instruction *I = ACS.getInstruction();
Function *Caller = I->getFunction();
- const auto &LivenessAA =
- getAAFor<AAIsDead>(QueryingAA, IRPosition::function(*Caller),
+ const auto *LivenessAA =
+ lookupAAFor<AAIsDead>(IRPosition::function(*Caller), QueryingAA,
/* TrackDependence */ false);
// Skip dead calls.
- if (LivenessAA.isAssumedDead(I)) {
+ if (LivenessAA && LivenessAA->isAssumedDead(I)) {
// We actually used liveness information so we have to record a
// dependence.
- recordDependence(LivenessAA, QueryingAA);
+ if (QueryingAA)
+ recordDependence(*LivenessAA, *QueryingAA);
continue;
}
continue;
LLVM_DEBUG(dbgs() << "[Attributor] User " << EffectiveUse->getUser()
<< " is an invalid use of "
- << AssociatedFunction->getName() << "\n");
+ << Fn.getName() << "\n");
return false;
}