mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-27 16:17:17 +00:00
Reapply r116831 and r116839, converting AliasAnalysis to use
uint64_t, plus fixes for places I missed before. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116875 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -67,7 +67,7 @@ public:
|
|||||||
/// UnknownSize - This is a special value which can be used with the
|
/// UnknownSize - This is a special value which can be used with the
|
||||||
/// size arguments in alias queries to indicate that the caller does not
|
/// size arguments in alias queries to indicate that the caller does not
|
||||||
/// know the sizes of the potential memory references.
|
/// know the sizes of the potential memory references.
|
||||||
static unsigned const UnknownSize = ~0u;
|
static uint64_t const UnknownSize = ~UINT64_C(0);
|
||||||
|
|
||||||
/// getTargetData - Return a pointer to the current TargetData object, or
|
/// getTargetData - Return a pointer to the current TargetData object, or
|
||||||
/// null if no TargetData object is available.
|
/// null if no TargetData object is available.
|
||||||
@@ -77,7 +77,7 @@ public:
|
|||||||
/// getTypeStoreSize - Return the TargetData store size for the given type,
|
/// getTypeStoreSize - Return the TargetData store size for the given type,
|
||||||
/// if known, or a conservative value otherwise.
|
/// if known, or a conservative value otherwise.
|
||||||
///
|
///
|
||||||
unsigned getTypeStoreSize(const Type *Ty);
|
uint64_t getTypeStoreSize(const Type *Ty);
|
||||||
|
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
/// Alias Queries...
|
/// Alias Queries...
|
||||||
@@ -88,13 +88,13 @@ public:
|
|||||||
/// Ptr - The address of the start of the location.
|
/// Ptr - The address of the start of the location.
|
||||||
const Value *Ptr;
|
const Value *Ptr;
|
||||||
/// Size - The size of the location.
|
/// Size - The size of the location.
|
||||||
unsigned Size;
|
uint64_t Size;
|
||||||
/// TBAATag - The metadata node which describes the TBAA type of
|
/// TBAATag - The metadata node which describes the TBAA type of
|
||||||
/// the location, or null if there is no (unique) tag.
|
/// the location, or null if there is no (unique) tag.
|
||||||
const MDNode *TBAATag;
|
const MDNode *TBAATag;
|
||||||
|
|
||||||
explicit Location(const Value *P = 0,
|
explicit Location(const Value *P = 0,
|
||||||
unsigned S = UnknownSize,
|
uint64_t S = UnknownSize,
|
||||||
const MDNode *N = 0)
|
const MDNode *N = 0)
|
||||||
: Ptr(P), Size(S), TBAATag(N) {}
|
: Ptr(P), Size(S), TBAATag(N) {}
|
||||||
|
|
||||||
@@ -129,8 +129,8 @@ public:
|
|||||||
virtual AliasResult alias(const Location &LocA, const Location &LocB);
|
virtual AliasResult alias(const Location &LocA, const Location &LocB);
|
||||||
|
|
||||||
/// alias - A convenience wrapper.
|
/// alias - A convenience wrapper.
|
||||||
AliasResult alias(const Value *V1, unsigned V1Size,
|
AliasResult alias(const Value *V1, uint64_t V1Size,
|
||||||
const Value *V2, unsigned V2Size) {
|
const Value *V2, uint64_t V2Size) {
|
||||||
return alias(Location(V1, V1Size), Location(V2, V2Size));
|
return alias(Location(V1, V1Size), Location(V2, V2Size));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,8 +146,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// isNoAlias - A convenience wrapper.
|
/// isNoAlias - A convenience wrapper.
|
||||||
bool isNoAlias(const Value *V1, unsigned V1Size,
|
bool isNoAlias(const Value *V1, uint64_t V1Size,
|
||||||
const Value *V2, unsigned V2Size) {
|
const Value *V2, uint64_t V2Size) {
|
||||||
return isNoAlias(Location(V1, V1Size), Location(V2, V2Size));
|
return isNoAlias(Location(V1, V1Size), Location(V2, V2Size));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -278,7 +278,7 @@ public:
|
|||||||
|
|
||||||
/// getModRefInfo - A convenience wrapper.
|
/// getModRefInfo - A convenience wrapper.
|
||||||
ModRefResult getModRefInfo(const Instruction *I,
|
ModRefResult getModRefInfo(const Instruction *I,
|
||||||
const Value *P, unsigned Size) {
|
const Value *P, uint64_t Size) {
|
||||||
return getModRefInfo(I, Location(P, Size));
|
return getModRefInfo(I, Location(P, Size));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -289,7 +289,7 @@ public:
|
|||||||
|
|
||||||
/// getModRefInfo (for call sites) - A convenience wrapper.
|
/// getModRefInfo (for call sites) - A convenience wrapper.
|
||||||
ModRefResult getModRefInfo(ImmutableCallSite CS,
|
ModRefResult getModRefInfo(ImmutableCallSite CS,
|
||||||
const Value *P, unsigned Size) {
|
const Value *P, uint64_t Size) {
|
||||||
return getModRefInfo(CS, Location(P, Size));
|
return getModRefInfo(CS, Location(P, Size));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -300,7 +300,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// getModRefInfo (for calls) - A convenience wrapper.
|
/// getModRefInfo (for calls) - A convenience wrapper.
|
||||||
ModRefResult getModRefInfo(const CallInst *C, const Value *P, unsigned Size) {
|
ModRefResult getModRefInfo(const CallInst *C, const Value *P, uint64_t Size) {
|
||||||
return getModRefInfo(C, Location(P, Size));
|
return getModRefInfo(C, Location(P, Size));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -313,7 +313,7 @@ public:
|
|||||||
|
|
||||||
/// getModRefInfo (for invokes) - A convenience wrapper.
|
/// getModRefInfo (for invokes) - A convenience wrapper.
|
||||||
ModRefResult getModRefInfo(const InvokeInst *I,
|
ModRefResult getModRefInfo(const InvokeInst *I,
|
||||||
const Value *P, unsigned Size) {
|
const Value *P, uint64_t Size) {
|
||||||
return getModRefInfo(I, Location(P, Size));
|
return getModRefInfo(I, Location(P, Size));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -322,7 +322,7 @@ public:
|
|||||||
ModRefResult getModRefInfo(const LoadInst *L, const Location &Loc);
|
ModRefResult getModRefInfo(const LoadInst *L, const Location &Loc);
|
||||||
|
|
||||||
/// getModRefInfo (for loads) - A convenience wrapper.
|
/// getModRefInfo (for loads) - A convenience wrapper.
|
||||||
ModRefResult getModRefInfo(const LoadInst *L, const Value *P, unsigned Size) {
|
ModRefResult getModRefInfo(const LoadInst *L, const Value *P, uint64_t Size) {
|
||||||
return getModRefInfo(L, Location(P, Size));
|
return getModRefInfo(L, Location(P, Size));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -331,7 +331,7 @@ public:
|
|||||||
ModRefResult getModRefInfo(const StoreInst *S, const Location &Loc);
|
ModRefResult getModRefInfo(const StoreInst *S, const Location &Loc);
|
||||||
|
|
||||||
/// getModRefInfo (for stores) - A convenience wrapper.
|
/// getModRefInfo (for stores) - A convenience wrapper.
|
||||||
ModRefResult getModRefInfo(const StoreInst *S, const Value *P, unsigned Size) {
|
ModRefResult getModRefInfo(const StoreInst *S, const Value *P, uint64_t Size) {
|
||||||
return getModRefInfo(S, Location(P, Size));
|
return getModRefInfo(S, Location(P, Size));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -340,7 +340,7 @@ public:
|
|||||||
ModRefResult getModRefInfo(const VAArgInst* I, const Location &Loc);
|
ModRefResult getModRefInfo(const VAArgInst* I, const Location &Loc);
|
||||||
|
|
||||||
/// getModRefInfo (for va_args) - A convenience wrapper.
|
/// getModRefInfo (for va_args) - A convenience wrapper.
|
||||||
ModRefResult getModRefInfo(const VAArgInst* I, const Value* P, unsigned Size) {
|
ModRefResult getModRefInfo(const VAArgInst* I, const Value* P, uint64_t Size) {
|
||||||
return getModRefInfo(I, Location(P, Size));
|
return getModRefInfo(I, Location(P, Size));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -360,7 +360,7 @@ public:
|
|||||||
bool canBasicBlockModify(const BasicBlock &BB, const Location &Loc);
|
bool canBasicBlockModify(const BasicBlock &BB, const Location &Loc);
|
||||||
|
|
||||||
/// canBasicBlockModify - A convenience wrapper.
|
/// canBasicBlockModify - A convenience wrapper.
|
||||||
bool canBasicBlockModify(const BasicBlock &BB, const Value *P, unsigned Size){
|
bool canBasicBlockModify(const BasicBlock &BB, const Value *P, uint64_t Size){
|
||||||
return canBasicBlockModify(BB, Location(P, Size));
|
return canBasicBlockModify(BB, Location(P, Size));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -373,7 +373,7 @@ public:
|
|||||||
|
|
||||||
/// canInstructionRangeModify - A convenience wrapper.
|
/// canInstructionRangeModify - A convenience wrapper.
|
||||||
bool canInstructionRangeModify(const Instruction &I1, const Instruction &I2,
|
bool canInstructionRangeModify(const Instruction &I1, const Instruction &I2,
|
||||||
const Value *Ptr, unsigned Size) {
|
const Value *Ptr, uint64_t Size) {
|
||||||
return canInstructionRangeModify(I1, I2, Location(Ptr, Size));
|
return canInstructionRangeModify(I1, I2, Location(Ptr, Size));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -40,7 +40,7 @@ class AliasSet : public ilist_node<AliasSet> {
|
|||||||
Value *Val; // The pointer this record corresponds to.
|
Value *Val; // The pointer this record corresponds to.
|
||||||
PointerRec **PrevInList, *NextInList;
|
PointerRec **PrevInList, *NextInList;
|
||||||
AliasSet *AS;
|
AliasSet *AS;
|
||||||
unsigned Size;
|
uint64_t Size;
|
||||||
const MDNode *TBAAInfo;
|
const MDNode *TBAAInfo;
|
||||||
public:
|
public:
|
||||||
PointerRec(Value *V)
|
PointerRec(Value *V)
|
||||||
@@ -57,7 +57,7 @@ class AliasSet : public ilist_node<AliasSet> {
|
|||||||
return &NextInList;
|
return &NextInList;
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateSizeAndTBAAInfo(unsigned NewSize, const MDNode *NewTBAAInfo) {
|
void updateSizeAndTBAAInfo(uint64_t NewSize, const MDNode *NewTBAAInfo) {
|
||||||
if (NewSize > Size) Size = NewSize;
|
if (NewSize > Size) Size = NewSize;
|
||||||
|
|
||||||
if (TBAAInfo == DenseMapInfo<const MDNode *>::getEmptyKey())
|
if (TBAAInfo == DenseMapInfo<const MDNode *>::getEmptyKey())
|
||||||
@@ -68,7 +68,7 @@ class AliasSet : public ilist_node<AliasSet> {
|
|||||||
TBAAInfo = DenseMapInfo<const MDNode *>::getTombstoneKey();
|
TBAAInfo = DenseMapInfo<const MDNode *>::getTombstoneKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned getSize() const { return Size; }
|
uint64_t getSize() const { return Size; }
|
||||||
|
|
||||||
/// getTBAAInfo - Return the TBAAInfo, or null if there is no
|
/// getTBAAInfo - Return the TBAAInfo, or null if there is no
|
||||||
/// information or conflicting information.
|
/// information or conflicting information.
|
||||||
@@ -205,7 +205,7 @@ public:
|
|||||||
value_type *operator->() const { return &operator*(); }
|
value_type *operator->() const { return &operator*(); }
|
||||||
|
|
||||||
Value *getPointer() const { return CurNode->getValue(); }
|
Value *getPointer() const { return CurNode->getValue(); }
|
||||||
unsigned getSize() const { return CurNode->getSize(); }
|
uint64_t getSize() const { return CurNode->getSize(); }
|
||||||
const MDNode *getTBAAInfo() const { return CurNode->getTBAAInfo(); }
|
const MDNode *getTBAAInfo() const { return CurNode->getTBAAInfo(); }
|
||||||
|
|
||||||
iterator& operator++() { // Preincrement
|
iterator& operator++() { // Preincrement
|
||||||
@@ -250,7 +250,7 @@ private:
|
|||||||
|
|
||||||
void removeFromTracker(AliasSetTracker &AST);
|
void removeFromTracker(AliasSetTracker &AST);
|
||||||
|
|
||||||
void addPointer(AliasSetTracker &AST, PointerRec &Entry, unsigned Size,
|
void addPointer(AliasSetTracker &AST, PointerRec &Entry, uint64_t Size,
|
||||||
const MDNode *TBAAInfo,
|
const MDNode *TBAAInfo,
|
||||||
bool KnownMustAlias = false);
|
bool KnownMustAlias = false);
|
||||||
void addCallSite(CallSite CS, AliasAnalysis &AA);
|
void addCallSite(CallSite CS, AliasAnalysis &AA);
|
||||||
@@ -266,7 +266,7 @@ private:
|
|||||||
/// aliasesPointer - Return true if the specified pointer "may" (or must)
|
/// aliasesPointer - Return true if the specified pointer "may" (or must)
|
||||||
/// alias one of the members in the set.
|
/// alias one of the members in the set.
|
||||||
///
|
///
|
||||||
bool aliasesPointer(const Value *Ptr, unsigned Size, const MDNode *TBAAInfo,
|
bool aliasesPointer(const Value *Ptr, uint64_t Size, const MDNode *TBAAInfo,
|
||||||
AliasAnalysis &AA) const;
|
AliasAnalysis &AA) const;
|
||||||
bool aliasesCallSite(CallSite CS, AliasAnalysis &AA) const;
|
bool aliasesCallSite(CallSite CS, AliasAnalysis &AA) const;
|
||||||
};
|
};
|
||||||
@@ -320,7 +320,7 @@ public:
|
|||||||
/// These methods return true if inserting the instruction resulted in the
|
/// These methods return true if inserting the instruction resulted in the
|
||||||
/// addition of a new alias set (i.e., the pointer did not alias anything).
|
/// addition of a new alias set (i.e., the pointer did not alias anything).
|
||||||
///
|
///
|
||||||
bool add(Value *Ptr, unsigned Size, const MDNode *TBAAInfo); // Add a location
|
bool add(Value *Ptr, uint64_t Size, const MDNode *TBAAInfo); // Add a location
|
||||||
bool add(LoadInst *LI);
|
bool add(LoadInst *LI);
|
||||||
bool add(StoreInst *SI);
|
bool add(StoreInst *SI);
|
||||||
bool add(VAArgInst *VAAI);
|
bool add(VAArgInst *VAAI);
|
||||||
@@ -335,7 +335,7 @@ public:
|
|||||||
/// be aliased by the specified instruction. These methods return true if any
|
/// be aliased by the specified instruction. These methods return true if any
|
||||||
/// alias sets were eliminated.
|
/// alias sets were eliminated.
|
||||||
// Remove a location
|
// Remove a location
|
||||||
bool remove(Value *Ptr, unsigned Size, const MDNode *TBAAInfo);
|
bool remove(Value *Ptr, uint64_t Size, const MDNode *TBAAInfo);
|
||||||
bool remove(LoadInst *LI);
|
bool remove(LoadInst *LI);
|
||||||
bool remove(StoreInst *SI);
|
bool remove(StoreInst *SI);
|
||||||
bool remove(VAArgInst *VAAI);
|
bool remove(VAArgInst *VAAI);
|
||||||
@@ -355,13 +355,13 @@ public:
|
|||||||
/// lives in. If the New argument is non-null, this method sets the value to
|
/// lives in. If the New argument is non-null, this method sets the value to
|
||||||
/// true if a new alias set is created to contain the pointer (because the
|
/// true if a new alias set is created to contain the pointer (because the
|
||||||
/// pointer didn't alias anything).
|
/// pointer didn't alias anything).
|
||||||
AliasSet &getAliasSetForPointer(Value *P, unsigned Size,
|
AliasSet &getAliasSetForPointer(Value *P, uint64_t Size,
|
||||||
const MDNode *TBAAInfo,
|
const MDNode *TBAAInfo,
|
||||||
bool *New = 0);
|
bool *New = 0);
|
||||||
|
|
||||||
/// getAliasSetForPointerIfExists - Return the alias set containing the
|
/// getAliasSetForPointerIfExists - Return the alias set containing the
|
||||||
/// location specified if one exists, otherwise return null.
|
/// location specified if one exists, otherwise return null.
|
||||||
AliasSet *getAliasSetForPointerIfExists(Value *P, unsigned Size,
|
AliasSet *getAliasSetForPointerIfExists(Value *P, uint64_t Size,
|
||||||
const MDNode *TBAAInfo) {
|
const MDNode *TBAAInfo) {
|
||||||
return findAliasSetForPointer(P, Size, TBAAInfo);
|
return findAliasSetForPointer(P, Size, TBAAInfo);
|
||||||
}
|
}
|
||||||
@@ -369,7 +369,7 @@ public:
|
|||||||
/// containsPointer - Return true if the specified location is represented by
|
/// containsPointer - Return true if the specified location is represented by
|
||||||
/// this alias set, false otherwise. This does not modify the AST object or
|
/// this alias set, false otherwise. This does not modify the AST object or
|
||||||
/// alias sets.
|
/// alias sets.
|
||||||
bool containsPointer(Value *P, unsigned Size, const MDNode *TBAAInfo) const;
|
bool containsPointer(Value *P, uint64_t Size, const MDNode *TBAAInfo) const;
|
||||||
|
|
||||||
/// getAliasAnalysis - Return the underlying alias analysis object used by
|
/// getAliasAnalysis - Return the underlying alias analysis object used by
|
||||||
/// this tracker.
|
/// this tracker.
|
||||||
@@ -416,7 +416,7 @@ private:
|
|||||||
return *Entry;
|
return *Entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
AliasSet &addPointer(Value *P, unsigned Size, const MDNode *TBAAInfo,
|
AliasSet &addPointer(Value *P, uint64_t Size, const MDNode *TBAAInfo,
|
||||||
AliasSet::AccessType E,
|
AliasSet::AccessType E,
|
||||||
bool &NewSet) {
|
bool &NewSet) {
|
||||||
NewSet = false;
|
NewSet = false;
|
||||||
@@ -424,7 +424,7 @@ private:
|
|||||||
AS.AccessTy |= E;
|
AS.AccessTy |= E;
|
||||||
return AS;
|
return AS;
|
||||||
}
|
}
|
||||||
AliasSet *findAliasSetForPointer(const Value *Ptr, unsigned Size,
|
AliasSet *findAliasSetForPointer(const Value *Ptr, uint64_t Size,
|
||||||
const MDNode *TBAAInfo);
|
const MDNode *TBAAInfo);
|
||||||
|
|
||||||
AliasSet *findAliasSetForCallSite(CallSite CS);
|
AliasSet *findAliasSetForCallSite(CallSite CS);
|
||||||
|
@@ -283,7 +283,7 @@ void AliasAnalysis::getAnalysisUsage(AnalysisUsage &AU) const {
|
|||||||
/// getTypeStoreSize - Return the TargetData store size for the given type,
|
/// getTypeStoreSize - Return the TargetData store size for the given type,
|
||||||
/// if known, or a conservative value otherwise.
|
/// if known, or a conservative value otherwise.
|
||||||
///
|
///
|
||||||
unsigned AliasAnalysis::getTypeStoreSize(const Type *Ty) {
|
uint64_t AliasAnalysis::getTypeStoreSize(const Type *Ty) {
|
||||||
return TD ? TD->getTypeStoreSize(Ty) : UnknownSize;
|
return TD ? TD->getTypeStoreSize(Ty) : UnknownSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -168,12 +168,12 @@ bool AAEval::runOnFunction(Function &F) {
|
|||||||
// iterate over the worklist, and run the full (n^2)/2 disambiguations
|
// iterate over the worklist, and run the full (n^2)/2 disambiguations
|
||||||
for (SetVector<Value *>::iterator I1 = Pointers.begin(), E = Pointers.end();
|
for (SetVector<Value *>::iterator I1 = Pointers.begin(), E = Pointers.end();
|
||||||
I1 != E; ++I1) {
|
I1 != E; ++I1) {
|
||||||
unsigned I1Size = AliasAnalysis::UnknownSize;
|
uint64_t I1Size = AliasAnalysis::UnknownSize;
|
||||||
const Type *I1ElTy = cast<PointerType>((*I1)->getType())->getElementType();
|
const Type *I1ElTy = cast<PointerType>((*I1)->getType())->getElementType();
|
||||||
if (I1ElTy->isSized()) I1Size = AA.getTypeStoreSize(I1ElTy);
|
if (I1ElTy->isSized()) I1Size = AA.getTypeStoreSize(I1ElTy);
|
||||||
|
|
||||||
for (SetVector<Value *>::iterator I2 = Pointers.begin(); I2 != I1; ++I2) {
|
for (SetVector<Value *>::iterator I2 = Pointers.begin(); I2 != I1; ++I2) {
|
||||||
unsigned I2Size = AliasAnalysis::UnknownSize;
|
uint64_t I2Size = AliasAnalysis::UnknownSize;
|
||||||
const Type *I2ElTy =cast<PointerType>((*I2)->getType())->getElementType();
|
const Type *I2ElTy =cast<PointerType>((*I2)->getType())->getElementType();
|
||||||
if (I2ElTy->isSized()) I2Size = AA.getTypeStoreSize(I2ElTy);
|
if (I2ElTy->isSized()) I2Size = AA.getTypeStoreSize(I2ElTy);
|
||||||
|
|
||||||
@@ -200,7 +200,7 @@ bool AAEval::runOnFunction(Function &F) {
|
|||||||
|
|
||||||
for (SetVector<Value *>::iterator V = Pointers.begin(), Ve = Pointers.end();
|
for (SetVector<Value *>::iterator V = Pointers.begin(), Ve = Pointers.end();
|
||||||
V != Ve; ++V) {
|
V != Ve; ++V) {
|
||||||
unsigned Size = AliasAnalysis::UnknownSize;
|
uint64_t Size = AliasAnalysis::UnknownSize;
|
||||||
const Type *ElTy = cast<PointerType>((*V)->getType())->getElementType();
|
const Type *ElTy = cast<PointerType>((*V)->getType())->getElementType();
|
||||||
if (ElTy->isSized()) Size = AA.getTypeStoreSize(ElTy);
|
if (ElTy->isSized()) Size = AA.getTypeStoreSize(ElTy);
|
||||||
|
|
||||||
|
@@ -88,7 +88,7 @@ void AliasSet::removeFromTracker(AliasSetTracker &AST) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void AliasSet::addPointer(AliasSetTracker &AST, PointerRec &Entry,
|
void AliasSet::addPointer(AliasSetTracker &AST, PointerRec &Entry,
|
||||||
unsigned Size, const MDNode *TBAAInfo,
|
uint64_t Size, const MDNode *TBAAInfo,
|
||||||
bool KnownMustAlias) {
|
bool KnownMustAlias) {
|
||||||
assert(!Entry.hasAliasSet() && "Entry already in set!");
|
assert(!Entry.hasAliasSet() && "Entry already in set!");
|
||||||
|
|
||||||
@@ -138,7 +138,7 @@ void AliasSet::addCallSite(CallSite CS, AliasAnalysis &AA) {
|
|||||||
/// aliasesPointer - Return true if the specified pointer "may" (or must)
|
/// aliasesPointer - Return true if the specified pointer "may" (or must)
|
||||||
/// alias one of the members in the set.
|
/// alias one of the members in the set.
|
||||||
///
|
///
|
||||||
bool AliasSet::aliasesPointer(const Value *Ptr, unsigned Size,
|
bool AliasSet::aliasesPointer(const Value *Ptr, uint64_t Size,
|
||||||
const MDNode *TBAAInfo,
|
const MDNode *TBAAInfo,
|
||||||
AliasAnalysis &AA) const {
|
AliasAnalysis &AA) const {
|
||||||
if (AliasTy == MustAlias) {
|
if (AliasTy == MustAlias) {
|
||||||
@@ -210,7 +210,7 @@ void AliasSetTracker::clear() {
|
|||||||
/// that may alias the pointer, merge them together and return the unified set.
|
/// that may alias the pointer, merge them together and return the unified set.
|
||||||
///
|
///
|
||||||
AliasSet *AliasSetTracker::findAliasSetForPointer(const Value *Ptr,
|
AliasSet *AliasSetTracker::findAliasSetForPointer(const Value *Ptr,
|
||||||
unsigned Size,
|
uint64_t Size,
|
||||||
const MDNode *TBAAInfo) {
|
const MDNode *TBAAInfo) {
|
||||||
AliasSet *FoundSet = 0;
|
AliasSet *FoundSet = 0;
|
||||||
for (iterator I = begin(), E = end(); I != E; ++I) {
|
for (iterator I = begin(), E = end(); I != E; ++I) {
|
||||||
@@ -229,7 +229,7 @@ AliasSet *AliasSetTracker::findAliasSetForPointer(const Value *Ptr,
|
|||||||
/// containsPointer - Return true if the specified location is represented by
|
/// containsPointer - Return true if the specified location is represented by
|
||||||
/// this alias set, false otherwise. This does not modify the AST object or
|
/// this alias set, false otherwise. This does not modify the AST object or
|
||||||
/// alias sets.
|
/// alias sets.
|
||||||
bool AliasSetTracker::containsPointer(Value *Ptr, unsigned Size,
|
bool AliasSetTracker::containsPointer(Value *Ptr, uint64_t Size,
|
||||||
const MDNode *TBAAInfo) const {
|
const MDNode *TBAAInfo) const {
|
||||||
for (const_iterator I = begin(), E = end(); I != E; ++I)
|
for (const_iterator I = begin(), E = end(); I != E; ++I)
|
||||||
if (!I->Forward && I->aliasesPointer(Ptr, Size, TBAAInfo, AA))
|
if (!I->Forward && I->aliasesPointer(Ptr, Size, TBAAInfo, AA))
|
||||||
@@ -258,7 +258,7 @@ AliasSet *AliasSetTracker::findAliasSetForCallSite(CallSite CS) {
|
|||||||
|
|
||||||
/// getAliasSetForPointer - Return the alias set that the specified pointer
|
/// getAliasSetForPointer - Return the alias set that the specified pointer
|
||||||
/// lives in.
|
/// lives in.
|
||||||
AliasSet &AliasSetTracker::getAliasSetForPointer(Value *Pointer, unsigned Size,
|
AliasSet &AliasSetTracker::getAliasSetForPointer(Value *Pointer, uint64_t Size,
|
||||||
const MDNode *TBAAInfo,
|
const MDNode *TBAAInfo,
|
||||||
bool *New) {
|
bool *New) {
|
||||||
AliasSet::PointerRec &Entry = getEntryFor(Pointer);
|
AliasSet::PointerRec &Entry = getEntryFor(Pointer);
|
||||||
@@ -283,7 +283,7 @@ AliasSet &AliasSetTracker::getAliasSetForPointer(Value *Pointer, unsigned Size,
|
|||||||
return AliasSets.back();
|
return AliasSets.back();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AliasSetTracker::add(Value *Ptr, unsigned Size, const MDNode *TBAAInfo) {
|
bool AliasSetTracker::add(Value *Ptr, uint64_t Size, const MDNode *TBAAInfo) {
|
||||||
bool NewPtr;
|
bool NewPtr;
|
||||||
addPointer(Ptr, Size, TBAAInfo, AliasSet::NoModRef, NewPtr);
|
addPointer(Ptr, Size, TBAAInfo, AliasSet::NoModRef, NewPtr);
|
||||||
return NewPtr;
|
return NewPtr;
|
||||||
@@ -414,7 +414,7 @@ void AliasSetTracker::remove(AliasSet &AS) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
AliasSetTracker::remove(Value *Ptr, unsigned Size, const MDNode *TBAAInfo) {
|
AliasSetTracker::remove(Value *Ptr, uint64_t Size, const MDNode *TBAAInfo) {
|
||||||
AliasSet *AS = findAliasSetForPointer(Ptr, Size, TBAAInfo);
|
AliasSet *AS = findAliasSetForPointer(Ptr, Size, TBAAInfo);
|
||||||
if (!AS) return false;
|
if (!AS) return false;
|
||||||
remove(*AS);
|
remove(*AS);
|
||||||
@@ -422,7 +422,7 @@ AliasSetTracker::remove(Value *Ptr, unsigned Size, const MDNode *TBAAInfo) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool AliasSetTracker::remove(LoadInst *LI) {
|
bool AliasSetTracker::remove(LoadInst *LI) {
|
||||||
unsigned Size = AA.getTypeStoreSize(LI->getType());
|
uint64_t Size = AA.getTypeStoreSize(LI->getType());
|
||||||
const MDNode *TBAAInfo = LI->getMetadata(LLVMContext::MD_tbaa);
|
const MDNode *TBAAInfo = LI->getMetadata(LLVMContext::MD_tbaa);
|
||||||
AliasSet *AS = findAliasSetForPointer(LI->getOperand(0), Size, TBAAInfo);
|
AliasSet *AS = findAliasSetForPointer(LI->getOperand(0), Size, TBAAInfo);
|
||||||
if (!AS) return false;
|
if (!AS) return false;
|
||||||
@@ -431,7 +431,7 @@ bool AliasSetTracker::remove(LoadInst *LI) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool AliasSetTracker::remove(StoreInst *SI) {
|
bool AliasSetTracker::remove(StoreInst *SI) {
|
||||||
unsigned Size = AA.getTypeStoreSize(SI->getOperand(0)->getType());
|
uint64_t Size = AA.getTypeStoreSize(SI->getOperand(0)->getType());
|
||||||
const MDNode *TBAAInfo = SI->getMetadata(LLVMContext::MD_tbaa);
|
const MDNode *TBAAInfo = SI->getMetadata(LLVMContext::MD_tbaa);
|
||||||
AliasSet *AS = findAliasSetForPointer(SI->getOperand(1), Size, TBAAInfo);
|
AliasSet *AS = findAliasSetForPointer(SI->getOperand(1), Size, TBAAInfo);
|
||||||
if (!AS) return false;
|
if (!AS) return false;
|
||||||
|
@@ -98,7 +98,7 @@ static bool isEscapeSource(const Value *V) {
|
|||||||
|
|
||||||
/// isObjectSmallerThan - Return true if we can prove that the object specified
|
/// isObjectSmallerThan - Return true if we can prove that the object specified
|
||||||
/// by V is smaller than Size.
|
/// by V is smaller than Size.
|
||||||
static bool isObjectSmallerThan(const Value *V, unsigned Size,
|
static bool isObjectSmallerThan(const Value *V, uint64_t Size,
|
||||||
const TargetData &TD) {
|
const TargetData &TD) {
|
||||||
const Type *AccessTy;
|
const Type *AccessTy;
|
||||||
if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(V)) {
|
if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(V)) {
|
||||||
@@ -552,27 +552,27 @@ namespace {
|
|||||||
|
|
||||||
// aliasGEP - Provide a bunch of ad-hoc rules to disambiguate a GEP
|
// aliasGEP - Provide a bunch of ad-hoc rules to disambiguate a GEP
|
||||||
// instruction against another.
|
// instruction against another.
|
||||||
AliasResult aliasGEP(const GEPOperator *V1, unsigned V1Size,
|
AliasResult aliasGEP(const GEPOperator *V1, uint64_t V1Size,
|
||||||
const Value *V2, unsigned V2Size,
|
const Value *V2, uint64_t V2Size,
|
||||||
const MDNode *V2TBAAInfo,
|
const MDNode *V2TBAAInfo,
|
||||||
const Value *UnderlyingV1, const Value *UnderlyingV2);
|
const Value *UnderlyingV1, const Value *UnderlyingV2);
|
||||||
|
|
||||||
// aliasPHI - Provide a bunch of ad-hoc rules to disambiguate a PHI
|
// aliasPHI - Provide a bunch of ad-hoc rules to disambiguate a PHI
|
||||||
// instruction against another.
|
// instruction against another.
|
||||||
AliasResult aliasPHI(const PHINode *PN, unsigned PNSize,
|
AliasResult aliasPHI(const PHINode *PN, uint64_t PNSize,
|
||||||
const MDNode *PNTBAAInfo,
|
const MDNode *PNTBAAInfo,
|
||||||
const Value *V2, unsigned V2Size,
|
const Value *V2, uint64_t V2Size,
|
||||||
const MDNode *V2TBAAInfo);
|
const MDNode *V2TBAAInfo);
|
||||||
|
|
||||||
/// aliasSelect - Disambiguate a Select instruction against another value.
|
/// aliasSelect - Disambiguate a Select instruction against another value.
|
||||||
AliasResult aliasSelect(const SelectInst *SI, unsigned SISize,
|
AliasResult aliasSelect(const SelectInst *SI, uint64_t SISize,
|
||||||
const MDNode *SITBAAInfo,
|
const MDNode *SITBAAInfo,
|
||||||
const Value *V2, unsigned V2Size,
|
const Value *V2, uint64_t V2Size,
|
||||||
const MDNode *V2TBAAInfo);
|
const MDNode *V2TBAAInfo);
|
||||||
|
|
||||||
AliasResult aliasCheck(const Value *V1, unsigned V1Size,
|
AliasResult aliasCheck(const Value *V1, uint64_t V1Size,
|
||||||
const MDNode *V1TBAATag,
|
const MDNode *V1TBAATag,
|
||||||
const Value *V2, unsigned V2Size,
|
const Value *V2, uint64_t V2Size,
|
||||||
const MDNode *V2TBAATag);
|
const MDNode *V2TBAATag);
|
||||||
};
|
};
|
||||||
} // End of anonymous namespace
|
} // End of anonymous namespace
|
||||||
@@ -691,7 +691,7 @@ BasicAliasAnalysis::getModRefInfo(ImmutableCallSite CS,
|
|||||||
default: break;
|
default: break;
|
||||||
case Intrinsic::memcpy:
|
case Intrinsic::memcpy:
|
||||||
case Intrinsic::memmove: {
|
case Intrinsic::memmove: {
|
||||||
unsigned Len = UnknownSize;
|
uint64_t Len = UnknownSize;
|
||||||
if (ConstantInt *LenCI = dyn_cast<ConstantInt>(II->getArgOperand(2)))
|
if (ConstantInt *LenCI = dyn_cast<ConstantInt>(II->getArgOperand(2)))
|
||||||
Len = LenCI->getZExtValue();
|
Len = LenCI->getZExtValue();
|
||||||
Value *Dest = II->getArgOperand(0);
|
Value *Dest = II->getArgOperand(0);
|
||||||
@@ -707,7 +707,7 @@ BasicAliasAnalysis::getModRefInfo(ImmutableCallSite CS,
|
|||||||
// Since memset is 'accesses arguments' only, the AliasAnalysis base class
|
// Since memset is 'accesses arguments' only, the AliasAnalysis base class
|
||||||
// will handle it for the variable length case.
|
// will handle it for the variable length case.
|
||||||
if (ConstantInt *LenCI = dyn_cast<ConstantInt>(II->getArgOperand(2))) {
|
if (ConstantInt *LenCI = dyn_cast<ConstantInt>(II->getArgOperand(2))) {
|
||||||
unsigned Len = LenCI->getZExtValue();
|
uint64_t Len = LenCI->getZExtValue();
|
||||||
Value *Dest = II->getArgOperand(0);
|
Value *Dest = II->getArgOperand(0);
|
||||||
if (isNoAlias(Location(Dest, Len), Loc))
|
if (isNoAlias(Location(Dest, Len), Loc))
|
||||||
return NoModRef;
|
return NoModRef;
|
||||||
@@ -727,7 +727,7 @@ BasicAliasAnalysis::getModRefInfo(ImmutableCallSite CS,
|
|||||||
case Intrinsic::atomic_load_umin:
|
case Intrinsic::atomic_load_umin:
|
||||||
if (TD) {
|
if (TD) {
|
||||||
Value *Op1 = II->getArgOperand(0);
|
Value *Op1 = II->getArgOperand(0);
|
||||||
unsigned Op1Size = TD->getTypeStoreSize(Op1->getType());
|
uint64_t Op1Size = TD->getTypeStoreSize(Op1->getType());
|
||||||
MDNode *Tag = II->getMetadata(LLVMContext::MD_tbaa);
|
MDNode *Tag = II->getMetadata(LLVMContext::MD_tbaa);
|
||||||
if (isNoAlias(Location(Op1, Op1Size, Tag), Loc))
|
if (isNoAlias(Location(Op1, Op1Size, Tag), Loc))
|
||||||
return NoModRef;
|
return NoModRef;
|
||||||
@@ -736,7 +736,7 @@ BasicAliasAnalysis::getModRefInfo(ImmutableCallSite CS,
|
|||||||
case Intrinsic::lifetime_start:
|
case Intrinsic::lifetime_start:
|
||||||
case Intrinsic::lifetime_end:
|
case Intrinsic::lifetime_end:
|
||||||
case Intrinsic::invariant_start: {
|
case Intrinsic::invariant_start: {
|
||||||
unsigned PtrSize =
|
uint64_t PtrSize =
|
||||||
cast<ConstantInt>(II->getArgOperand(0))->getZExtValue();
|
cast<ConstantInt>(II->getArgOperand(0))->getZExtValue();
|
||||||
if (isNoAlias(Location(II->getArgOperand(1),
|
if (isNoAlias(Location(II->getArgOperand(1),
|
||||||
PtrSize,
|
PtrSize,
|
||||||
@@ -746,7 +746,7 @@ BasicAliasAnalysis::getModRefInfo(ImmutableCallSite CS,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Intrinsic::invariant_end: {
|
case Intrinsic::invariant_end: {
|
||||||
unsigned PtrSize =
|
uint64_t PtrSize =
|
||||||
cast<ConstantInt>(II->getArgOperand(1))->getZExtValue();
|
cast<ConstantInt>(II->getArgOperand(1))->getZExtValue();
|
||||||
if (isNoAlias(Location(II->getArgOperand(2),
|
if (isNoAlias(Location(II->getArgOperand(2),
|
||||||
PtrSize,
|
PtrSize,
|
||||||
@@ -767,8 +767,8 @@ BasicAliasAnalysis::getModRefInfo(ImmutableCallSite CS,
|
|||||||
/// UnderlyingV2 is the same for V2.
|
/// UnderlyingV2 is the same for V2.
|
||||||
///
|
///
|
||||||
AliasAnalysis::AliasResult
|
AliasAnalysis::AliasResult
|
||||||
BasicAliasAnalysis::aliasGEP(const GEPOperator *GEP1, unsigned V1Size,
|
BasicAliasAnalysis::aliasGEP(const GEPOperator *GEP1, uint64_t V1Size,
|
||||||
const Value *V2, unsigned V2Size,
|
const Value *V2, uint64_t V2Size,
|
||||||
const MDNode *V2TBAAInfo,
|
const MDNode *V2TBAAInfo,
|
||||||
const Value *UnderlyingV1,
|
const Value *UnderlyingV1,
|
||||||
const Value *UnderlyingV2) {
|
const Value *UnderlyingV2) {
|
||||||
@@ -878,8 +878,10 @@ BasicAliasAnalysis::aliasGEP(const GEPOperator *GEP1, unsigned V1Size,
|
|||||||
// If our known offset is bigger than the access size, we know we don't have
|
// If our known offset is bigger than the access size, we know we don't have
|
||||||
// an alias.
|
// an alias.
|
||||||
if (GEP1BaseOffset) {
|
if (GEP1BaseOffset) {
|
||||||
if (GEP1BaseOffset >= (int64_t)V2Size ||
|
if (GEP1BaseOffset >= 0 ?
|
||||||
GEP1BaseOffset <= -(int64_t)V1Size)
|
(V2Size != UnknownSize && (uint64_t)GEP1BaseOffset >= V2Size) :
|
||||||
|
(V1Size != UnknownSize && -(uint64_t)GEP1BaseOffset >= V1Size &&
|
||||||
|
GEP1BaseOffset != INT64_MIN))
|
||||||
return NoAlias;
|
return NoAlias;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -889,9 +891,9 @@ BasicAliasAnalysis::aliasGEP(const GEPOperator *GEP1, unsigned V1Size,
|
|||||||
/// aliasSelect - Provide a bunch of ad-hoc rules to disambiguate a Select
|
/// aliasSelect - Provide a bunch of ad-hoc rules to disambiguate a Select
|
||||||
/// instruction against another.
|
/// instruction against another.
|
||||||
AliasAnalysis::AliasResult
|
AliasAnalysis::AliasResult
|
||||||
BasicAliasAnalysis::aliasSelect(const SelectInst *SI, unsigned SISize,
|
BasicAliasAnalysis::aliasSelect(const SelectInst *SI, uint64_t SISize,
|
||||||
const MDNode *SITBAAInfo,
|
const MDNode *SITBAAInfo,
|
||||||
const Value *V2, unsigned V2Size,
|
const Value *V2, uint64_t V2Size,
|
||||||
const MDNode *V2TBAAInfo) {
|
const MDNode *V2TBAAInfo) {
|
||||||
// If this select has been visited before, we're on a use-def cycle.
|
// If this select has been visited before, we're on a use-def cycle.
|
||||||
// Such cycles are only valid when PHI nodes are involved or in unreachable
|
// Such cycles are only valid when PHI nodes are involved or in unreachable
|
||||||
@@ -939,9 +941,9 @@ BasicAliasAnalysis::aliasSelect(const SelectInst *SI, unsigned SISize,
|
|||||||
// aliasPHI - Provide a bunch of ad-hoc rules to disambiguate a PHI instruction
|
// aliasPHI - Provide a bunch of ad-hoc rules to disambiguate a PHI instruction
|
||||||
// against another.
|
// against another.
|
||||||
AliasAnalysis::AliasResult
|
AliasAnalysis::AliasResult
|
||||||
BasicAliasAnalysis::aliasPHI(const PHINode *PN, unsigned PNSize,
|
BasicAliasAnalysis::aliasPHI(const PHINode *PN, uint64_t PNSize,
|
||||||
const MDNode *PNTBAAInfo,
|
const MDNode *PNTBAAInfo,
|
||||||
const Value *V2, unsigned V2Size,
|
const Value *V2, uint64_t V2Size,
|
||||||
const MDNode *V2TBAAInfo) {
|
const MDNode *V2TBAAInfo) {
|
||||||
// The PHI node has already been visited, avoid recursion any further.
|
// The PHI node has already been visited, avoid recursion any further.
|
||||||
if (!Visited.insert(PN))
|
if (!Visited.insert(PN))
|
||||||
@@ -1013,9 +1015,9 @@ BasicAliasAnalysis::aliasPHI(const PHINode *PN, unsigned PNSize,
|
|||||||
// such as array references.
|
// such as array references.
|
||||||
//
|
//
|
||||||
AliasAnalysis::AliasResult
|
AliasAnalysis::AliasResult
|
||||||
BasicAliasAnalysis::aliasCheck(const Value *V1, unsigned V1Size,
|
BasicAliasAnalysis::aliasCheck(const Value *V1, uint64_t V1Size,
|
||||||
const MDNode *V1TBAAInfo,
|
const MDNode *V1TBAAInfo,
|
||||||
const Value *V2, unsigned V2Size,
|
const Value *V2, uint64_t V2Size,
|
||||||
const MDNode *V2TBAAInfo) {
|
const MDNode *V2TBAAInfo) {
|
||||||
// If either of the memory references is empty, it doesn't matter what the
|
// If either of the memory references is empty, it doesn't matter what the
|
||||||
// pointer values are.
|
// pointer values are.
|
||||||
|
@@ -70,7 +70,7 @@ namespace {
|
|||||||
|
|
||||||
void visitCallSite(CallSite CS);
|
void visitCallSite(CallSite CS);
|
||||||
void visitMemoryReference(Instruction &I, Value *Ptr,
|
void visitMemoryReference(Instruction &I, Value *Ptr,
|
||||||
unsigned Size, unsigned Align,
|
uint64_t Size, unsigned Align,
|
||||||
const Type *Ty, unsigned Flags);
|
const Type *Ty, unsigned Flags);
|
||||||
|
|
||||||
void visitCallInst(CallInst &I);
|
void visitCallInst(CallInst &I);
|
||||||
@@ -277,7 +277,7 @@ void Lint::visitCallSite(CallSite CS) {
|
|||||||
// Check that the memcpy arguments don't overlap. The AliasAnalysis API
|
// Check that the memcpy arguments don't overlap. The AliasAnalysis API
|
||||||
// isn't expressive enough for what we really want to do. Known partial
|
// isn't expressive enough for what we really want to do. Known partial
|
||||||
// overlap is not distinguished from the case where nothing is known.
|
// overlap is not distinguished from the case where nothing is known.
|
||||||
unsigned Size = 0;
|
uint64_t Size = 0;
|
||||||
if (const ConstantInt *Len =
|
if (const ConstantInt *Len =
|
||||||
dyn_cast<ConstantInt>(findValue(MCI->getLength(),
|
dyn_cast<ConstantInt>(findValue(MCI->getLength(),
|
||||||
/*OffsetOk=*/false)))
|
/*OffsetOk=*/false)))
|
||||||
@@ -361,7 +361,7 @@ void Lint::visitReturnInst(ReturnInst &I) {
|
|||||||
// TODO: Check that the reference is in bounds.
|
// TODO: Check that the reference is in bounds.
|
||||||
// TODO: Check readnone/readonly function attributes.
|
// TODO: Check readnone/readonly function attributes.
|
||||||
void Lint::visitMemoryReference(Instruction &I,
|
void Lint::visitMemoryReference(Instruction &I,
|
||||||
Value *Ptr, unsigned Size, unsigned Align,
|
Value *Ptr, uint64_t Size, unsigned Align,
|
||||||
const Type *Ty, unsigned Flags) {
|
const Type *Ty, unsigned Flags) {
|
||||||
// If no memory is being referenced, it doesn't matter if the pointer
|
// If no memory is being referenced, it doesn't matter if the pointer
|
||||||
// is valid.
|
// is valid.
|
||||||
|
@@ -166,7 +166,7 @@ Value *llvm::FindAvailableLoadedValue(Value *Ptr, BasicBlock *ScanBB,
|
|||||||
if (MaxInstsToScan == 0) MaxInstsToScan = ~0U;
|
if (MaxInstsToScan == 0) MaxInstsToScan = ~0U;
|
||||||
|
|
||||||
// If we're using alias analysis to disambiguate get the size of *Ptr.
|
// If we're using alias analysis to disambiguate get the size of *Ptr.
|
||||||
unsigned AccessSize = 0;
|
uint64_t AccessSize = 0;
|
||||||
if (AA) {
|
if (AA) {
|
||||||
const Type *AccessTy = cast<PointerType>(Ptr->getType())->getElementType();
|
const Type *AccessTy = cast<PointerType>(Ptr->getType())->getElementType();
|
||||||
AccessSize = AA->getTypeStoreSize(AccessTy);
|
AccessSize = AA->getTypeStoreSize(AccessTy);
|
||||||
|
@@ -451,7 +451,7 @@ bool ArgPromotion::isSafeToPromoteArgument(Argument *Arg, bool isByVal) const {
|
|||||||
|
|
||||||
const PointerType *LoadTy =
|
const PointerType *LoadTy =
|
||||||
cast<PointerType>(Load->getPointerOperand()->getType());
|
cast<PointerType>(Load->getPointerOperand()->getType());
|
||||||
unsigned LoadSize =(unsigned)TD->getTypeStoreSize(LoadTy->getElementType());
|
uint64_t LoadSize = TD->getTypeStoreSize(LoadTy->getElementType());
|
||||||
|
|
||||||
if (AA.canInstructionRangeModify(BB->front(), *Load, Arg, LoadSize))
|
if (AA.canInstructionRangeModify(BB->front(), *Load, Arg, LoadSize))
|
||||||
return false; // Pointer is invalidated!
|
return false; // Pointer is invalidated!
|
||||||
|
@@ -61,7 +61,7 @@ namespace {
|
|||||||
bool handleFreeWithNonTrivialDependency(const CallInst *F,
|
bool handleFreeWithNonTrivialDependency(const CallInst *F,
|
||||||
MemDepResult Dep);
|
MemDepResult Dep);
|
||||||
bool handleEndBlock(BasicBlock &BB);
|
bool handleEndBlock(BasicBlock &BB);
|
||||||
bool RemoveUndeadPointers(Value *Ptr, unsigned killPointerSize,
|
bool RemoveUndeadPointers(Value *Ptr, uint64_t killPointerSize,
|
||||||
BasicBlock::iterator &BBI,
|
BasicBlock::iterator &BBI,
|
||||||
SmallPtrSet<Value*, 64> &deadPointers);
|
SmallPtrSet<Value*, 64> &deadPointers);
|
||||||
void DeleteDeadInstruction(Instruction *I,
|
void DeleteDeadInstruction(Instruction *I,
|
||||||
@@ -79,7 +79,7 @@ namespace {
|
|||||||
AU.addPreserved<MemoryDependenceAnalysis>();
|
AU.addPreserved<MemoryDependenceAnalysis>();
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned getPointerSize(Value *V) const;
|
uint64_t getPointerSize(Value *V) const;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,11 +142,11 @@ static Value *getPointerOperand(Instruction *I) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// getStoreSize - Return the length in bytes of the write by the clobbering
|
/// getStoreSize - Return the length in bytes of the write by the clobbering
|
||||||
/// instruction. If variable or unknown, returns -1.
|
/// instruction. If variable or unknown, returns AliasAnalysis::UnknownSize.
|
||||||
static unsigned getStoreSize(Instruction *I, const TargetData *TD) {
|
static uint64_t getStoreSize(Instruction *I, const TargetData *TD) {
|
||||||
assert(doesClobberMemory(I));
|
assert(doesClobberMemory(I));
|
||||||
if (StoreInst *SI = dyn_cast<StoreInst>(I)) {
|
if (StoreInst *SI = dyn_cast<StoreInst>(I)) {
|
||||||
if (!TD) return -1u;
|
if (!TD) return AliasAnalysis::UnknownSize;
|
||||||
return TD->getTypeStoreSize(SI->getOperand(0)->getType());
|
return TD->getTypeStoreSize(SI->getOperand(0)->getType());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,7 +158,7 @@ static unsigned getStoreSize(Instruction *I, const TargetData *TD) {
|
|||||||
switch (II->getIntrinsicID()) {
|
switch (II->getIntrinsicID()) {
|
||||||
default: assert(false && "Unexpected intrinsic!");
|
default: assert(false && "Unexpected intrinsic!");
|
||||||
case Intrinsic::init_trampoline:
|
case Intrinsic::init_trampoline:
|
||||||
return -1u;
|
return AliasAnalysis::UnknownSize;
|
||||||
case Intrinsic::lifetime_end:
|
case Intrinsic::lifetime_end:
|
||||||
Len = II->getArgOperand(0);
|
Len = II->getArgOperand(0);
|
||||||
break;
|
break;
|
||||||
@@ -167,7 +167,7 @@ static unsigned getStoreSize(Instruction *I, const TargetData *TD) {
|
|||||||
if (ConstantInt *LenCI = dyn_cast<ConstantInt>(Len))
|
if (ConstantInt *LenCI = dyn_cast<ConstantInt>(Len))
|
||||||
if (!LenCI->isAllOnesValue())
|
if (!LenCI->isAllOnesValue())
|
||||||
return LenCI->getZExtValue();
|
return LenCI->getZExtValue();
|
||||||
return -1u;
|
return AliasAnalysis::UnknownSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// isStoreAtLeastAsWideAs - Return true if the size of the store in I1 is
|
/// isStoreAtLeastAsWideAs - Return true if the size of the store in I1 is
|
||||||
@@ -182,10 +182,12 @@ static bool isStoreAtLeastAsWideAs(Instruction *I1, Instruction *I2,
|
|||||||
// Exactly the same type, must have exactly the same size.
|
// Exactly the same type, must have exactly the same size.
|
||||||
if (I1Ty == I2Ty) return true;
|
if (I1Ty == I2Ty) return true;
|
||||||
|
|
||||||
int I1Size = getStoreSize(I1, TD);
|
uint64_t I1Size = getStoreSize(I1, TD);
|
||||||
int I2Size = getStoreSize(I2, TD);
|
uint64_t I2Size = getStoreSize(I2, TD);
|
||||||
|
|
||||||
return I1Size != -1 && I2Size != -1 && I1Size >= I2Size;
|
return I1Size != AliasAnalysis::UnknownSize &&
|
||||||
|
I2Size != AliasAnalysis::UnknownSize &&
|
||||||
|
I1Size >= I2Size;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DSE::runOnBasicBlock(BasicBlock &BB) {
|
bool DSE::runOnBasicBlock(BasicBlock &BB) {
|
||||||
@@ -373,7 +375,7 @@ bool DSE::handleEndBlock(BasicBlock &BB) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Value *killPointer = 0;
|
Value *killPointer = 0;
|
||||||
unsigned killPointerSize = AliasAnalysis::UnknownSize;
|
uint64_t killPointerSize = AliasAnalysis::UnknownSize;
|
||||||
|
|
||||||
// If we encounter a use of the pointer, it is no longer considered dead
|
// If we encounter a use of the pointer, it is no longer considered dead
|
||||||
if (LoadInst *L = dyn_cast<LoadInst>(BBI)) {
|
if (LoadInst *L = dyn_cast<LoadInst>(BBI)) {
|
||||||
@@ -472,7 +474,7 @@ bool DSE::handleEndBlock(BasicBlock &BB) {
|
|||||||
|
|
||||||
/// RemoveUndeadPointers - check for uses of a pointer that make it
|
/// RemoveUndeadPointers - check for uses of a pointer that make it
|
||||||
/// undead when scanning for dead stores to alloca's.
|
/// undead when scanning for dead stores to alloca's.
|
||||||
bool DSE::RemoveUndeadPointers(Value *killPointer, unsigned killPointerSize,
|
bool DSE::RemoveUndeadPointers(Value *killPointer, uint64_t killPointerSize,
|
||||||
BasicBlock::iterator &BBI,
|
BasicBlock::iterator &BBI,
|
||||||
SmallPtrSet<Value*, 64> &deadPointers) {
|
SmallPtrSet<Value*, 64> &deadPointers) {
|
||||||
AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
|
AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
|
||||||
@@ -565,7 +567,7 @@ void DSE::DeleteDeadInstruction(Instruction *I,
|
|||||||
} while (!NowDeadInsts.empty());
|
} while (!NowDeadInsts.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned DSE::getPointerSize(Value *V) const {
|
uint64_t DSE::getPointerSize(Value *V) const {
|
||||||
if (TD) {
|
if (TD) {
|
||||||
if (AllocaInst *A = dyn_cast<AllocaInst>(V)) {
|
if (AllocaInst *A = dyn_cast<AllocaInst>(V)) {
|
||||||
// Get size information for the alloca
|
// Get size information for the alloca
|
||||||
|
@@ -190,7 +190,7 @@ namespace {
|
|||||||
/// pointerInvalidatedByLoop - Return true if the body of this loop may
|
/// pointerInvalidatedByLoop - Return true if the body of this loop may
|
||||||
/// store into the memory location pointed to by V.
|
/// store into the memory location pointed to by V.
|
||||||
///
|
///
|
||||||
bool pointerInvalidatedByLoop(Value *V, unsigned Size,
|
bool pointerInvalidatedByLoop(Value *V, uint64_t Size,
|
||||||
const MDNode *TBAAInfo) {
|
const MDNode *TBAAInfo) {
|
||||||
// Check to see if any of the basic blocks in CurLoop invalidate *V.
|
// Check to see if any of the basic blocks in CurLoop invalidate *V.
|
||||||
return CurAST->getAliasSetForPointer(V, Size, TBAAInfo).isMod();
|
return CurAST->getAliasSetForPointer(V, Size, TBAAInfo).isMod();
|
||||||
@@ -402,7 +402,7 @@ bool LICM::canSinkOrHoistInst(Instruction &I) {
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
// Don't hoist loads which have may-aliased stores in loop.
|
// Don't hoist loads which have may-aliased stores in loop.
|
||||||
unsigned Size = 0;
|
uint64_t Size = 0;
|
||||||
if (LI->getType()->isSized())
|
if (LI->getType()->isSized())
|
||||||
Size = AA->getTypeStoreSize(LI->getType());
|
Size = AA->getTypeStoreSize(LI->getType());
|
||||||
return !pointerInvalidatedByLoop(LI->getOperand(0), Size,
|
return !pointerInvalidatedByLoop(LI->getOperand(0), Size,
|
||||||
|
@@ -772,7 +772,7 @@ bool MemCpyOpt::processMemMove(MemMoveInst *M) {
|
|||||||
|
|
||||||
// If the memmove is a constant size, use it for the alias query, this allows
|
// If the memmove is a constant size, use it for the alias query, this allows
|
||||||
// us to optimize things like: memmove(P, P+64, 64);
|
// us to optimize things like: memmove(P, P+64, 64);
|
||||||
unsigned MemMoveSize = AliasAnalysis::UnknownSize;
|
uint64_t MemMoveSize = AliasAnalysis::UnknownSize;
|
||||||
if (ConstantInt *Len = dyn_cast<ConstantInt>(M->getLength()))
|
if (ConstantInt *Len = dyn_cast<ConstantInt>(M->getLength()))
|
||||||
MemMoveSize = Len->getZExtValue();
|
MemMoveSize = Len->getZExtValue();
|
||||||
|
|
||||||
|
@@ -157,7 +157,7 @@ static bool isSafeToMove(Instruction *Inst, AliasAnalysis *AA,
|
|||||||
if (L->isVolatile()) return false;
|
if (L->isVolatile()) return false;
|
||||||
|
|
||||||
Value *Ptr = L->getPointerOperand();
|
Value *Ptr = L->getPointerOperand();
|
||||||
unsigned Size = AA->getTypeStoreSize(L->getType());
|
uint64_t Size = AA->getTypeStoreSize(L->getType());
|
||||||
for (SmallPtrSet<Instruction *, 8>::iterator I = Stores.begin(),
|
for (SmallPtrSet<Instruction *, 8>::iterator I = Stores.begin(),
|
||||||
E = Stores.end(); I != E; ++I)
|
E = Stores.end(); I != E; ++I)
|
||||||
if (AA->getModRefInfo(*I, Ptr, Size) & AliasAnalysis::Mod)
|
if (AA->getModRefInfo(*I, Ptr, Size) & AliasAnalysis::Mod)
|
||||||
|
Reference in New Issue
Block a user