diff options
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/IPO/Attributor.cpp | 19 | 
1 files changed, 11 insertions, 8 deletions
| diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp index 7dfc802179c..ce720e4aff7 100644 --- a/llvm/lib/Transforms/IPO/Attributor.cpp +++ b/llvm/lib/Transforms/IPO/Attributor.cpp @@ -2859,6 +2859,14 @@ struct AAAlignCallSiteReturned final : AAAlignImpl {  struct AANoReturnImpl : public AANoReturn {    AANoReturnImpl(const IRPosition &IRP) : AANoReturn(IRP) {} +  /// See AbstractAttribute::initialize(...). +  void initialize(Attributor &A) override { +    AANoReturn::initialize(A); +    Function *F = getAssociatedFunction(); +    if (!F || F->hasFnAttribute(Attribute::WillReturn)) +      indicatePessimisticFixpoint(); +  } +    /// See AbstractAttribute::getAsStr().    const std::string getAsStr() const override {      return getAssumed() ? "noreturn" : "may-return"; @@ -2866,6 +2874,9 @@ struct AANoReturnImpl : public AANoReturn {    /// See AbstractAttribute::updateImpl(Attributor &A).    virtual ChangeStatus updateImpl(Attributor &A) override { +    const auto &WillReturnAA = A.getAAFor<AAWillReturn>(*this, getIRPosition()); +    if (WillReturnAA.isKnownWillReturn()) +      return indicatePessimisticFixpoint();      auto CheckForNoReturn = [](Instruction &) { return false; };      if (!A.checkForAllInstructions(CheckForNoReturn, *this,                                     {(unsigned)Instruction::Ret})) @@ -2885,14 +2896,6 @@ struct AANoReturnFunction final : AANoReturnImpl {  struct AANoReturnCallSite final : AANoReturnImpl {    AANoReturnCallSite(const IRPosition &IRP) : AANoReturnImpl(IRP) {} -  /// See AbstractAttribute::initialize(...). -  void initialize(Attributor &A) override { -    AANoReturnImpl::initialize(A); -    Function *F = getAssociatedFunction(); -    if (!F) -      indicatePessimisticFixpoint(); -  } -    /// See AbstractAttribute::updateImpl(...).    ChangeStatus updateImpl(Attributor &A) override {      // TODO: Once we have call site specific value information we can provide | 

