@@ -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