diff options
author | Haicheng Wu <haicheng@codeaurora.org> | 2016-02-17 02:01:50 +0000 |
---|---|---|
committer | Haicheng Wu <haicheng@codeaurora.org> | 2016-02-17 02:01:50 +0000 |
commit | 5cf99095bb99042e0babcc86467d0fa913015b60 (patch) | |
tree | 6d1eca4585a570bc00049a2c1143100ca79e3a65 /llvm/lib/Analysis/AliasSetTracker.cpp | |
parent | a0d5347ee97702e4afd41cc5ee57c572d008b8c4 (diff) | |
download | bcm5719-llvm-5cf99095bb99042e0babcc86467d0fa913015b60.tar.gz bcm5719-llvm-5cf99095bb99042e0babcc86467d0fa913015b60.zip |
[AliasSetTracker] Teach AliasSetTracker about MemSetInst
This change is to fix the problem discussed in
http://lists.llvm.org/pipermail/llvm-dev/2016-February/095446.html.
llvm-svn: 261052
Diffstat (limited to 'llvm/lib/Analysis/AliasSetTracker.cpp')
-rw-r--r-- | llvm/lib/Analysis/AliasSetTracker.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/AliasSetTracker.cpp b/llvm/lib/Analysis/AliasSetTracker.cpp index 074f307daa8..97e50c6dbc3 100644 --- a/llvm/lib/Analysis/AliasSetTracker.cpp +++ b/llvm/lib/Analysis/AliasSetTracker.cpp @@ -342,6 +342,24 @@ bool AliasSetTracker::add(VAArgInst *VAAI) { return NewPtr; } +bool AliasSetTracker::add(MemSetInst *MSI) { + AAMDNodes AAInfo; + MSI->getAAMetadata(AAInfo); + + bool NewPtr; + uint64_t Len; + + if (ConstantInt *C = dyn_cast<ConstantInt>(MSI->getLength())) + Len = C->getZExtValue(); + else + Len = MemoryLocation::UnknownSize; + + AliasSet &AS = + addPointer(MSI->getDest(), Len, AAInfo, AliasSet::ModAccess, NewPtr); + if (MSI->isVolatile()) + AS.setVolatile(); + return NewPtr; +} bool AliasSetTracker::addUnknown(Instruction *Inst) { if (isa<DbgInfoIntrinsic>(Inst)) @@ -368,7 +386,10 @@ bool AliasSetTracker::add(Instruction *I) { return add(SI); if (VAArgInst *VAAI = dyn_cast<VAArgInst>(I)) return add(VAAI); + if (MemSetInst *MSI = dyn_cast<MemSetInst>(I)) + return add(MSI); return addUnknown(I); + // FIXME: add support of memcpy and memmove. } void AliasSetTracker::add(BasicBlock &BB) { @@ -479,6 +500,23 @@ bool AliasSetTracker::remove(VAArgInst *VAAI) { return true; } +bool AliasSetTracker::remove(MemSetInst *MSI) { + AAMDNodes AAInfo; + MSI->getAAMetadata(AAInfo); + uint64_t Len; + + if (ConstantInt *C = dyn_cast<ConstantInt>(MSI->getLength())) + Len = C->getZExtValue(); + else + Len = MemoryLocation::UnknownSize; + + AliasSet *AS = findAliasSetForPointer(MSI->getDest(), Len, AAInfo); + if (!AS) + return false; + remove(*AS); + return true; +} + bool AliasSetTracker::removeUnknown(Instruction *I) { if (!I->mayReadOrWriteMemory()) return false; // doesn't alias anything @@ -497,7 +535,10 @@ bool AliasSetTracker::remove(Instruction *I) { return remove(SI); if (VAArgInst *VAAI = dyn_cast<VAArgInst>(I)) return remove(VAAI); + if (MemSetInst *MSI = dyn_cast<MemSetInst>(I)) + return remove(MSI); return removeUnknown(I); + // FIXME: add support of memcpy and memmove. } |