diff options
author | Daniel Neilson <dneilson@azul.com> | 2018-05-30 14:43:39 +0000 |
---|---|---|
committer | Daniel Neilson <dneilson@azul.com> | 2018-05-30 14:43:39 +0000 |
commit | 6b23fb764ecc6d355408c4974019a8b43efc220e (patch) | |
tree | 81705514c55a4065b1150d37edf7a0cd9efafec1 /llvm/lib/Analysis/AliasSetTracker.cpp | |
parent | 52457d33b23c1657e0825f99bab3064e463d62e8 (diff) | |
download | bcm5719-llvm-6b23fb764ecc6d355408c4974019a8b43efc220e.tar.gz bcm5719-llvm-6b23fb764ecc6d355408c4974019a8b43efc220e.zip |
[AliasSet] Teach the alias set how to handle atomic memcpy/memmove/memset
Summary:
The atomic variants of the memcpy/memmove/memset intrinsics can be treated
the same was as the regular forms, with respect to aliasing. Update the
AliasSetTracker to treat the atomic forms the same was as the regular forms.
llvm-svn: 333551
Diffstat (limited to 'llvm/lib/Analysis/AliasSetTracker.cpp')
-rw-r--r-- | llvm/lib/Analysis/AliasSetTracker.cpp | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/llvm/lib/Analysis/AliasSetTracker.cpp b/llvm/lib/Analysis/AliasSetTracker.cpp index e4b805aca91..7ed23af5589 100644 --- a/llvm/lib/Analysis/AliasSetTracker.cpp +++ b/llvm/lib/Analysis/AliasSetTracker.cpp @@ -389,7 +389,7 @@ void AliasSetTracker::add(VAArgInst *VAAI) { AliasSet::ModRefAccess); } -void AliasSetTracker::add(MemSetInst *MSI) { +void AliasSetTracker::add(AnyMemSetInst *MSI) { AAMDNodes AAInfo; MSI->getAAMetadata(AAInfo); @@ -402,11 +402,12 @@ void AliasSetTracker::add(MemSetInst *MSI) { AliasSet &AS = addPointer(MSI->getRawDest(), Len, AAInfo, AliasSet::ModAccess); - if (MSI->isVolatile()) + auto *MS = dyn_cast<MemSetInst>(MSI); + if (MS && MS->isVolatile()) AS.setVolatile(); } -void AliasSetTracker::add(MemTransferInst *MTI) { +void AliasSetTracker::add(AnyMemTransferInst *MTI) { AAMDNodes AAInfo; MTI->getAAMetadata(AAInfo); @@ -418,13 +419,15 @@ void AliasSetTracker::add(MemTransferInst *MTI) { AliasSet &ASSrc = addPointer(MTI->getRawSource(), Len, AAInfo, AliasSet::RefAccess); - if (MTI->isVolatile()) - ASSrc.setVolatile(); AliasSet &ASDst = addPointer(MTI->getRawDest(), Len, AAInfo, AliasSet::ModAccess); - if (MTI->isVolatile()) + + auto* MT = dyn_cast<MemTransferInst>(MTI); + if (MT && MT->isVolatile()) { + ASSrc.setVolatile(); ASDst.setVolatile(); + } } void AliasSetTracker::addUnknown(Instruction *Inst) { @@ -464,9 +467,9 @@ void AliasSetTracker::add(Instruction *I) { return add(SI); if (VAArgInst *VAAI = dyn_cast<VAArgInst>(I)) return add(VAAI); - if (MemSetInst *MSI = dyn_cast<MemSetInst>(I)) + if (AnyMemSetInst *MSI = dyn_cast<AnyMemSetInst>(I)) return add(MSI); - if (MemTransferInst *MTI = dyn_cast<MemTransferInst>(I)) + if (AnyMemTransferInst *MTI = dyn_cast<AnyMemTransferInst>(I)) return add(MTI); return addUnknown(I); } |