[llvm] 18d9f7e - [Attributor] Port AANoReturn to the isImpliedByIR interface
Johannes Doerfert via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 9 16:05:08 PDT 2023
Author: Johannes Doerfert
Date: 2023-07-09T16:04:22-07:00
New Revision: 18d9f7ebbaa6022fb924c1607a0edc7ebe6ec8b8
URL: https://github.com/llvm/llvm-project/commit/18d9f7ebbaa6022fb924c1607a0edc7ebe6ec8b8
DIFF: https://github.com/llvm/llvm-project/commit/18d9f7ebbaa6022fb924c1607a0edc7ebe6ec8b8.diff
LOG: [Attributor] Port AANoReturn to the isImpliedByIR interface
Added:
Modified:
llvm/include/llvm/Transforms/IPO/Attributor.h
llvm/lib/Transforms/IPO/Attributor.cpp
llvm/lib/Transforms/IPO/AttributorAttributes.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Transforms/IPO/Attributor.h b/llvm/include/llvm/Transforms/IPO/Attributor.h
index 853d0ca40f5f34..aad19a8cf4a444 100644
--- a/llvm/include/llvm/Transforms/IPO/Attributor.h
+++ b/llvm/include/llvm/Transforms/IPO/Attributor.h
@@ -6048,6 +6048,7 @@ bool hasAssumedIRAttr(Attributor &A, const AbstractAttribute *QueryingAA,
CASE(NoFree, AANoFree, );
CASE(NoCapture, AANoCapture, );
CASE(NoRecurse, AANoRecurse, );
+ CASE(NoReturn, AANoReturn, );
CASE(NoSync, AANoSync, );
CASE(NoAlias, AANoAlias, );
CASE(NonNull, AANonNull, );
diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp
index ec0ca9eafc3fa3..732aa99923051c 100644
--- a/llvm/lib/Transforms/IPO/Attributor.cpp
+++ b/llvm/lib/Transforms/IPO/Attributor.cpp
@@ -3291,8 +3291,7 @@ void Attributor::identifyDefaultAbstractAttributes(Function &F) {
checkAndQueryIRAttr<Attribute::NoFree, AANoFree>(FPos, FnAttrs);
// Every function might be "no-return".
- if (!Attrs.hasFnAttr(Attribute::NoReturn))
- getOrCreateAAFor<AANoReturn>(FPos);
+ checkAndQueryIRAttr<Attribute::NoReturn, AANoReturn>(FPos, FnAttrs);
// Every function might be "no-recurse".
if (!Attrs.hasFnAttr(Attribute::NoRecurse))
diff --git a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
index 643818416af9a9..6f45d9497ddbb9 100644
--- a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
+++ b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
@@ -4735,9 +4735,10 @@ struct AAIsDeadFunction : public AAIsDead {
auto *CB = dyn_cast<CallBase>(DeadEndI);
if (!CB)
continue;
- const auto *NoReturnAA = A.getAndUpdateAAFor<AANoReturn>(
- *this, IRPosition::callsite_function(*CB), DepClassTy::OPTIONAL);
- bool MayReturn = !NoReturnAA || !NoReturnAA->isAssumedNoReturn();
+ bool IsKnownNoReturn;
+ bool MayReturn = !AA::hasAssumedIRAttr<Attribute::NoReturn>(
+ A, this, IRPosition::callsite_function(*CB), DepClassTy::OPTIONAL,
+ IsKnownNoReturn);
if (MayReturn && (!Invoke2CallAllowed || !isa<InvokeInst>(CB)))
continue;
@@ -4860,10 +4861,10 @@ identifyAliveSuccessors(Attributor &A, const CallBase &CB,
SmallVectorImpl<const Instruction *> &AliveSuccessors) {
const IRPosition &IPos = IRPosition::callsite_function(CB);
- const auto *NoReturnAA =
- A.getAndUpdateAAFor<AANoReturn>(AA, IPos, DepClassTy::OPTIONAL);
- if (NoReturnAA && NoReturnAA->isAssumedNoReturn())
- return !NoReturnAA->isKnownNoReturn();
+ bool IsKnownNoReturn;
+ if (AA::hasAssumedIRAttr<Attribute::NoReturn>(
+ A, &AA, IPos, DepClassTy::OPTIONAL, IsKnownNoReturn))
+ return !IsKnownNoReturn;
if (CB.isTerminator())
AliveSuccessors.push_back(&CB.getSuccessor(0)->front());
else
@@ -5646,6 +5647,13 @@ namespace {
struct AANoReturnImpl : public AANoReturn {
AANoReturnImpl(const IRPosition &IRP, Attributor &A) : AANoReturn(IRP, A) {}
+ /// See AbstractAttribute::initialize(...).
+ void initialize(Attributor &A) override {
+ bool IsKnown;
+ assert(!AA::hasAssumedIRAttr<Attribute::NoReturn>(
+ A, nullptr, getIRPosition(), DepClassTy::NONE, IsKnown));
+ }
+
/// See AbstractAttribute::getAsStr().
const std::string getAsStr(Attributor *A) const override {
return getAssumed() ? "noreturn" : "may-return";
@@ -5676,17 +5684,6 @@ struct AANoReturnCallSite final : AANoReturnImpl {
AANoReturnCallSite(const IRPosition &IRP, Attributor &A)
: AANoReturnImpl(IRP, A) {}
- /// See AbstractAttribute::initialize(...).
- void initialize(Attributor &A) override {
- AANoReturnImpl::initialize(A);
- if (Function *F = getAssociatedFunction()) {
- const IRPosition &FnPos = IRPosition::function(*F);
- auto *FnAA = A.getAAFor<AANoReturn>(*this, FnPos, DepClassTy::REQUIRED);
- if (!FnAA || !FnAA->isAssumedNoReturn())
- indicatePessimisticFixpoint();
- }
- }
-
/// See AbstractAttribute::updateImpl(...).
ChangeStatus updateImpl(Attributor &A) override {
// TODO: Once we have call site specific value information we can provide
@@ -5695,10 +5692,11 @@ struct AANoReturnCallSite final : AANoReturnImpl {
// redirecting requests to the callee argument.
Function *F = getAssociatedFunction();
const IRPosition &FnPos = IRPosition::function(*F);
- auto *FnAA = A.getAAFor<AANoReturn>(*this, FnPos, DepClassTy::REQUIRED);
- if (!FnAA)
+ bool IsKnownNoReturn;
+ if (!AA::hasAssumedIRAttr<Attribute::NoReturn>(
+ A, this, FnPos, DepClassTy::REQUIRED, IsKnownNoReturn))
return indicatePessimisticFixpoint();
- return clampStateAndIndicateChange(getState(), FnAA->getState());
+ return ChangeStatus::UNCHANGED;
}
/// See AbstractAttribute::trackStatistics()
More information about the llvm-commits
mailing list