[llvm] 04f3a22 - [Attributor][NFC] Introduce a flag to distinguish the scope of a query
Johannes Doerfert via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 15 12:56:44 PDT 2022
Author: Johannes Doerfert
Date: 2022-04-15T14:56:10-05:00
New Revision: 04f3a224bc9d1dad631fa8efd69fc35d28488a65
URL: https://github.com/llvm/llvm-project/commit/04f3a224bc9d1dad631fa8efd69fc35d28488a65
DIFF: https://github.com/llvm/llvm-project/commit/04f3a224bc9d1dad631fa8efd69fc35d28488a65.diff
LOG: [Attributor][NFC] Introduce a flag to distinguish the scope of a query
Added:
Modified:
llvm/include/llvm/Transforms/IPO/Attributor.h
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 bf1f4e043d42c..a6ecb14ee6711 100644
--- a/llvm/include/llvm/Transforms/IPO/Attributor.h
+++ b/llvm/include/llvm/Transforms/IPO/Attributor.h
@@ -147,6 +147,14 @@ class Function;
/// Abstract Attribute helper functions.
namespace AA {
+/// Flags to distinguish intra-procedural queries from *potentially*
+/// inter-procedural queries. Not that information can be valid for both and
+/// therefore both bits might be set.
+enum ValueScope : uint8_t {
+ Intraprocedural = 1,
+ Interprocedural = 2,
+};
+
/// Return true if \p I is a `nosync` instruction. Use generic reasoning and
/// potentially the corresponding AANoSync.
bool isNoSyncInst(Attributor &A, const Instruction &I,
@@ -203,7 +211,7 @@ bool getAssumedUnderlyingObjects(Attributor &A, const Value &Ptr,
const AbstractAttribute &QueryingAA,
const Instruction *CtxI,
bool &UsedAssumedInformation,
- bool Intraprocedural = false);
+ AA::ValueScope VS = Interprocedural);
/// Collect all potential values \p LI could read into \p PotentialValues. That
/// is, the only values read by \p LI are assumed to be known and all are in
diff --git a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
index 5b9dea2a3fa17..b8f3e124eb022 100644
--- a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
+++ b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
@@ -262,8 +262,9 @@ static Value *constructPointer(Type *ResTy, Type *PtrElemTy, Value *Ptr,
/// once. Note that the value used for the callback may still be the value
/// associated with \p IRP (due to PHIs). To limit how much effort is invested,
/// we will never visit more values than specified by \p MaxValues.
-/// If \p Intraprocedural is set to true only values valid in the scope of
-/// \p CtxI will be visited and simplification into other scopes is prevented.
+/// If \p VS does not contain the Interprocedural bit, only values valid in the
+/// scope of \p CtxI will be visited and simplification into other scopes is
+/// prevented.
template <typename StateTy>
static bool genericValueTraversal(
Attributor &A, IRPosition IRP, const AbstractAttribute &QueryingAA,
@@ -273,7 +274,7 @@ static bool genericValueTraversal(
const Instruction *CtxI, bool &UsedAssumedInformation,
bool UseValueSimplify = true, int MaxValues = 16,
function_ref<Value *(Value *)> StripCB = nullptr,
- bool Intraprocedural = false) {
+ AA::ValueScope VS = AA::Interprocedural) {
struct LivenessInfo {
const AAIsDead *LivenessAA = nullptr;
@@ -371,7 +372,7 @@ static bool genericValueTraversal(
}
if (auto *Arg = dyn_cast<Argument>(V)) {
- if (!Intraprocedural && !Arg->hasPassPointeeByValueCopyAttr()) {
+ if ((VS & AA::Interprocedural) && !Arg->hasPassPointeeByValueCopyAttr()) {
SmallVector<Item> CallSiteValues;
bool UsedAssumedInformation = false;
if (A.checkForAllCallSites(
@@ -398,7 +399,7 @@ static bool genericValueTraversal(
continue;
Value *NewV = SimpleV.getValue();
if (NewV && NewV != V) {
- if (!Intraprocedural || !CtxI ||
+ if ((VS & AA::Interprocedural) || !CtxI ||
AA::isValidInScope(*NewV, CtxI->getFunction())) {
Worklist.push_back({NewV, CtxI});
continue;
@@ -425,7 +426,7 @@ static bool genericValueTraversal(
return AA::isDynamicallyUnique(A, QueryingAA, *PC);
});
if (DynamicallyUnique &&
- (!Intraprocedural || !CtxI ||
+ ((VS & AA::Interprocedural) || !CtxI ||
llvm::all_of(PotentialCopies, [CtxI](Value *PC) {
return AA::isValidInScope(*PC, CtxI->getFunction());
}))) {
@@ -460,7 +461,7 @@ bool AA::getAssumedUnderlyingObjects(Attributor &A, const Value &Ptr,
const AbstractAttribute &QueryingAA,
const Instruction *CtxI,
bool &UsedAssumedInformation,
- bool Intraprocedural) {
+ AA::ValueScope VS) {
auto StripCB = [&](Value *V) { return getUnderlyingObject(V); };
SmallPtrSet<Value *, 8> SeenObjects;
auto VisitValueCB = [&SeenObjects](Value &Val, const Instruction *,
@@ -472,7 +473,7 @@ bool AA::getAssumedUnderlyingObjects(Attributor &A, const Value &Ptr,
};
if (!genericValueTraversal<decltype(Objects)>(
A, IRPosition::value(Ptr), QueryingAA, Objects, VisitValueCB, CtxI,
- UsedAssumedInformation, true, 32, StripCB, Intraprocedural))
+ UsedAssumedInformation, true, 32, StripCB, VS))
return false;
return true;
}
@@ -1927,7 +1928,7 @@ ChangeStatus AAReturnedValuesImpl::updateImpl(Attributor &A) {
A, IRPosition::value(*Ret.getReturnValue()), *this, Ret, ReturnValueCB,
&I, UsedAssumedInformation, /* UseValueSimplify */ true,
/* MaxValues */ 16,
- /* StripCB */ nullptr, /* Intraprocedural */ true);
+ /* StripCB */ nullptr, AA::Intraprocedural);
};
// Discover returned values from all live returned instructions in the
@@ -7971,7 +7972,7 @@ void AAMemoryLocationImpl::categorizePtrValue(
bool UsedAssumedInformation = false;
if (!AA::getAssumedUnderlyingObjects(A, Ptr, Objects, *this, &I,
UsedAssumedInformation,
- /* Intraprocedural */ true)) {
+ AA::Intraprocedural)) {
LLVM_DEBUG(
dbgs() << "[AAMemoryLocation] Pointer locations not categorized\n");
updateStateAndAccessesMap(State, NO_UNKOWN_MEM, &I, nullptr, Changed,
More information about the llvm-commits
mailing list