summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Transforms/IPO/Attributor.cpp105
1 files changed, 31 insertions, 74 deletions
diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp
index 808aae2afd7..580d8e32692 100644
--- a/llvm/lib/Transforms/IPO/Attributor.cpp
+++ b/llvm/lib/Transforms/IPO/Attributor.cpp
@@ -646,12 +646,6 @@ struct AACallSiteReturnedFromReturned : public Base {
struct AANoUnwindImpl : AANoUnwind {
AANoUnwindImpl(const IRPosition &IRP) : AANoUnwind(IRP) {}
- /// See AbstractAttribute::initialize(...).
- void initialize(Attributor &A) override {
- if (hasAttr({Attribute::NoUnwind}))
- indicateOptimisticFixpoint();
- }
-
const std::string getAsStr() const override {
return getAssumed() ? "nounwind" : "may-unwind";
}
@@ -697,7 +691,7 @@ struct AANoUnwindCallSite final : AANoUnwindImpl {
void initialize(Attributor &A) override {
AANoUnwindImpl::initialize(A);
Function *F = getAssociatedFunction();
- if (!F || !F->hasExactDefinition())
+ if (!F)
indicatePessimisticFixpoint();
}
@@ -757,7 +751,7 @@ public:
ReturnedValues.clear();
Function *F = getAssociatedFunction();
- if (!F || !F->hasExactDefinition()) {
+ if (!F) {
indicatePessimisticFixpoint();
return;
}
@@ -776,6 +770,9 @@ public:
return;
}
}
+
+ if (!F->hasExactDefinition())
+ indicatePessimisticFixpoint();
}
/// See AbstractAttribute::manifest(...).
@@ -1142,12 +1139,6 @@ struct AAReturnedValuesCallSite final : AAReturnedValuesImpl {
struct AANoSyncImpl : AANoSync {
AANoSyncImpl(const IRPosition &IRP) : AANoSync(IRP) {}
- /// See AbstractAttribute::initialize(...).
- void initialize(Attributor &A) override {
- if (hasAttr({Attribute::NoSync}))
- indicateOptimisticFixpoint();
- }
-
const std::string getAsStr() const override {
return getAssumed() ? "nosync" : "may-sync";
}
@@ -1315,7 +1306,7 @@ struct AANoSyncCallSite final : AANoSyncImpl {
void initialize(Attributor &A) override {
AANoSyncImpl::initialize(A);
Function *F = getAssociatedFunction();
- if (!F || !F->hasExactDefinition())
+ if (!F)
indicatePessimisticFixpoint();
}
@@ -1341,12 +1332,6 @@ struct AANoSyncCallSite final : AANoSyncImpl {
struct AANoFreeImpl : public AANoFree {
AANoFreeImpl(const IRPosition &IRP) : AANoFree(IRP) {}
- /// See AbstractAttribute::initialize(...).
- void initialize(Attributor &A) override {
- if (hasAttr({Attribute::NoFree}))
- indicateOptimisticFixpoint();
- }
-
/// See AbstractAttribute::updateImpl(...).
ChangeStatus updateImpl(Attributor &A) override {
auto CheckForNoFree = [&](Instruction &I) {
@@ -1385,7 +1370,7 @@ struct AANoFreeCallSite final : AANoFreeImpl {
void initialize(Attributor &A) override {
AANoFreeImpl::initialize(A);
Function *F = getAssociatedFunction();
- if (!F || !F->hasExactDefinition())
+ if (!F)
indicatePessimisticFixpoint();
}
@@ -1414,6 +1399,8 @@ struct AANonNullImpl : AANonNull {
void initialize(Attributor &A) override {
if (hasAttr({Attribute::NonNull, Attribute::Dereferenceable}))
indicateOptimisticFixpoint();
+ else
+ AANonNull::initialize(A);
}
/// See AbstractAttribute::getAsStr().
@@ -1519,14 +1506,6 @@ struct AANonNullCallSiteReturned final
struct AANoRecurseImpl : public AANoRecurse {
AANoRecurseImpl(const IRPosition &IRP) : AANoRecurse(IRP) {}
- /// See AbstractAttribute::initialize(...).
- void initialize(Attributor &A) override {
- if (hasAttr({getAttrKind()})) {
- indicateOptimisticFixpoint();
- return;
- }
- }
-
/// See AbstractAttribute::getAsStr()
const std::string getAsStr() const override {
return getAssumed() ? "norecurse" : "may-recurse";
@@ -1553,7 +1532,7 @@ struct AANoRecurseCallSite final : AANoRecurseImpl {
void initialize(Attributor &A) override {
AANoRecurseImpl::initialize(A);
Function *F = getAssociatedFunction();
- if (!F || !F->hasExactDefinition())
+ if (!F)
indicatePessimisticFixpoint();
}
@@ -1606,10 +1585,7 @@ struct AAWillReturnImpl : public AAWillReturn {
/// See AbstractAttribute::initialize(...).
void initialize(Attributor &A) override {
- if (hasAttr({Attribute::WillReturn})) {
- indicateOptimisticFixpoint();
- return;
- }
+ AAWillReturn::initialize(A);
Function *F = getAssociatedFunction();
if (containsPossiblyEndlessLoop(F))
@@ -1656,7 +1632,7 @@ struct AAWillReturnCallSite final : AAWillReturnImpl {
void initialize(Attributor &A) override {
AAWillReturnImpl::initialize(A);
Function *F = getAssociatedFunction();
- if (!F || !F->hasExactDefinition())
+ if (!F)
indicatePessimisticFixpoint();
}
@@ -1683,12 +1659,6 @@ struct AAWillReturnCallSite final : AAWillReturnImpl {
struct AANoAliasImpl : AANoAlias {
AANoAliasImpl(const IRPosition &IRP) : AANoAlias(IRP) {}
- /// See AbstractAttribute::initialize(...).
- void initialize(Attributor &A) override {
- if (hasAttr({Attribute::NoAlias}))
- indicateOptimisticFixpoint();
- }
-
const std::string getAsStr() const override {
return getAssumed() ? "noalias" : "may-alias";
}
@@ -1792,7 +1762,7 @@ struct AANoAliasCallSiteReturned final : AANoAliasImpl {
void initialize(Attributor &A) override {
AANoAliasImpl::initialize(A);
Function *F = getAssociatedFunction();
- if (!F || !F->hasExactDefinition())
+ if (!F)
indicatePessimisticFixpoint();
}
@@ -2186,6 +2156,12 @@ struct AADereferenceableImpl : AADereferenceable {
takeKnownDerefBytesMaximum(Attr.getValueAsInt());
NonNullAA = &A.getAAFor<AANonNull>(*this, getIRPosition());
+
+ const IRPosition &IRP = this->getIRPosition();
+ bool IsFnInterface = IRP.isFnInterfaceKind();
+ const Function *FnScope = IRP.getAnchorScope();
+ if (IsFnInterface && (!FnScope || !FnScope->hasExactDefinition()))
+ indicatePessimisticFixpoint();
}
/// See AbstractAttribute::getState()
@@ -2340,7 +2316,7 @@ struct AADereferenceableCallSiteReturned final : AADereferenceableImpl {
void initialize(Attributor &A) override {
AADereferenceableImpl::initialize(A);
Function *F = getAssociatedFunction();
- if (!F || !F->hasExactDefinition())
+ if (!F)
indicatePessimisticFixpoint();
}
@@ -2508,7 +2484,7 @@ struct AAAlignCallSiteReturned final : AAAlignImpl {
void initialize(Attributor &A) override {
AAAlignImpl::initialize(A);
Function *F = getAssociatedFunction();
- if (!F || !F->hasExactDefinition())
+ if (!F)
indicatePessimisticFixpoint();
}
@@ -2538,12 +2514,6 @@ struct AANoReturnImpl : public AANoReturn {
return getAssumed() ? "noreturn" : "may-return";
}
- /// See AbstractAttribute::initialize(...).
- void initialize(Attributor &A) override {
- if (hasAttr({getAttrKind()}))
- indicateOptimisticFixpoint();
- }
-
/// See AbstractAttribute::updateImpl(Attributor &A).
virtual ChangeStatus updateImpl(Attributor &A) override {
auto CheckForNoReturn = [](Instruction &) { return false; };
@@ -2569,7 +2539,7 @@ struct AANoReturnCallSite final : AANoReturnImpl {
void initialize(Attributor &A) override {
AANoReturnImpl::initialize(A);
Function *F = getAssociatedFunction();
- if (!F || !F->hasExactDefinition())
+ if (!F)
indicatePessimisticFixpoint();
}
@@ -2599,10 +2569,7 @@ struct AANoCaptureImpl : public AANoCapture {
/// See AbstractAttribute::initialize(...).
void initialize(Attributor &A) override {
- if (hasAttr(Attribute::NoCapture)) {
- indicateOptimisticFixpoint();
- return;
- }
+ AANoCapture::initialize(A);
const IRPosition &IRP = getIRPosition();
const Function *F =
@@ -2611,8 +2578,7 @@ struct AANoCaptureImpl : public AANoCapture {
// Check what state the associated function can actually capture.
if (F)
determineFunctionCaptureCapabilities(*F, *this);
-
- if (!F || !F->hasExactDefinition())
+ else
indicatePessimisticFixpoint();
}
@@ -2999,7 +2965,7 @@ bool Attributor::checkForAllCallSites(const function_ref<bool(CallSite)> &Pred,
}
CallSite CS(U.getUser());
- if (!CS || !CS.isCallee(&U) || !CS.getCaller()->hasExactDefinition()) {
+ if (!CS || !CS.isCallee(&U)) {
if (!RequireAllCallSites)
continue;
@@ -3029,7 +2995,7 @@ bool Attributor::checkForAllReturnedValuesAndReturnInsts(
// Since we need to provide return instructions we have to have an exact
// definition.
const Function *AssociatedFunction = IRP.getAssociatedFunction();
- if (!AssociatedFunction || !AssociatedFunction->hasExactDefinition())
+ if (!AssociatedFunction)
return false;
// If this is a call site query we use the call site specific return values
@@ -3049,7 +3015,7 @@ bool Attributor::checkForAllReturnedValues(
const IRPosition &IRP = QueryingAA.getIRPosition();
const Function *AssociatedFunction = IRP.getAssociatedFunction();
- if (!AssociatedFunction || !AssociatedFunction->hasExactDefinition())
+ if (!AssociatedFunction)
return false;
// TODO: use the function scope once we have call site AAReturnedValues.
@@ -3071,7 +3037,7 @@ bool Attributor::checkForAllInstructions(
const IRPosition &IRP = QueryingAA.getIRPosition();
// Since we need to provide instructions we have to have an exact definition.
const Function *AssociatedFunction = IRP.getAssociatedFunction();
- if (!AssociatedFunction || !AssociatedFunction->hasExactDefinition())
+ if (!AssociatedFunction)
return false;
// TODO: use the function scope once we have call site AAReturnedValues.
@@ -3576,25 +3542,16 @@ static bool runAttributorOnModule(Module &M) {
Attributor A(InfoCache, DepRecInterval);
for (Function &F : M) {
- // TODO: Not all attributes require an exact definition. Find a way to
- // enable deduction for some but not all attributes in case the
- // definition might be changed at runtime, see also
- // http://lists.llvm.org/pipermail/llvm-dev/2018-February/121275.html.
- // TODO: We could always determine abstract attributes and if sufficient
- // information was found we could duplicate the functions that do not
- // have an exact definition.
- if (!F.hasExactDefinition()) {
+ if (F.hasExactDefinition())
+ NumFnWithExactDefinition++;
+ else
NumFnWithoutExactDefinition++;
- continue;
- }
// For now we ignore naked and optnone functions.
if (F.hasFnAttribute(Attribute::Naked) ||
F.hasFnAttribute(Attribute::OptimizeNone))
continue;
- NumFnWithExactDefinition++;
-
// Populate the Attributor with abstract attribute opportunities in the
// function and the information cache with IR information.
A.identifyDefaultAbstractAttributes(F);
OpenPOWER on IntegriCloud