@@ -4735,9 +4735,10 @@ struct AAIsDeadFunction : public AAIsDead {
4735
4735
auto *CB = dyn_cast<CallBase>(DeadEndI);
4736
4736
if (!CB)
4737
4737
continue ;
4738
- const auto *NoReturnAA = A.getAndUpdateAAFor <AANoReturn>(
4739
- *this , IRPosition::callsite_function (*CB), DepClassTy::OPTIONAL);
4740
- bool MayReturn = !NoReturnAA || !NoReturnAA->isAssumedNoReturn ();
4738
+ bool IsKnownNoReturn;
4739
+ bool MayReturn = !AA::hasAssumedIRAttr<Attribute::NoReturn>(
4740
+ A, this , IRPosition::callsite_function (*CB), DepClassTy::OPTIONAL,
4741
+ IsKnownNoReturn);
4741
4742
if (MayReturn && (!Invoke2CallAllowed || !isa<InvokeInst>(CB)))
4742
4743
continue ;
4743
4744
@@ -4860,10 +4861,10 @@ identifyAliveSuccessors(Attributor &A, const CallBase &CB,
4860
4861
SmallVectorImpl<const Instruction *> &AliveSuccessors) {
4861
4862
const IRPosition &IPos = IRPosition::callsite_function (CB);
4862
4863
4863
- const auto *NoReturnAA =
4864
- A. getAndUpdateAAFor <AANoReturn> (AA, IPos, DepClassTy::OPTIONAL);
4865
- if (NoReturnAA && NoReturnAA-> isAssumedNoReturn ( ))
4866
- return !NoReturnAA-> isKnownNoReturn () ;
4864
+ bool IsKnownNoReturn;
4865
+ if (AA::hasAssumedIRAttr<Attribute::NoReturn>(
4866
+ A, &AA, IPos, DepClassTy::OPTIONAL, IsKnownNoReturn ))
4867
+ return !IsKnownNoReturn ;
4867
4868
if (CB.isTerminator ())
4868
4869
AliveSuccessors.push_back (&CB.getSuccessor (0 )->front ());
4869
4870
else
@@ -5646,6 +5647,13 @@ namespace {
5646
5647
struct AANoReturnImpl : public AANoReturn {
5647
5648
AANoReturnImpl (const IRPosition &IRP, Attributor &A) : AANoReturn(IRP, A) {}
5648
5649
5650
+ // / See AbstractAttribute::initialize(...).
5651
+ void initialize (Attributor &A) override {
5652
+ bool IsKnown;
5653
+ assert (!AA::hasAssumedIRAttr<Attribute::NoReturn>(
5654
+ A, nullptr , getIRPosition (), DepClassTy::NONE, IsKnown));
5655
+ }
5656
+
5649
5657
// / See AbstractAttribute::getAsStr().
5650
5658
const std::string getAsStr (Attributor *A) const override {
5651
5659
return getAssumed () ? " noreturn" : " may-return" ;
@@ -5676,17 +5684,6 @@ struct AANoReturnCallSite final : AANoReturnImpl {
5676
5684
AANoReturnCallSite (const IRPosition &IRP, Attributor &A)
5677
5685
: AANoReturnImpl(IRP, A) {}
5678
5686
5679
- // / See AbstractAttribute::initialize(...).
5680
- void initialize (Attributor &A) override {
5681
- AANoReturnImpl::initialize (A);
5682
- if (Function *F = getAssociatedFunction ()) {
5683
- const IRPosition &FnPos = IRPosition::function (*F);
5684
- auto *FnAA = A.getAAFor <AANoReturn>(*this , FnPos, DepClassTy::REQUIRED);
5685
- if (!FnAA || !FnAA->isAssumedNoReturn ())
5686
- indicatePessimisticFixpoint ();
5687
- }
5688
- }
5689
-
5690
5687
// / See AbstractAttribute::updateImpl(...).
5691
5688
ChangeStatus updateImpl (Attributor &A) override {
5692
5689
// TODO: Once we have call site specific value information we can provide
@@ -5695,10 +5692,11 @@ struct AANoReturnCallSite final : AANoReturnImpl {
5695
5692
// redirecting requests to the callee argument.
5696
5693
Function *F = getAssociatedFunction ();
5697
5694
const IRPosition &FnPos = IRPosition::function (*F);
5698
- auto *FnAA = A.getAAFor <AANoReturn>(*this , FnPos, DepClassTy::REQUIRED);
5699
- if (!FnAA)
5695
+ bool IsKnownNoReturn;
5696
+ if (!AA::hasAssumedIRAttr<Attribute::NoReturn>(
5697
+ A, this , FnPos, DepClassTy::REQUIRED, IsKnownNoReturn))
5700
5698
return indicatePessimisticFixpoint ();
5701
- return clampStateAndIndicateChange ( getState (), FnAA-> getState ()) ;
5699
+ return ChangeStatus::UNCHANGED ;
5702
5700
}
5703
5701
5704
5702
// / See AbstractAttribute::trackStatistics()
0 commit comments