Skip to content

Commit 18d9f7e

Browse files
committed
[Attributor] Port AANoReturn to the isImpliedByIR interface
1 parent c272728 commit 18d9f7e

File tree

3 files changed

+21
-23
lines changed

3 files changed

+21
-23
lines changed

llvm/include/llvm/Transforms/IPO/Attributor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6048,6 +6048,7 @@ bool hasAssumedIRAttr(Attributor &A, const AbstractAttribute *QueryingAA,
60486048
CASE(NoFree, AANoFree, );
60496049
CASE(NoCapture, AANoCapture, );
60506050
CASE(NoRecurse, AANoRecurse, );
6051+
CASE(NoReturn, AANoReturn, );
60516052
CASE(NoSync, AANoSync, );
60526053
CASE(NoAlias, AANoAlias, );
60536054
CASE(NonNull, AANonNull, );

llvm/lib/Transforms/IPO/Attributor.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3291,8 +3291,7 @@ void Attributor::identifyDefaultAbstractAttributes(Function &F) {
32913291
checkAndQueryIRAttr<Attribute::NoFree, AANoFree>(FPos, FnAttrs);
32923292

32933293
// Every function might be "no-return".
3294-
if (!Attrs.hasFnAttr(Attribute::NoReturn))
3295-
getOrCreateAAFor<AANoReturn>(FPos);
3294+
checkAndQueryIRAttr<Attribute::NoReturn, AANoReturn>(FPos, FnAttrs);
32963295

32973296
// Every function might be "no-recurse".
32983297
if (!Attrs.hasFnAttr(Attribute::NoRecurse))

llvm/lib/Transforms/IPO/AttributorAttributes.cpp

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4735,9 +4735,10 @@ struct AAIsDeadFunction : public AAIsDead {
47354735
auto *CB = dyn_cast<CallBase>(DeadEndI);
47364736
if (!CB)
47374737
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);
47414742
if (MayReturn && (!Invoke2CallAllowed || !isa<InvokeInst>(CB)))
47424743
continue;
47434744

@@ -4860,10 +4861,10 @@ identifyAliveSuccessors(Attributor &A, const CallBase &CB,
48604861
SmallVectorImpl<const Instruction *> &AliveSuccessors) {
48614862
const IRPosition &IPos = IRPosition::callsite_function(CB);
48624863

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;
48674868
if (CB.isTerminator())
48684869
AliveSuccessors.push_back(&CB.getSuccessor(0)->front());
48694870
else
@@ -5646,6 +5647,13 @@ namespace {
56465647
struct AANoReturnImpl : public AANoReturn {
56475648
AANoReturnImpl(const IRPosition &IRP, Attributor &A) : AANoReturn(IRP, A) {}
56485649

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+
56495657
/// See AbstractAttribute::getAsStr().
56505658
const std::string getAsStr(Attributor *A) const override {
56515659
return getAssumed() ? "noreturn" : "may-return";
@@ -5676,17 +5684,6 @@ struct AANoReturnCallSite final : AANoReturnImpl {
56765684
AANoReturnCallSite(const IRPosition &IRP, Attributor &A)
56775685
: AANoReturnImpl(IRP, A) {}
56785686

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-
56905687
/// See AbstractAttribute::updateImpl(...).
56915688
ChangeStatus updateImpl(Attributor &A) override {
56925689
// TODO: Once we have call site specific value information we can provide
@@ -5695,10 +5692,11 @@ struct AANoReturnCallSite final : AANoReturnImpl {
56955692
// redirecting requests to the callee argument.
56965693
Function *F = getAssociatedFunction();
56975694
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))
57005698
return indicatePessimisticFixpoint();
5701-
return clampStateAndIndicateChange(getState(), FnAA->getState());
5699+
return ChangeStatus::UNCHANGED;
57025700
}
57035701

57045702
/// See AbstractAttribute::trackStatistics()

0 commit comments

Comments
 (0)