Skip to content

Commit

Permalink
[AA] Thread AAQI through getModRefBehavior() (NFC)
Browse files Browse the repository at this point in the history
This is in preparation for D94363, as we will need AAQI to
perform the recursive call to the function variant.
  • Loading branch information
nikic committed Oct 6, 2022
1 parent d785a8e commit 6053b37
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 22 deletions.
22 changes: 14 additions & 8 deletions llvm/include/llvm/Analysis/AliasAnalysis.h
Original file line number Diff line number Diff line change
Expand Up @@ -883,6 +883,8 @@ class AAResults {
ModRefInfo callCapturesBefore(const Instruction *I,
const MemoryLocation &MemLoc, DominatorTree *DT,
AAQueryInfo &AAQIP);
FunctionModRefBehavior getModRefBehavior(const CallBase *Call,
AAQueryInfo &AAQI);

class Concept;

Expand Down Expand Up @@ -937,7 +939,7 @@ class BatchAAResults {
return AA.getArgModRefInfo(Call, ArgIdx);
}
FunctionModRefBehavior getModRefBehavior(const CallBase *Call) {
return AA.getModRefBehavior(Call);
return AA.getModRefBehavior(Call, AAQI);
}
bool isMustAlias(const MemoryLocation &LocA, const MemoryLocation &LocB) {
return alias(LocA, LocB) == AliasResult::MustAlias;
Expand Down Expand Up @@ -1005,7 +1007,8 @@ class AAResults::Concept {
unsigned ArgIdx) = 0;

/// Return the behavior of the given call site.
virtual FunctionModRefBehavior getModRefBehavior(const CallBase *Call) = 0;
virtual FunctionModRefBehavior getModRefBehavior(const CallBase *Call,
AAQueryInfo &AAQI) = 0;

/// Return the behavior when calling the given function.
virtual FunctionModRefBehavior getModRefBehavior(const Function *F) = 0;
Expand Down Expand Up @@ -1056,8 +1059,9 @@ template <typename AAResultT> class AAResults::Model final : public Concept {
return Result.getArgModRefInfo(Call, ArgIdx);
}

FunctionModRefBehavior getModRefBehavior(const CallBase *Call) override {
return Result.getModRefBehavior(Call);
FunctionModRefBehavior getModRefBehavior(const CallBase *Call,
AAQueryInfo &AAQI) override {
return Result.getModRefBehavior(Call, AAQI);
}

FunctionModRefBehavior getModRefBehavior(const Function *F) override {
Expand Down Expand Up @@ -1134,9 +1138,10 @@ template <typename DerivedT> class AAResultBase {
: CurrentResult.getArgModRefInfo(Call, ArgIdx);
}

FunctionModRefBehavior getModRefBehavior(const CallBase *Call) {
return AAR ? AAR->getModRefBehavior(Call)
: CurrentResult.getModRefBehavior(Call);
FunctionModRefBehavior getModRefBehavior(const CallBase *Call,
AAQueryInfo &AAQI) {
return AAR ? AAR->getModRefBehavior(Call, AAQI)
: CurrentResult.getModRefBehavior(Call, AAQI);
}

FunctionModRefBehavior getModRefBehavior(const Function *F) {
Expand Down Expand Up @@ -1190,7 +1195,8 @@ template <typename DerivedT> class AAResultBase {
return ModRefInfo::ModRef;
}

FunctionModRefBehavior getModRefBehavior(const CallBase *Call) {
FunctionModRefBehavior getModRefBehavior(const CallBase *Call,
AAQueryInfo &AAQI) {
return FunctionModRefBehavior::unknown();
}

Expand Down
3 changes: 2 additions & 1 deletion llvm/include/llvm/Analysis/BasicAliasAnalysis.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,8 @@ class BasicAAResult : public AAResultBase<BasicAAResult> {
ModRefInfo getArgModRefInfo(const CallBase *Call, unsigned ArgIdx);

/// Returns the behavior when calling the given call site.
FunctionModRefBehavior getModRefBehavior(const CallBase *Call);
FunctionModRefBehavior getModRefBehavior(const CallBase *Call,
AAQueryInfo &AAQI);

/// Returns the behavior when calling the given function. For use when the
/// call site is not known.
Expand Down
3 changes: 2 additions & 1 deletion llvm/include/llvm/Analysis/TypeBasedAliasAnalysis.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ class TypeBasedAAResult : public AAResultBase<TypeBasedAAResult> {
AAQueryInfo &AAQI);
bool pointsToConstantMemory(const MemoryLocation &Loc, AAQueryInfo &AAQI,
bool OrLocal);
FunctionModRefBehavior getModRefBehavior(const CallBase *Call);
FunctionModRefBehavior getModRefBehavior(const CallBase *Call,
AAQueryInfo &AAQI);
FunctionModRefBehavior getModRefBehavior(const Function *F);
ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc,
AAQueryInfo &AAQI);
Expand Down
18 changes: 12 additions & 6 deletions llvm/lib/Analysis/AliasAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ ModRefInfo AAResults::getModRefInfo(const CallBase *Call,

// We can completely ignore inaccessible memory here, because MemoryLocations
// can only reference accessible memory.
auto MRB = getModRefBehavior(Call).getWithoutLoc(
auto MRB = getModRefBehavior(Call, AAQI).getWithoutLoc(
FunctionModRefBehavior::InaccessibleMem);
if (MRB.doesNotAccessMemory())
return ModRefInfo::NoModRef;
Expand Down Expand Up @@ -296,11 +296,11 @@ ModRefInfo AAResults::getModRefInfo(const CallBase *Call1,
// aggregate set of AA results.

// If Call1 or Call2 are readnone, they don't interact.
auto Call1B = getModRefBehavior(Call1);
auto Call1B = getModRefBehavior(Call1, AAQI);
if (Call1B.doesNotAccessMemory())
return ModRefInfo::NoModRef;

auto Call2B = getModRefBehavior(Call2);
auto Call2B = getModRefBehavior(Call2, AAQI);
if (Call2B.doesNotAccessMemory())
return ModRefInfo::NoModRef;

Expand Down Expand Up @@ -387,11 +387,12 @@ ModRefInfo AAResults::getModRefInfo(const CallBase *Call1,
return Result;
}

FunctionModRefBehavior AAResults::getModRefBehavior(const CallBase *Call) {
FunctionModRefBehavior AAResults::getModRefBehavior(const CallBase *Call,
AAQueryInfo &AAQI) {
FunctionModRefBehavior Result = FunctionModRefBehavior::unknown();

for (const auto &AA : AAs) {
Result &= AA->getModRefBehavior(Call);
Result &= AA->getModRefBehavior(Call, AAQI);

// Early-exit the moment we reach the bottom of the lattice.
if (Result.doesNotAccessMemory())
Expand All @@ -401,6 +402,11 @@ FunctionModRefBehavior AAResults::getModRefBehavior(const CallBase *Call) {
return Result;
}

FunctionModRefBehavior AAResults::getModRefBehavior(const CallBase *Call) {
SimpleAAQueryInfo AAQI;
return getModRefBehavior(Call, AAQI);
}

FunctionModRefBehavior AAResults::getModRefBehavior(const Function *F) {
FunctionModRefBehavior Result = FunctionModRefBehavior::unknown();

Expand Down Expand Up @@ -662,7 +668,7 @@ ModRefInfo AAResults::getModRefInfo(const Instruction *I,
AAQueryInfo &AAQIP) {
if (OptLoc == None) {
if (const auto *Call = dyn_cast<CallBase>(I))
return getModRefBehavior(Call).getModRef();
return getModRefBehavior(Call, AAQIP).getModRef();
}

const MemoryLocation &Loc = OptLoc.value_or(MemoryLocation());
Expand Down
7 changes: 4 additions & 3 deletions llvm/lib/Analysis/BasicAliasAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -760,7 +760,8 @@ static FunctionModRefBehavior getModRefBehaviorFromAttrs(AttributeSet Attrs) {
}

/// Returns the behavior when calling the given call site.
FunctionModRefBehavior BasicAAResult::getModRefBehavior(const CallBase *Call) {
FunctionModRefBehavior BasicAAResult::getModRefBehavior(const CallBase *Call,
AAQueryInfo &AAQI) {
FunctionModRefBehavior Min =
getModRefBehaviorFromAttrs(Call->getAttributes().getFnAttrs());

Expand Down Expand Up @@ -1012,12 +1013,12 @@ ModRefInfo BasicAAResult::getModRefInfo(const CallBase *Call1,
// possibilities for guard intrinsics.

if (isIntrinsicCall(Call1, Intrinsic::experimental_guard))
return isModSet(getModRefBehavior(Call2).getModRef())
return isModSet(getModRefBehavior(Call2, AAQI).getModRef())
? ModRefInfo::Ref
: ModRefInfo::NoModRef;

if (isIntrinsicCall(Call2, Intrinsic::experimental_guard))
return isModSet(getModRefBehavior(Call1).getModRef())
return isModSet(getModRefBehavior(Call1, AAQI).getModRef())
? ModRefInfo::Mod
: ModRefInfo::NoModRef;

Expand Down
7 changes: 4 additions & 3 deletions llvm/lib/Analysis/TypeBasedAliasAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -405,9 +405,10 @@ bool TypeBasedAAResult::pointsToConstantMemory(const MemoryLocation &Loc,
}

FunctionModRefBehavior
TypeBasedAAResult::getModRefBehavior(const CallBase *Call) {
TypeBasedAAResult::getModRefBehavior(const CallBase *Call,
AAQueryInfo &AAQI) {
if (!EnableTBAA)
return AAResultBase::getModRefBehavior(Call);
return AAResultBase::getModRefBehavior(Call, AAQI);

// If this is an "immutable" type, we can assume the call doesn't write
// to memory.
Expand All @@ -416,7 +417,7 @@ TypeBasedAAResult::getModRefBehavior(const CallBase *Call) {
(isStructPathTBAA(M) && TBAAStructTagNode(M).isTypeImmutable()))
return FunctionModRefBehavior::readOnly();

return AAResultBase::getModRefBehavior(Call);
return AAResultBase::getModRefBehavior(Call, AAQI);
}

FunctionModRefBehavior TypeBasedAAResult::getModRefBehavior(const Function *F) {
Expand Down

0 comments on commit 6053b37

Please sign in to comment.