From 6053b37e454c056d25a31b39a06279cafd35edc8 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 15 Jan 2021 20:38:47 +0100 Subject: [PATCH] [AA] Thread AAQI through getModRefBehavior() (NFC) This is in preparation for D94363, as we will need AAQI to perform the recursive call to the function variant. --- llvm/include/llvm/Analysis/AliasAnalysis.h | 22 ++++++++++++------- .../llvm/Analysis/BasicAliasAnalysis.h | 3 ++- .../llvm/Analysis/TypeBasedAliasAnalysis.h | 3 ++- llvm/lib/Analysis/AliasAnalysis.cpp | 18 ++++++++++----- llvm/lib/Analysis/BasicAliasAnalysis.cpp | 7 +++--- llvm/lib/Analysis/TypeBasedAliasAnalysis.cpp | 7 +++--- 6 files changed, 38 insertions(+), 22 deletions(-) diff --git a/llvm/include/llvm/Analysis/AliasAnalysis.h b/llvm/include/llvm/Analysis/AliasAnalysis.h index 7195c93e467f5..de4fb7b017c86 100644 --- a/llvm/include/llvm/Analysis/AliasAnalysis.h +++ b/llvm/include/llvm/Analysis/AliasAnalysis.h @@ -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; @@ -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; @@ -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; @@ -1056,8 +1059,9 @@ template 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 { @@ -1134,9 +1138,10 @@ template 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) { @@ -1190,7 +1195,8 @@ template class AAResultBase { return ModRefInfo::ModRef; } - FunctionModRefBehavior getModRefBehavior(const CallBase *Call) { + FunctionModRefBehavior getModRefBehavior(const CallBase *Call, + AAQueryInfo &AAQI) { return FunctionModRefBehavior::unknown(); } diff --git a/llvm/include/llvm/Analysis/BasicAliasAnalysis.h b/llvm/include/llvm/Analysis/BasicAliasAnalysis.h index 46f14a21a9ff0..f58db19024074 100644 --- a/llvm/include/llvm/Analysis/BasicAliasAnalysis.h +++ b/llvm/include/llvm/Analysis/BasicAliasAnalysis.h @@ -85,7 +85,8 @@ class BasicAAResult : public AAResultBase { 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. diff --git a/llvm/include/llvm/Analysis/TypeBasedAliasAnalysis.h b/llvm/include/llvm/Analysis/TypeBasedAliasAnalysis.h index 345f11a3aad5c..dffdc18d9085e 100644 --- a/llvm/include/llvm/Analysis/TypeBasedAliasAnalysis.h +++ b/llvm/include/llvm/Analysis/TypeBasedAliasAnalysis.h @@ -44,7 +44,8 @@ class TypeBasedAAResult : public AAResultBase { 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); diff --git a/llvm/lib/Analysis/AliasAnalysis.cpp b/llvm/lib/Analysis/AliasAnalysis.cpp index 2a2b49fdf7e42..5f477ed3b3902 100644 --- a/llvm/lib/Analysis/AliasAnalysis.cpp +++ b/llvm/lib/Analysis/AliasAnalysis.cpp @@ -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; @@ -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; @@ -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()) @@ -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(); @@ -662,7 +668,7 @@ ModRefInfo AAResults::getModRefInfo(const Instruction *I, AAQueryInfo &AAQIP) { if (OptLoc == None) { if (const auto *Call = dyn_cast(I)) - return getModRefBehavior(Call).getModRef(); + return getModRefBehavior(Call, AAQIP).getModRef(); } const MemoryLocation &Loc = OptLoc.value_or(MemoryLocation()); diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp index 27c485dea2b9f..461c7742e1d98 100644 --- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -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()); @@ -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; diff --git a/llvm/lib/Analysis/TypeBasedAliasAnalysis.cpp b/llvm/lib/Analysis/TypeBasedAliasAnalysis.cpp index 1751e99415549..f5a451bee2bf5 100644 --- a/llvm/lib/Analysis/TypeBasedAliasAnalysis.cpp +++ b/llvm/lib/Analysis/TypeBasedAliasAnalysis.cpp @@ -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. @@ -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) {