diff options
Diffstat (limited to 'llvm/lib/Transforms/IPO')
-rw-r--r-- | llvm/lib/Transforms/IPO/Attributor.cpp | 105 |
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); |