summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorJohannes Doerfert <jdoerfert@anl.gov>2019-09-04 16:16:13 +0000
committerJohannes Doerfert <jdoerfert@anl.gov>2019-09-04 16:16:13 +0000
commitb0412e437c3f505c836f3338afb45dff73e7c709 (patch)
treee58722aeb344034593063bb8840f2e5a6022d11c /llvm/lib/Transforms
parentcc5b509b9edacf7fa9af455b69af1f4357a668db (diff)
downloadbcm5719-llvm-b0412e437c3f505c836f3338afb45dff73e7c709.tar.gz
bcm5719-llvm-b0412e437c3f505c836f3338afb45dff73e7c709.zip
[Attributor] Deal more explicit with non-exact definitions
Summary: Before we tried to rule out non-exact definitions early but that lead to on-demand attributes created for them anyway. As a consequence we needed to look at the definition in the initialize of each attribute again. This patch centralized this lookup and tightens the condition under which we give up on non-exact definitions. Reviewers: uenoku, sstefan1 Subscribers: hiraditya, bollu, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D67115 llvm-svn: 370917
Diffstat (limited to 'llvm/lib/Transforms')
-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