Skip to content

Commit 860a842

Browse files
tmp
1 parent b88ac9f commit 860a842

File tree

4 files changed

+50
-0
lines changed

4 files changed

+50
-0
lines changed

llvm/include/llvm/Analysis/AliasAnalysis.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,7 @@ class AAResults {
572572
// relationship holds through the entire function.
573573
AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB,
574574
AAQueryInfo &AAQI, const Instruction *CtxI = nullptr);
575+
AliasResult aliasErrno(const MemoryLocation &Loc, const Module *M);
575576

576577
ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, AAQueryInfo &AAQI,
577578
bool IgnoreLocals = false);
@@ -718,6 +719,11 @@ class AAResults::Concept {
718719
const MemoryLocation &LocB, AAQueryInfo &AAQI,
719720
const Instruction *CtxI) = 0;
720721

722+
/// Returns an AliasResult indicating whether a specific memory location
723+
/// aliases errno.
724+
virtual AliasResult aliasErrno(const MemoryLocation &Loc,
725+
const Module *M) = 0;
726+
721727
/// @}
722728
//===--------------------------------------------------------------------===//
723729
/// \name Simple mod/ref information
@@ -779,6 +785,10 @@ template <typename AAResultT> class AAResults::Model final : public Concept {
779785
return Result.alias(LocA, LocB, AAQI, CtxI);
780786
}
781787

788+
AliasResult aliasErrno(const MemoryLocation &Loc, const Module *M) override {
789+
return Result.aliasErrno(Loc, M);
790+
}
791+
782792
ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, AAQueryInfo &AAQI,
783793
bool IgnoreLocals) override {
784794
return Result.getModRefInfoMask(Loc, AAQI, IgnoreLocals);
@@ -834,6 +844,10 @@ class AAResultBase {
834844
return AliasResult::MayAlias;
835845
}
836846

847+
AliasResult aliasErrno(const MemoryLocation &Loc, const Module *M) {
848+
return AliasResult::MayAlias;
849+
}
850+
837851
ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, AAQueryInfo &AAQI,
838852
bool IgnoreLocals) {
839853
return ModRefInfo::ModRef;

llvm/include/llvm/Analysis/TypeBasedAliasAnalysis.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class TypeBasedAAResult : public AAResultBase {
4848

4949
AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB,
5050
AAQueryInfo &AAQI, const Instruction *CtxI);
51+
AliasResult aliasErrno(const MemoryLocation &Loc, const Module *M);
5152
ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, AAQueryInfo &AAQI,
5253
bool IgnoreLocals);
5354

llvm/lib/Analysis/AliasAnalysis.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,18 @@ AliasResult AAResults::alias(const MemoryLocation &LocA,
146146
return Result;
147147
}
148148

149+
AliasResult AAResults::aliasErrno(const MemoryLocation &Loc, const Module *M) {
150+
AliasResult Result = AliasResult::MayAlias;
151+
152+
for (const auto &AA : AAs) {
153+
Result = AA->aliasErrno(Loc, M);
154+
if (Result != AliasResult::MayAlias)
155+
break;
156+
}
157+
158+
return Result;
159+
}
160+
149161
ModRefInfo AAResults::getModRefInfoMask(const MemoryLocation &Loc,
150162
bool IgnoreLocals) {
151163
SimpleAAQueryInfo AAQIP(*this);
@@ -253,6 +265,14 @@ ModRefInfo AAResults::getModRefInfo(const CallBase *Call,
253265

254266
Result &= ArgMR | OtherMR;
255267

268+
#if 0
269+
// AA can mask out ErrnoMem, despite the call-site clobbering errno, if we can
270+
// prove the location does not alias errno. Done only via TBAA, for now.
271+
if (ME.getModRef(IRMemLocation::ErrnoMem) != ModRefInfo::NoModRef)
272+
if (aliasErrno(Loc, Call->getModule()) == AliasResult::NoAlias)
273+
Result &= ME.getWithoutLoc(IRMemLocation::ErrnoMem).getModRef();
274+
#endif
275+
256276
// Apply the ModRef mask. This ensures that if Loc is a constant memory
257277
// location, we take into account the fact that the call definitely could not
258278
// modify the memory location.

llvm/lib/Analysis/TypeBasedAliasAnalysis.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@
115115
#include "llvm/IR/InstrTypes.h"
116116
#include "llvm/IR/LLVMContext.h"
117117
#include "llvm/IR/Metadata.h"
118+
#include "llvm/IR/Module.h"
118119
#include "llvm/InitializePasses.h"
119120
#include "llvm/Pass.h"
120121
#include "llvm/Support/Casting.h"
@@ -385,6 +386,20 @@ AliasResult TypeBasedAAResult::alias(const MemoryLocation &LocA,
385386
return AliasResult::NoAlias;
386387
}
387388

389+
AliasResult TypeBasedAAResult::aliasErrno(const MemoryLocation &Loc,
390+
const Module *M) {
391+
if (!shouldUseTBAA())
392+
return AliasResult::MayAlias;
393+
394+
const auto *ErrnoTBAAMD = M->getNamedMetadata("llvm.errno.tbaa");
395+
const auto *N = Loc.AATags.TBAA;
396+
if (!ErrnoTBAAMD || !N ||
397+
llvm::any_of(ErrnoTBAAMD->operands(),
398+
[&](const auto *Node) { return Aliases(N, Node); }))
399+
return AliasResult::MayAlias;
400+
return AliasResult::NoAlias;
401+
}
402+
388403
ModRefInfo TypeBasedAAResult::getModRefInfoMask(const MemoryLocation &Loc,
389404
AAQueryInfo &AAQI,
390405
bool IgnoreLocals) {

0 commit comments

Comments
 (0)