mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-27 15:57:30 +00:00
AA metadata refactoring (introduce AAMDNodes)
In order to enable the preservation of noalias function parameter information after inlining, and the representation of block-level __restrict__ pointer information (etc.), additional kinds of aliasing metadata will be introduced. This metadata needs to be carried around in AliasAnalysis::Location objects (and MMOs at the SDAG level), and so we need to generalize the current scheme (which is hard-coded to just one TBAA MDNode*). This commit introduces only the necessary refactoring to allow for the introduction of other aliasing metadata types, but does not actually introduce any (that will come in a follow-up commit). What it does introduce is a new AAMDNodes structure to hold all of the aliasing metadata nodes associated with a particular memory-accessing instruction, and uses that structure instead of the raw MDNode* in AliasAnalysis::Location, etc. No functionality change intended. llvm-svn: 213859
This commit is contained in:
parent
b99eee32fb
commit
9be4aefa57
@ -39,6 +39,7 @@
|
||||
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/IR/CallSite.h"
|
||||
#include "llvm/IR/Metadata.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
@ -112,13 +113,14 @@ public:
|
||||
/// there are restrictions on stepping out of one object and into another.
|
||||
/// See http://llvm.org/docs/LangRef.html#pointeraliasing
|
||||
uint64_t Size;
|
||||
/// TBAATag - The metadata node which describes the TBAA type of
|
||||
/// the location, or null if there is no known unique tag.
|
||||
const MDNode *TBAATag;
|
||||
/// AATags - The metadata nodes which describes the aliasing of the
|
||||
/// location (each member is null if that kind of information is
|
||||
/// unavailable)..
|
||||
AAMDNodes AATags;
|
||||
|
||||
explicit Location(const Value *P = nullptr, uint64_t S = UnknownSize,
|
||||
const MDNode *N = nullptr)
|
||||
: Ptr(P), Size(S), TBAATag(N) {}
|
||||
const AAMDNodes &N = AAMDNodes())
|
||||
: Ptr(P), Size(S), AATags(N) {}
|
||||
|
||||
Location getWithNewPtr(const Value *NewPtr) const {
|
||||
Location Copy(*this);
|
||||
@ -132,9 +134,9 @@ public:
|
||||
return Copy;
|
||||
}
|
||||
|
||||
Location getWithoutTBAATag() const {
|
||||
Location getWithoutAATags() const {
|
||||
Location Copy(*this);
|
||||
Copy.TBAATag = nullptr;
|
||||
Copy.AATags = AAMDNodes();
|
||||
return Copy;
|
||||
}
|
||||
};
|
||||
@ -578,13 +580,13 @@ struct DenseMapInfo<AliasAnalysis::Location> {
|
||||
static unsigned getHashValue(const AliasAnalysis::Location &Val) {
|
||||
return DenseMapInfo<const Value *>::getHashValue(Val.Ptr) ^
|
||||
DenseMapInfo<uint64_t>::getHashValue(Val.Size) ^
|
||||
DenseMapInfo<const MDNode *>::getHashValue(Val.TBAATag);
|
||||
DenseMapInfo<AAMDNodes>::getHashValue(Val.AATags);
|
||||
}
|
||||
static bool isEqual(const AliasAnalysis::Location &LHS,
|
||||
const AliasAnalysis::Location &RHS) {
|
||||
return LHS.Ptr == RHS.Ptr &&
|
||||
LHS.Size == RHS.Size &&
|
||||
LHS.TBAATag == RHS.TBAATag;
|
||||
LHS.AATags == RHS.AATags;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/ilist.h"
|
||||
#include "llvm/ADT/ilist_node.h"
|
||||
#include "llvm/IR/Metadata.h"
|
||||
#include "llvm/IR/ValueHandle.h"
|
||||
#include <vector>
|
||||
|
||||
@ -40,11 +41,11 @@ class AliasSet : public ilist_node<AliasSet> {
|
||||
PointerRec **PrevInList, *NextInList;
|
||||
AliasSet *AS;
|
||||
uint64_t Size;
|
||||
const MDNode *TBAAInfo;
|
||||
AAMDNodes AAInfo;
|
||||
public:
|
||||
PointerRec(Value *V)
|
||||
: Val(V), PrevInList(nullptr), NextInList(nullptr), AS(nullptr), Size(0),
|
||||
TBAAInfo(DenseMapInfo<const MDNode *>::getEmptyKey()) {}
|
||||
AAInfo(DenseMapInfo<AAMDNodes>::getEmptyKey()) {}
|
||||
|
||||
Value *getValue() const { return Val; }
|
||||
|
||||
@ -56,27 +57,27 @@ class AliasSet : public ilist_node<AliasSet> {
|
||||
return &NextInList;
|
||||
}
|
||||
|
||||
void updateSizeAndTBAAInfo(uint64_t NewSize, const MDNode *NewTBAAInfo) {
|
||||
void updateSizeAndAAInfo(uint64_t NewSize, const AAMDNodes &NewAAInfo) {
|
||||
if (NewSize > Size) Size = NewSize;
|
||||
|
||||
if (TBAAInfo == DenseMapInfo<const MDNode *>::getEmptyKey())
|
||||
// We don't have a TBAAInfo yet. Set it to NewTBAAInfo.
|
||||
TBAAInfo = NewTBAAInfo;
|
||||
else if (TBAAInfo != NewTBAAInfo)
|
||||
// NewTBAAInfo conflicts with TBAAInfo.
|
||||
TBAAInfo = DenseMapInfo<const MDNode *>::getTombstoneKey();
|
||||
if (AAInfo == DenseMapInfo<AAMDNodes>::getEmptyKey())
|
||||
// We don't have a AAInfo yet. Set it to NewAAInfo.
|
||||
AAInfo = NewAAInfo;
|
||||
else if (AAInfo != NewAAInfo)
|
||||
// NewAAInfo conflicts with AAInfo.
|
||||
AAInfo = DenseMapInfo<AAMDNodes>::getTombstoneKey();
|
||||
}
|
||||
|
||||
uint64_t getSize() const { return Size; }
|
||||
|
||||
/// getTBAAInfo - Return the TBAAInfo, or null if there is no
|
||||
/// getAAInfo - Return the AAInfo, or null if there is no
|
||||
/// information or conflicting information.
|
||||
const MDNode *getTBAAInfo() const {
|
||||
// If we have missing or conflicting TBAAInfo, return null.
|
||||
if (TBAAInfo == DenseMapInfo<const MDNode *>::getEmptyKey() ||
|
||||
TBAAInfo == DenseMapInfo<const MDNode *>::getTombstoneKey())
|
||||
return nullptr;
|
||||
return TBAAInfo;
|
||||
AAMDNodes getAAInfo() const {
|
||||
// If we have missing or conflicting AAInfo, return null.
|
||||
if (AAInfo == DenseMapInfo<AAMDNodes>::getEmptyKey() ||
|
||||
AAInfo == DenseMapInfo<AAMDNodes>::getTombstoneKey())
|
||||
return AAMDNodes();
|
||||
return AAInfo;
|
||||
}
|
||||
|
||||
AliasSet *getAliasSet(AliasSetTracker &AST) {
|
||||
@ -204,7 +205,7 @@ public:
|
||||
|
||||
Value *getPointer() const { return CurNode->getValue(); }
|
||||
uint64_t getSize() const { return CurNode->getSize(); }
|
||||
const MDNode *getTBAAInfo() const { return CurNode->getTBAAInfo(); }
|
||||
AAMDNodes getAAInfo() const { return CurNode->getAAInfo(); }
|
||||
|
||||
iterator& operator++() { // Preincrement
|
||||
assert(CurNode && "Advancing past AliasSet.end()!");
|
||||
@ -250,7 +251,7 @@ private:
|
||||
void removeFromTracker(AliasSetTracker &AST);
|
||||
|
||||
void addPointer(AliasSetTracker &AST, PointerRec &Entry, uint64_t Size,
|
||||
const MDNode *TBAAInfo,
|
||||
const AAMDNodes &AAInfo,
|
||||
bool KnownMustAlias = false);
|
||||
void addUnknownInst(Instruction *I, AliasAnalysis &AA);
|
||||
void removeUnknownInst(Instruction *I) {
|
||||
@ -267,7 +268,7 @@ public:
|
||||
/// aliasesPointer - Return true if the specified pointer "may" (or must)
|
||||
/// alias one of the members in the set.
|
||||
///
|
||||
bool aliasesPointer(const Value *Ptr, uint64_t Size, const MDNode *TBAAInfo,
|
||||
bool aliasesPointer(const Value *Ptr, uint64_t Size, const AAMDNodes &AAInfo,
|
||||
AliasAnalysis &AA) const;
|
||||
bool aliasesUnknownInst(Instruction *Inst, AliasAnalysis &AA) const;
|
||||
};
|
||||
@ -322,7 +323,7 @@ public:
|
||||
/// 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).
|
||||
///
|
||||
bool add(Value *Ptr, uint64_t Size, const MDNode *TBAAInfo); // Add a location
|
||||
bool add(Value *Ptr, uint64_t Size, const AAMDNodes &AAInfo); // Add a loc.
|
||||
bool add(LoadInst *LI);
|
||||
bool add(StoreInst *SI);
|
||||
bool add(VAArgInst *VAAI);
|
||||
@ -335,7 +336,7 @@ public:
|
||||
/// be aliased by the specified instruction. These methods return true if any
|
||||
/// alias sets were eliminated.
|
||||
// Remove a location
|
||||
bool remove(Value *Ptr, uint64_t Size, const MDNode *TBAAInfo);
|
||||
bool remove(Value *Ptr, uint64_t Size, const AAMDNodes &AAInfo);
|
||||
bool remove(LoadInst *LI);
|
||||
bool remove(StoreInst *SI);
|
||||
bool remove(VAArgInst *VAAI);
|
||||
@ -354,20 +355,20 @@ public:
|
||||
/// true if a new alias set is created to contain the pointer (because the
|
||||
/// pointer didn't alias anything).
|
||||
AliasSet &getAliasSetForPointer(Value *P, uint64_t Size,
|
||||
const MDNode *TBAAInfo,
|
||||
const AAMDNodes &AAInfo,
|
||||
bool *New = nullptr);
|
||||
|
||||
/// getAliasSetForPointerIfExists - Return the alias set containing the
|
||||
/// location specified if one exists, otherwise return null.
|
||||
AliasSet *getAliasSetForPointerIfExists(Value *P, uint64_t Size,
|
||||
const MDNode *TBAAInfo) {
|
||||
return findAliasSetForPointer(P, Size, TBAAInfo);
|
||||
const AAMDNodes &AAInfo) {
|
||||
return findAliasSetForPointer(P, Size, AAInfo);
|
||||
}
|
||||
|
||||
/// containsPointer - Return true if the specified location is represented by
|
||||
/// this alias set, false otherwise. This does not modify the AST object or
|
||||
/// alias sets.
|
||||
bool containsPointer(Value *P, uint64_t Size, const MDNode *TBAAInfo) const;
|
||||
bool containsPointer(Value *P, uint64_t Size, const AAMDNodes &AAInfo) const;
|
||||
|
||||
/// getAliasAnalysis - Return the underlying alias analysis object used by
|
||||
/// this tracker.
|
||||
@ -414,16 +415,16 @@ private:
|
||||
return *Entry;
|
||||
}
|
||||
|
||||
AliasSet &addPointer(Value *P, uint64_t Size, const MDNode *TBAAInfo,
|
||||
AliasSet &addPointer(Value *P, uint64_t Size, const AAMDNodes &AAInfo,
|
||||
AliasSet::AccessType E,
|
||||
bool &NewSet) {
|
||||
NewSet = false;
|
||||
AliasSet &AS = getAliasSetForPointer(P, Size, TBAAInfo, &NewSet);
|
||||
AliasSet &AS = getAliasSetForPointer(P, Size, AAInfo, &NewSet);
|
||||
AS.AccessTy |= E;
|
||||
return AS;
|
||||
}
|
||||
AliasSet *findAliasSetForPointer(const Value *Ptr, uint64_t Size,
|
||||
const MDNode *TBAAInfo);
|
||||
const AAMDNodes &AAInfo);
|
||||
|
||||
AliasSet *findAliasSetForUnknownInst(Instruction *Inst);
|
||||
};
|
||||
|
@ -44,14 +44,14 @@ bool isSafeToLoadUnconditionally(Value *V, Instruction *ScanFrom,
|
||||
/// If it is set to 0, it will scan the whole block. You can also optionally
|
||||
/// specify an alias analysis implementation, which makes this more precise.
|
||||
///
|
||||
/// If TBAATag is non-null and a load or store is found, the TBAA tag from the
|
||||
/// load or store is recorded there. If there is no TBAA tag or if no access
|
||||
/// If AATags is non-null and a load or store is found, the AA tags from the
|
||||
/// load or store are recorded there. If there are no AA tags or if no access
|
||||
/// is found, it is left unmodified.
|
||||
Value *FindAvailableLoadedValue(Value *Ptr, BasicBlock *ScanBB,
|
||||
BasicBlock::iterator &ScanFrom,
|
||||
unsigned MaxInstsToScan = 6,
|
||||
AliasAnalysis *AA = nullptr,
|
||||
MDNode **TBAATag = nullptr);
|
||||
AAMDNodes *AATags = nullptr);
|
||||
|
||||
}
|
||||
|
||||
|
@ -281,12 +281,12 @@ namespace llvm {
|
||||
/// Size - The maximum size of the dereferences of the
|
||||
/// pointer. May be UnknownSize if the sizes are unknown.
|
||||
uint64_t Size;
|
||||
/// TBAATag - The TBAA tag associated with dereferences of the
|
||||
/// pointer. May be null if there are no tags or conflicting tags.
|
||||
const MDNode *TBAATag;
|
||||
/// AATags - The AA tags associated with dereferences of the
|
||||
/// pointer. The members may be null if there are no tags or
|
||||
/// conflicting tags.
|
||||
AAMDNodes AATags;
|
||||
|
||||
NonLocalPointerInfo()
|
||||
: Size(AliasAnalysis::UnknownSize), TBAATag(nullptr) {}
|
||||
NonLocalPointerInfo() : Size(AliasAnalysis::UnknownSize) {}
|
||||
};
|
||||
|
||||
/// CachedNonLocalPointerInfo - This map stores the cached results of doing
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "llvm/ADT/ilist.h"
|
||||
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||
#include "llvm/IR/DebugLoc.h"
|
||||
#include "llvm/IR/Metadata.h"
|
||||
#include "llvm/Support/Allocator.h"
|
||||
#include "llvm/Support/ArrayRecycler.h"
|
||||
#include "llvm/Support/Recycler.h"
|
||||
@ -399,7 +400,7 @@ public:
|
||||
MachineMemOperand *getMachineMemOperand(MachinePointerInfo PtrInfo,
|
||||
unsigned f, uint64_t s,
|
||||
unsigned base_alignment,
|
||||
const MDNode *TBAAInfo = nullptr,
|
||||
const AAMDNodes &AAInfo = AAMDNodes(),
|
||||
const MDNode *Ranges = nullptr);
|
||||
|
||||
/// getMachineMemOperand - Allocate a new MachineMemOperand by copying
|
||||
|
@ -18,6 +18,7 @@
|
||||
|
||||
#include "llvm/ADT/PointerUnion.h"
|
||||
#include "llvm/CodeGen/PseudoSourceValue.h"
|
||||
#include "llvm/IR/Metadata.h"
|
||||
#include "llvm/IR/Value.h" // PointerLikeTypeTraits<Value*>
|
||||
#include "llvm/Support/DataTypes.h"
|
||||
|
||||
@ -91,7 +92,7 @@ class MachineMemOperand {
|
||||
MachinePointerInfo PtrInfo;
|
||||
uint64_t Size;
|
||||
unsigned Flags;
|
||||
const MDNode *TBAAInfo;
|
||||
AAMDNodes AAInfo;
|
||||
const MDNode *Ranges;
|
||||
|
||||
public:
|
||||
@ -117,7 +118,8 @@ public:
|
||||
/// MachineMemOperand - Construct an MachineMemOperand object with the
|
||||
/// specified PtrInfo, flags, size, and base alignment.
|
||||
MachineMemOperand(MachinePointerInfo PtrInfo, unsigned flags, uint64_t s,
|
||||
unsigned base_alignment, const MDNode *TBAAInfo = nullptr,
|
||||
unsigned base_alignment,
|
||||
const AAMDNodes &AAInfo = AAMDNodes(),
|
||||
const MDNode *Ranges = nullptr);
|
||||
|
||||
const MachinePointerInfo &getPointerInfo() const { return PtrInfo; }
|
||||
@ -161,8 +163,8 @@ public:
|
||||
/// base address, without the offset.
|
||||
uint64_t getBaseAlignment() const { return (1u << (Flags >> MOMaxBits)) >> 1; }
|
||||
|
||||
/// getTBAAInfo - Return the TBAA tag for the memory reference.
|
||||
const MDNode *getTBAAInfo() const { return TBAAInfo; }
|
||||
/// getAAInfo - Return the AA tags for the memory reference.
|
||||
AAMDNodes getAAInfo() const { return AAInfo; }
|
||||
|
||||
/// getRanges - Return the range tag for the memory reference.
|
||||
const MDNode *getRanges() const { return Ranges; }
|
||||
|
@ -793,7 +793,7 @@ public:
|
||||
SDValue getLoad(EVT VT, SDLoc dl, SDValue Chain, SDValue Ptr,
|
||||
MachinePointerInfo PtrInfo, bool isVolatile,
|
||||
bool isNonTemporal, bool isInvariant, unsigned Alignment,
|
||||
const MDNode *TBAAInfo = nullptr,
|
||||
const AAMDNodes &AAInfo = AAMDNodes(),
|
||||
const MDNode *Ranges = nullptr);
|
||||
SDValue getLoad(EVT VT, SDLoc dl, SDValue Chain, SDValue Ptr,
|
||||
MachineMemOperand *MMO);
|
||||
@ -801,7 +801,7 @@ public:
|
||||
SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo,
|
||||
EVT MemVT, bool isVolatile,
|
||||
bool isNonTemporal, unsigned Alignment,
|
||||
const MDNode *TBAAInfo = nullptr);
|
||||
const AAMDNodes &AAInfo = AAMDNodes());
|
||||
SDValue getExtLoad(ISD::LoadExtType ExtType, SDLoc dl, EVT VT,
|
||||
SDValue Chain, SDValue Ptr, EVT MemVT,
|
||||
MachineMemOperand *MMO);
|
||||
@ -812,7 +812,7 @@ public:
|
||||
SDValue Chain, SDValue Ptr, SDValue Offset,
|
||||
MachinePointerInfo PtrInfo, EVT MemVT,
|
||||
bool isVolatile, bool isNonTemporal, bool isInvariant,
|
||||
unsigned Alignment, const MDNode *TBAAInfo = nullptr,
|
||||
unsigned Alignment, const AAMDNodes &AAInfo = AAMDNodes(),
|
||||
const MDNode *Ranges = nullptr);
|
||||
SDValue getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
|
||||
EVT VT, SDLoc dl,
|
||||
@ -824,14 +824,14 @@ public:
|
||||
SDValue getStore(SDValue Chain, SDLoc dl, SDValue Val, SDValue Ptr,
|
||||
MachinePointerInfo PtrInfo, bool isVolatile,
|
||||
bool isNonTemporal, unsigned Alignment,
|
||||
const MDNode *TBAAInfo = nullptr);
|
||||
const AAMDNodes &AAInfo = AAMDNodes());
|
||||
SDValue getStore(SDValue Chain, SDLoc dl, SDValue Val, SDValue Ptr,
|
||||
MachineMemOperand *MMO);
|
||||
SDValue getTruncStore(SDValue Chain, SDLoc dl, SDValue Val, SDValue Ptr,
|
||||
MachinePointerInfo PtrInfo, EVT TVT,
|
||||
bool isNonTemporal, bool isVolatile,
|
||||
unsigned Alignment,
|
||||
const MDNode *TBAAInfo = nullptr);
|
||||
const AAMDNodes &AAInfo = AAMDNodes());
|
||||
SDValue getTruncStore(SDValue Chain, SDLoc dl, SDValue Val, SDValue Ptr,
|
||||
EVT TVT, MachineMemOperand *MMO);
|
||||
SDValue getIndexedStore(SDValue OrigStoe, SDLoc dl, SDValue Base,
|
||||
|
@ -1088,8 +1088,8 @@ public:
|
||||
// Returns the offset from the location of the access.
|
||||
int64_t getSrcValueOffset() const { return MMO->getOffset(); }
|
||||
|
||||
/// Returns the TBAAInfo that describes the dereference.
|
||||
const MDNode *getTBAAInfo() const { return MMO->getTBAAInfo(); }
|
||||
/// Returns the AA info that describes the dereference.
|
||||
AAMDNodes getAAInfo() const { return MMO->getAAInfo(); }
|
||||
|
||||
/// Returns the Ranges that describes the dereference.
|
||||
const MDNode *getRanges() const { return MMO->getRanges(); }
|
||||
|
@ -25,6 +25,7 @@ namespace llvm {
|
||||
class FastMathFlags;
|
||||
class LLVMContext;
|
||||
class MDNode;
|
||||
struct AAMDNodes;
|
||||
|
||||
template<typename ValueSubClass, typename ItemParentClass>
|
||||
class SymbolTableListTraits;
|
||||
@ -168,6 +169,11 @@ public:
|
||||
getAllMetadataOtherThanDebugLocImpl(MDs);
|
||||
}
|
||||
|
||||
/// getAAMetadata - Fills the AAMDNodes structure with AA metadata from
|
||||
/// this instruction. When Merge is true, the existing AA metadata is
|
||||
/// merged with that from this instruction providing the most-general result.
|
||||
void getAAMetadata(AAMDNodes &N, bool Merge = false) const;
|
||||
|
||||
/// setMetadata - Set the metadata of the specified kind to the specified
|
||||
/// node. This updates/replaces metadata if already present, or removes it if
|
||||
/// Node is null.
|
||||
@ -189,6 +195,10 @@ public:
|
||||
return dropUnknownMetadata(IDs);
|
||||
}
|
||||
|
||||
/// setAAMetadata - Sets the metadata on this instruction from the
|
||||
/// AAMDNodes structure.
|
||||
void setAAMetadata(const AAMDNodes &N);
|
||||
|
||||
/// setDebugLoc - Set the debug location information for this instruction.
|
||||
void setDebugLoc(const DebugLoc &Loc) { DbgLoc = Loc; }
|
||||
|
||||
|
@ -15,6 +15,7 @@
|
||||
#ifndef LLVM_IR_MDBUILDER_H
|
||||
#define LLVM_IR_MDBUILDER_H
|
||||
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/Support/DataTypes.h"
|
||||
#include <utility>
|
||||
|
||||
@ -25,7 +26,6 @@ template <typename T> class ArrayRef;
|
||||
class LLVMContext;
|
||||
class MDNode;
|
||||
class MDString;
|
||||
class StringRef;
|
||||
|
||||
class MDBuilder {
|
||||
LLVMContext &Context;
|
||||
|
@ -17,6 +17,7 @@
|
||||
#define LLVM_IR_METADATA_H
|
||||
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/FoldingSet.h"
|
||||
#include "llvm/ADT/ilist_node.h"
|
||||
#include "llvm/ADT/iterator_range.h"
|
||||
@ -66,6 +67,49 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
/// AAMDNodes - A collection of metadata nodes that might be associated with a
|
||||
/// memory access used by the alias-analysis infrastructure.
|
||||
struct AAMDNodes {
|
||||
AAMDNodes(MDNode *T = nullptr)
|
||||
: TBAA(T) {}
|
||||
|
||||
bool operator == (const AAMDNodes &A) const {
|
||||
return equals(A);
|
||||
}
|
||||
|
||||
bool operator != (const AAMDNodes &A) const {
|
||||
return !equals(A);
|
||||
}
|
||||
|
||||
operator bool() const {
|
||||
return TBAA;
|
||||
}
|
||||
|
||||
/// TBAA - The tag for type-based alias analysis.
|
||||
MDNode *TBAA;
|
||||
|
||||
protected:
|
||||
bool equals(const AAMDNodes &A) const {
|
||||
return TBAA == A.TBAA;
|
||||
}
|
||||
};
|
||||
|
||||
// Specialize DenseMapInfo for AAMDNodes.
|
||||
template<>
|
||||
struct DenseMapInfo<AAMDNodes> {
|
||||
static inline AAMDNodes getEmptyKey() {
|
||||
return AAMDNodes(DenseMapInfo<MDNode *>::getEmptyKey());
|
||||
}
|
||||
static inline AAMDNodes getTombstoneKey() {
|
||||
return AAMDNodes(DenseMapInfo<MDNode *>::getTombstoneKey());
|
||||
}
|
||||
static unsigned getHashValue(const AAMDNodes &Val) {
|
||||
return DenseMapInfo<MDNode *>::getHashValue(Val.TBAA);
|
||||
}
|
||||
static bool isEqual(const AAMDNodes &LHS, const AAMDNodes &RHS) {
|
||||
return LHS == RHS;
|
||||
}
|
||||
};
|
||||
|
||||
class MDNodeOperand;
|
||||
|
||||
@ -171,6 +215,7 @@ public:
|
||||
|
||||
/// Methods for metadata merging.
|
||||
static MDNode *getMostGenericTBAA(MDNode *A, MDNode *B);
|
||||
static AAMDNodes getMostGenericAA(const AAMDNodes &A, const AAMDNodes &B);
|
||||
static MDNode *getMostGenericFPMath(MDNode *A, MDNode *B);
|
||||
static MDNode *getMostGenericRange(MDNode *A, MDNode *B);
|
||||
private:
|
||||
|
@ -252,35 +252,45 @@ AliasAnalysis::getModRefBehavior(const Function *F) {
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
AliasAnalysis::Location AliasAnalysis::getLocation(const LoadInst *LI) {
|
||||
AAMDNodes AATags;
|
||||
LI->getAAMetadata(AATags);
|
||||
|
||||
return Location(LI->getPointerOperand(),
|
||||
getTypeStoreSize(LI->getType()),
|
||||
LI->getMetadata(LLVMContext::MD_tbaa));
|
||||
getTypeStoreSize(LI->getType()), AATags);
|
||||
}
|
||||
|
||||
AliasAnalysis::Location AliasAnalysis::getLocation(const StoreInst *SI) {
|
||||
AAMDNodes AATags;
|
||||
SI->getAAMetadata(AATags);
|
||||
|
||||
return Location(SI->getPointerOperand(),
|
||||
getTypeStoreSize(SI->getValueOperand()->getType()),
|
||||
SI->getMetadata(LLVMContext::MD_tbaa));
|
||||
getTypeStoreSize(SI->getValueOperand()->getType()), AATags);
|
||||
}
|
||||
|
||||
AliasAnalysis::Location AliasAnalysis::getLocation(const VAArgInst *VI) {
|
||||
return Location(VI->getPointerOperand(),
|
||||
UnknownSize,
|
||||
VI->getMetadata(LLVMContext::MD_tbaa));
|
||||
AAMDNodes AATags;
|
||||
VI->getAAMetadata(AATags);
|
||||
|
||||
return Location(VI->getPointerOperand(), UnknownSize, AATags);
|
||||
}
|
||||
|
||||
AliasAnalysis::Location
|
||||
AliasAnalysis::getLocation(const AtomicCmpXchgInst *CXI) {
|
||||
AAMDNodes AATags;
|
||||
CXI->getAAMetadata(AATags);
|
||||
|
||||
return Location(CXI->getPointerOperand(),
|
||||
getTypeStoreSize(CXI->getCompareOperand()->getType()),
|
||||
CXI->getMetadata(LLVMContext::MD_tbaa));
|
||||
AATags);
|
||||
}
|
||||
|
||||
AliasAnalysis::Location
|
||||
AliasAnalysis::getLocation(const AtomicRMWInst *RMWI) {
|
||||
AAMDNodes AATags;
|
||||
RMWI->getAAMetadata(AATags);
|
||||
|
||||
return Location(RMWI->getPointerOperand(),
|
||||
getTypeStoreSize(RMWI->getValOperand()->getType()),
|
||||
RMWI->getMetadata(LLVMContext::MD_tbaa));
|
||||
getTypeStoreSize(RMWI->getValOperand()->getType()), AATags);
|
||||
}
|
||||
|
||||
AliasAnalysis::Location
|
||||
@ -289,11 +299,12 @@ AliasAnalysis::getLocationForSource(const MemTransferInst *MTI) {
|
||||
if (ConstantInt *C = dyn_cast<ConstantInt>(MTI->getLength()))
|
||||
Size = C->getValue().getZExtValue();
|
||||
|
||||
// memcpy/memmove can have TBAA tags. For memcpy, they apply
|
||||
// memcpy/memmove can have AA tags. For memcpy, they apply
|
||||
// to both the source and the destination.
|
||||
MDNode *TBAATag = MTI->getMetadata(LLVMContext::MD_tbaa);
|
||||
|
||||
return Location(MTI->getRawSource(), Size, TBAATag);
|
||||
AAMDNodes AATags;
|
||||
MTI->getAAMetadata(AATags);
|
||||
|
||||
return Location(MTI->getRawSource(), Size, AATags);
|
||||
}
|
||||
|
||||
AliasAnalysis::Location
|
||||
@ -302,11 +313,12 @@ AliasAnalysis::getLocationForDest(const MemIntrinsic *MTI) {
|
||||
if (ConstantInt *C = dyn_cast<ConstantInt>(MTI->getLength()))
|
||||
Size = C->getValue().getZExtValue();
|
||||
|
||||
// memcpy/memmove can have TBAA tags. For memcpy, they apply
|
||||
// memcpy/memmove can have AA tags. For memcpy, they apply
|
||||
// to both the source and the destination.
|
||||
MDNode *TBAATag = MTI->getMetadata(LLVMContext::MD_tbaa);
|
||||
|
||||
return Location(MTI->getRawDest(), Size, TBAATag);
|
||||
AAMDNodes AATags;
|
||||
MTI->getMetadata(AATags);
|
||||
|
||||
return Location(MTI->getRawDest(), Size, AATags);
|
||||
}
|
||||
|
||||
|
||||
|
@ -43,7 +43,7 @@ static cl::opt<bool> PrintMod("print-mod", cl::ReallyHidden);
|
||||
static cl::opt<bool> PrintRef("print-ref", cl::ReallyHidden);
|
||||
static cl::opt<bool> PrintModRef("print-modref", cl::ReallyHidden);
|
||||
|
||||
static cl::opt<bool> EvalTBAA("evaluate-tbaa", cl::ReallyHidden);
|
||||
static cl::opt<bool> EvalAAMD("evaluate-aa-metadata", cl::ReallyHidden);
|
||||
|
||||
namespace {
|
||||
class AAEval : public FunctionPass {
|
||||
@ -153,9 +153,9 @@ bool AAEval::runOnFunction(Function &F) {
|
||||
for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I) {
|
||||
if (I->getType()->isPointerTy()) // Add all pointer instructions.
|
||||
Pointers.insert(&*I);
|
||||
if (EvalTBAA && isa<LoadInst>(&*I))
|
||||
if (EvalAAMD && isa<LoadInst>(&*I))
|
||||
Loads.insert(&*I);
|
||||
if (EvalTBAA && isa<StoreInst>(&*I))
|
||||
if (EvalAAMD && isa<StoreInst>(&*I))
|
||||
Stores.insert(&*I);
|
||||
Instruction &Inst = *I;
|
||||
if (CallSite CS = cast<Value>(&Inst)) {
|
||||
@ -213,7 +213,7 @@ bool AAEval::runOnFunction(Function &F) {
|
||||
}
|
||||
}
|
||||
|
||||
if (EvalTBAA) {
|
||||
if (EvalAAMD) {
|
||||
// iterate over all pairs of load, store
|
||||
for (SetVector<Value *>::iterator I1 = Loads.begin(), E = Loads.end();
|
||||
I1 != E; ++I1) {
|
||||
|
@ -47,10 +47,10 @@ void AliasSet::mergeSetIn(AliasSet &AS, AliasSetTracker &AST) {
|
||||
// If the pointers are not a must-alias pair, this set becomes a may alias.
|
||||
if (AA.alias(AliasAnalysis::Location(L->getValue(),
|
||||
L->getSize(),
|
||||
L->getTBAAInfo()),
|
||||
L->getAAInfo()),
|
||||
AliasAnalysis::Location(R->getValue(),
|
||||
R->getSize(),
|
||||
R->getTBAAInfo()))
|
||||
R->getAAInfo()))
|
||||
!= AliasAnalysis::MustAlias)
|
||||
AliasTy = MayAlias;
|
||||
}
|
||||
@ -92,7 +92,7 @@ void AliasSet::removeFromTracker(AliasSetTracker &AST) {
|
||||
}
|
||||
|
||||
void AliasSet::addPointer(AliasSetTracker &AST, PointerRec &Entry,
|
||||
uint64_t Size, const MDNode *TBAAInfo,
|
||||
uint64_t Size, const AAMDNodes &AAInfo,
|
||||
bool KnownMustAlias) {
|
||||
assert(!Entry.hasAliasSet() && "Entry already in set!");
|
||||
|
||||
@ -102,17 +102,17 @@ void AliasSet::addPointer(AliasSetTracker &AST, PointerRec &Entry,
|
||||
AliasAnalysis &AA = AST.getAliasAnalysis();
|
||||
AliasAnalysis::AliasResult Result =
|
||||
AA.alias(AliasAnalysis::Location(P->getValue(), P->getSize(),
|
||||
P->getTBAAInfo()),
|
||||
AliasAnalysis::Location(Entry.getValue(), Size, TBAAInfo));
|
||||
P->getAAInfo()),
|
||||
AliasAnalysis::Location(Entry.getValue(), Size, AAInfo));
|
||||
if (Result != AliasAnalysis::MustAlias)
|
||||
AliasTy = MayAlias;
|
||||
else // First entry of must alias must have maximum size!
|
||||
P->updateSizeAndTBAAInfo(Size, TBAAInfo);
|
||||
P->updateSizeAndAAInfo(Size, AAInfo);
|
||||
assert(Result != AliasAnalysis::NoAlias && "Cannot be part of must set!");
|
||||
}
|
||||
|
||||
Entry.setAliasSet(this);
|
||||
Entry.updateSizeAndTBAAInfo(Size, TBAAInfo);
|
||||
Entry.updateSizeAndAAInfo(Size, AAInfo);
|
||||
|
||||
// Add it to the end of the list...
|
||||
assert(*PtrListEnd == nullptr && "End of list is not null?");
|
||||
@ -140,7 +140,7 @@ void AliasSet::addUnknownInst(Instruction *I, AliasAnalysis &AA) {
|
||||
/// alias one of the members in the set.
|
||||
///
|
||||
bool AliasSet::aliasesPointer(const Value *Ptr, uint64_t Size,
|
||||
const MDNode *TBAAInfo,
|
||||
const AAMDNodes &AAInfo,
|
||||
AliasAnalysis &AA) const {
|
||||
if (AliasTy == MustAlias) {
|
||||
assert(UnknownInsts.empty() && "Illegal must alias set!");
|
||||
@ -151,23 +151,23 @@ bool AliasSet::aliasesPointer(const Value *Ptr, uint64_t Size,
|
||||
assert(SomePtr && "Empty must-alias set??");
|
||||
return AA.alias(AliasAnalysis::Location(SomePtr->getValue(),
|
||||
SomePtr->getSize(),
|
||||
SomePtr->getTBAAInfo()),
|
||||
AliasAnalysis::Location(Ptr, Size, TBAAInfo));
|
||||
SomePtr->getAAInfo()),
|
||||
AliasAnalysis::Location(Ptr, Size, AAInfo));
|
||||
}
|
||||
|
||||
// If this is a may-alias set, we have to check all of the pointers in the set
|
||||
// to be sure it doesn't alias the set...
|
||||
for (iterator I = begin(), E = end(); I != E; ++I)
|
||||
if (AA.alias(AliasAnalysis::Location(Ptr, Size, TBAAInfo),
|
||||
if (AA.alias(AliasAnalysis::Location(Ptr, Size, AAInfo),
|
||||
AliasAnalysis::Location(I.getPointer(), I.getSize(),
|
||||
I.getTBAAInfo())))
|
||||
I.getAAInfo())))
|
||||
return true;
|
||||
|
||||
// Check the unknown instructions...
|
||||
if (!UnknownInsts.empty()) {
|
||||
for (unsigned i = 0, e = UnknownInsts.size(); i != e; ++i)
|
||||
if (AA.getModRefInfo(UnknownInsts[i],
|
||||
AliasAnalysis::Location(Ptr, Size, TBAAInfo)) !=
|
||||
AliasAnalysis::Location(Ptr, Size, AAInfo)) !=
|
||||
AliasAnalysis::NoModRef)
|
||||
return true;
|
||||
}
|
||||
@ -190,7 +190,7 @@ bool AliasSet::aliasesUnknownInst(Instruction *Inst, AliasAnalysis &AA) const {
|
||||
for (iterator I = begin(), E = end(); I != E; ++I)
|
||||
if (AA.getModRefInfo(Inst, AliasAnalysis::Location(I.getPointer(),
|
||||
I.getSize(),
|
||||
I.getTBAAInfo())) !=
|
||||
I.getAAInfo())) !=
|
||||
AliasAnalysis::NoModRef)
|
||||
return true;
|
||||
|
||||
@ -216,10 +216,10 @@ void AliasSetTracker::clear() {
|
||||
///
|
||||
AliasSet *AliasSetTracker::findAliasSetForPointer(const Value *Ptr,
|
||||
uint64_t Size,
|
||||
const MDNode *TBAAInfo) {
|
||||
const AAMDNodes &AAInfo) {
|
||||
AliasSet *FoundSet = nullptr;
|
||||
for (iterator I = begin(), E = end(); I != E; ++I) {
|
||||
if (I->Forward || !I->aliasesPointer(Ptr, Size, TBAAInfo, AA)) continue;
|
||||
if (I->Forward || !I->aliasesPointer(Ptr, Size, AAInfo, AA)) continue;
|
||||
|
||||
if (!FoundSet) { // If this is the first alias set ptr can go into.
|
||||
FoundSet = I; // Remember it.
|
||||
@ -235,9 +235,9 @@ AliasSet *AliasSetTracker::findAliasSetForPointer(const Value *Ptr,
|
||||
/// this alias set, false otherwise. This does not modify the AST object or
|
||||
/// alias sets.
|
||||
bool AliasSetTracker::containsPointer(Value *Ptr, uint64_t Size,
|
||||
const MDNode *TBAAInfo) const {
|
||||
const AAMDNodes &AAInfo) const {
|
||||
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, AAInfo, AA))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
@ -264,67 +264,75 @@ AliasSet *AliasSetTracker::findAliasSetForUnknownInst(Instruction *Inst) {
|
||||
/// getAliasSetForPointer - Return the alias set that the specified pointer
|
||||
/// lives in.
|
||||
AliasSet &AliasSetTracker::getAliasSetForPointer(Value *Pointer, uint64_t Size,
|
||||
const MDNode *TBAAInfo,
|
||||
const AAMDNodes &AAInfo,
|
||||
bool *New) {
|
||||
AliasSet::PointerRec &Entry = getEntryFor(Pointer);
|
||||
|
||||
// Check to see if the pointer is already known.
|
||||
if (Entry.hasAliasSet()) {
|
||||
Entry.updateSizeAndTBAAInfo(Size, TBAAInfo);
|
||||
Entry.updateSizeAndAAInfo(Size, AAInfo);
|
||||
// Return the set!
|
||||
return *Entry.getAliasSet(*this)->getForwardedTarget(*this);
|
||||
}
|
||||
|
||||
if (AliasSet *AS = findAliasSetForPointer(Pointer, Size, TBAAInfo)) {
|
||||
if (AliasSet *AS = findAliasSetForPointer(Pointer, Size, AAInfo)) {
|
||||
// Add it to the alias set it aliases.
|
||||
AS->addPointer(*this, Entry, Size, TBAAInfo);
|
||||
AS->addPointer(*this, Entry, Size, AAInfo);
|
||||
return *AS;
|
||||
}
|
||||
|
||||
if (New) *New = true;
|
||||
// Otherwise create a new alias set to hold the loaded pointer.
|
||||
AliasSets.push_back(new AliasSet());
|
||||
AliasSets.back().addPointer(*this, Entry, Size, TBAAInfo);
|
||||
AliasSets.back().addPointer(*this, Entry, Size, AAInfo);
|
||||
return AliasSets.back();
|
||||
}
|
||||
|
||||
bool AliasSetTracker::add(Value *Ptr, uint64_t Size, const MDNode *TBAAInfo) {
|
||||
bool AliasSetTracker::add(Value *Ptr, uint64_t Size, const AAMDNodes &AAInfo) {
|
||||
bool NewPtr;
|
||||
addPointer(Ptr, Size, TBAAInfo, AliasSet::NoModRef, NewPtr);
|
||||
addPointer(Ptr, Size, AAInfo, AliasSet::NoModRef, NewPtr);
|
||||
return NewPtr;
|
||||
}
|
||||
|
||||
|
||||
bool AliasSetTracker::add(LoadInst *LI) {
|
||||
if (LI->getOrdering() > Monotonic) return addUnknown(LI);
|
||||
|
||||
AAMDNodes AAInfo;
|
||||
LI->getAAMetadata(AAInfo);
|
||||
|
||||
AliasSet::AccessType ATy = AliasSet::Refs;
|
||||
bool NewPtr;
|
||||
AliasSet &AS = addPointer(LI->getOperand(0),
|
||||
AA.getTypeStoreSize(LI->getType()),
|
||||
LI->getMetadata(LLVMContext::MD_tbaa),
|
||||
ATy, NewPtr);
|
||||
AAInfo, ATy, NewPtr);
|
||||
if (LI->isVolatile()) AS.setVolatile();
|
||||
return NewPtr;
|
||||
}
|
||||
|
||||
bool AliasSetTracker::add(StoreInst *SI) {
|
||||
if (SI->getOrdering() > Monotonic) return addUnknown(SI);
|
||||
|
||||
AAMDNodes AAInfo;
|
||||
SI->getAAMetadata(AAInfo);
|
||||
|
||||
AliasSet::AccessType ATy = AliasSet::Mods;
|
||||
bool NewPtr;
|
||||
Value *Val = SI->getOperand(0);
|
||||
AliasSet &AS = addPointer(SI->getOperand(1),
|
||||
AA.getTypeStoreSize(Val->getType()),
|
||||
SI->getMetadata(LLVMContext::MD_tbaa),
|
||||
ATy, NewPtr);
|
||||
AAInfo, ATy, NewPtr);
|
||||
if (SI->isVolatile()) AS.setVolatile();
|
||||
return NewPtr;
|
||||
}
|
||||
|
||||
bool AliasSetTracker::add(VAArgInst *VAAI) {
|
||||
AAMDNodes AAInfo;
|
||||
VAAI->getAAMetadata(AAInfo);
|
||||
|
||||
bool NewPtr;
|
||||
addPointer(VAAI->getOperand(0), AliasAnalysis::UnknownSize,
|
||||
VAAI->getMetadata(LLVMContext::MD_tbaa),
|
||||
AliasSet::ModRef, NewPtr);
|
||||
AAInfo, AliasSet::ModRef, NewPtr);
|
||||
return NewPtr;
|
||||
}
|
||||
|
||||
@ -382,7 +390,7 @@ void AliasSetTracker::add(const AliasSetTracker &AST) {
|
||||
bool X;
|
||||
for (AliasSet::iterator ASI = AS.begin(), E = AS.end(); ASI != E; ++ASI) {
|
||||
AliasSet &NewAS = addPointer(ASI.getPointer(), ASI.getSize(),
|
||||
ASI.getTBAAInfo(),
|
||||
ASI.getAAInfo(),
|
||||
(AliasSet::AccessType)AS.AccessTy, X);
|
||||
if (AS.isVolatile()) NewAS.setVolatile();
|
||||
}
|
||||
@ -419,8 +427,8 @@ void AliasSetTracker::remove(AliasSet &AS) {
|
||||
}
|
||||
|
||||
bool
|
||||
AliasSetTracker::remove(Value *Ptr, uint64_t Size, const MDNode *TBAAInfo) {
|
||||
AliasSet *AS = findAliasSetForPointer(Ptr, Size, TBAAInfo);
|
||||
AliasSetTracker::remove(Value *Ptr, uint64_t Size, const AAMDNodes &AAInfo) {
|
||||
AliasSet *AS = findAliasSetForPointer(Ptr, Size, AAInfo);
|
||||
if (!AS) return false;
|
||||
remove(*AS);
|
||||
return true;
|
||||
@ -428,8 +436,11 @@ AliasSetTracker::remove(Value *Ptr, uint64_t Size, const MDNode *TBAAInfo) {
|
||||
|
||||
bool AliasSetTracker::remove(LoadInst *LI) {
|
||||
uint64_t Size = AA.getTypeStoreSize(LI->getType());
|
||||
const MDNode *TBAAInfo = LI->getMetadata(LLVMContext::MD_tbaa);
|
||||
AliasSet *AS = findAliasSetForPointer(LI->getOperand(0), Size, TBAAInfo);
|
||||
|
||||
AAMDNodes AAInfo;
|
||||
LI->getAAMetadata(AAInfo);
|
||||
|
||||
AliasSet *AS = findAliasSetForPointer(LI->getOperand(0), Size, AAInfo);
|
||||
if (!AS) return false;
|
||||
remove(*AS);
|
||||
return true;
|
||||
@ -437,17 +448,22 @@ bool AliasSetTracker::remove(LoadInst *LI) {
|
||||
|
||||
bool AliasSetTracker::remove(StoreInst *SI) {
|
||||
uint64_t Size = AA.getTypeStoreSize(SI->getOperand(0)->getType());
|
||||
const MDNode *TBAAInfo = SI->getMetadata(LLVMContext::MD_tbaa);
|
||||
AliasSet *AS = findAliasSetForPointer(SI->getOperand(1), Size, TBAAInfo);
|
||||
|
||||
AAMDNodes AAInfo;
|
||||
SI->getAAMetadata(AAInfo);
|
||||
|
||||
AliasSet *AS = findAliasSetForPointer(SI->getOperand(1), Size, AAInfo);
|
||||
if (!AS) return false;
|
||||
remove(*AS);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool AliasSetTracker::remove(VAArgInst *VAAI) {
|
||||
AAMDNodes AAInfo;
|
||||
VAAI->getAAMetadata(AAInfo);
|
||||
|
||||
AliasSet *AS = findAliasSetForPointer(VAAI->getOperand(0),
|
||||
AliasAnalysis::UnknownSize,
|
||||
VAAI->getMetadata(LLVMContext::MD_tbaa));
|
||||
AliasAnalysis::UnknownSize, AAInfo);
|
||||
if (!AS) return false;
|
||||
remove(*AS);
|
||||
return true;
|
||||
@ -536,7 +552,7 @@ void AliasSetTracker::copyValue(Value *From, Value *To) {
|
||||
I = PointerMap.find_as(From);
|
||||
AliasSet *AS = I->second->getAliasSet(*this);
|
||||
AS->addPointer(*this, Entry, I->second->getSize(),
|
||||
I->second->getTBAAInfo(),
|
||||
I->second->getAAInfo(),
|
||||
true);
|
||||
}
|
||||
|
||||
|
@ -456,8 +456,8 @@ namespace {
|
||||
assert(AliasCache.empty() && "AliasCache must be cleared after use!");
|
||||
assert(notDifferentParent(LocA.Ptr, LocB.Ptr) &&
|
||||
"BasicAliasAnalysis doesn't support interprocedural queries.");
|
||||
AliasResult Alias = aliasCheck(LocA.Ptr, LocA.Size, LocA.TBAATag,
|
||||
LocB.Ptr, LocB.Size, LocB.TBAATag);
|
||||
AliasResult Alias = aliasCheck(LocA.Ptr, LocA.Size, LocA.AATags,
|
||||
LocB.Ptr, LocB.Size, LocB.AATags);
|
||||
// AliasCache rarely has more than 1 or 2 elements, always use
|
||||
// shrink_and_clear so it quickly returns to the inline capacity of the
|
||||
// SmallDenseMap if it ever grows larger.
|
||||
@ -544,28 +544,28 @@ namespace {
|
||||
// aliasGEP - Provide a bunch of ad-hoc rules to disambiguate a GEP
|
||||
// instruction against another.
|
||||
AliasResult aliasGEP(const GEPOperator *V1, uint64_t V1Size,
|
||||
const MDNode *V1TBAAInfo,
|
||||
const AAMDNodes &V1AAInfo,
|
||||
const Value *V2, uint64_t V2Size,
|
||||
const MDNode *V2TBAAInfo,
|
||||
const AAMDNodes &V2AAInfo,
|
||||
const Value *UnderlyingV1, const Value *UnderlyingV2);
|
||||
|
||||
// aliasPHI - Provide a bunch of ad-hoc rules to disambiguate a PHI
|
||||
// instruction against another.
|
||||
AliasResult aliasPHI(const PHINode *PN, uint64_t PNSize,
|
||||
const MDNode *PNTBAAInfo,
|
||||
const AAMDNodes &PNAAInfo,
|
||||
const Value *V2, uint64_t V2Size,
|
||||
const MDNode *V2TBAAInfo);
|
||||
const AAMDNodes &V2AAInfo);
|
||||
|
||||
/// aliasSelect - Disambiguate a Select instruction against another value.
|
||||
AliasResult aliasSelect(const SelectInst *SI, uint64_t SISize,
|
||||
const MDNode *SITBAAInfo,
|
||||
const AAMDNodes &SIAAInfo,
|
||||
const Value *V2, uint64_t V2Size,
|
||||
const MDNode *V2TBAAInfo);
|
||||
const AAMDNodes &V2AAInfo);
|
||||
|
||||
AliasResult aliasCheck(const Value *V1, uint64_t V1Size,
|
||||
const MDNode *V1TBAATag,
|
||||
AAMDNodes V1AATag,
|
||||
const Value *V2, uint64_t V2Size,
|
||||
const MDNode *V2TBAATag);
|
||||
AAMDNodes V2AATag);
|
||||
};
|
||||
} // End of anonymous namespace
|
||||
|
||||
@ -851,9 +851,9 @@ BasicAliasAnalysis::getModRefInfo(ImmutableCallSite CS,
|
||||
///
|
||||
AliasAnalysis::AliasResult
|
||||
BasicAliasAnalysis::aliasGEP(const GEPOperator *GEP1, uint64_t V1Size,
|
||||
const MDNode *V1TBAAInfo,
|
||||
const AAMDNodes &V1AAInfo,
|
||||
const Value *V2, uint64_t V2Size,
|
||||
const MDNode *V2TBAAInfo,
|
||||
const AAMDNodes &V2AAInfo,
|
||||
const Value *UnderlyingV1,
|
||||
const Value *UnderlyingV2) {
|
||||
int64_t GEP1BaseOffset;
|
||||
@ -873,8 +873,8 @@ BasicAliasAnalysis::aliasGEP(const GEPOperator *GEP1, uint64_t V1Size,
|
||||
if ((BaseAlias == MayAlias) && V1Size == V2Size) {
|
||||
// Do the base pointers alias assuming type and size.
|
||||
AliasResult PreciseBaseAlias = aliasCheck(UnderlyingV1, V1Size,
|
||||
V1TBAAInfo, UnderlyingV2,
|
||||
V2Size, V2TBAAInfo);
|
||||
V1AAInfo, UnderlyingV2,
|
||||
V2Size, V2AAInfo);
|
||||
if (PreciseBaseAlias == NoAlias) {
|
||||
// See if the computed offset from the common pointer tells us about the
|
||||
// relation of the resulting pointer.
|
||||
@ -950,7 +950,7 @@ BasicAliasAnalysis::aliasGEP(const GEPOperator *GEP1, uint64_t V1Size,
|
||||
return MayAlias;
|
||||
|
||||
AliasResult R = aliasCheck(UnderlyingV1, UnknownSize, nullptr,
|
||||
V2, V2Size, V2TBAAInfo);
|
||||
V2, V2Size, V2AAInfo);
|
||||
if (R != MustAlias)
|
||||
// If V2 may alias GEP base pointer, conservatively returns MayAlias.
|
||||
// If V2 is known not to alias GEP base pointer, then the two values
|
||||
@ -1056,33 +1056,33 @@ MergeAliasResults(AliasAnalysis::AliasResult A, AliasAnalysis::AliasResult B) {
|
||||
/// instruction against another.
|
||||
AliasAnalysis::AliasResult
|
||||
BasicAliasAnalysis::aliasSelect(const SelectInst *SI, uint64_t SISize,
|
||||
const MDNode *SITBAAInfo,
|
||||
const AAMDNodes &SIAAInfo,
|
||||
const Value *V2, uint64_t V2Size,
|
||||
const MDNode *V2TBAAInfo) {
|
||||
const AAMDNodes &V2AAInfo) {
|
||||
// If the values are Selects with the same condition, we can do a more precise
|
||||
// check: just check for aliases between the values on corresponding arms.
|
||||
if (const SelectInst *SI2 = dyn_cast<SelectInst>(V2))
|
||||
if (SI->getCondition() == SI2->getCondition()) {
|
||||
AliasResult Alias =
|
||||
aliasCheck(SI->getTrueValue(), SISize, SITBAAInfo,
|
||||
SI2->getTrueValue(), V2Size, V2TBAAInfo);
|
||||
aliasCheck(SI->getTrueValue(), SISize, SIAAInfo,
|
||||
SI2->getTrueValue(), V2Size, V2AAInfo);
|
||||
if (Alias == MayAlias)
|
||||
return MayAlias;
|
||||
AliasResult ThisAlias =
|
||||
aliasCheck(SI->getFalseValue(), SISize, SITBAAInfo,
|
||||
SI2->getFalseValue(), V2Size, V2TBAAInfo);
|
||||
aliasCheck(SI->getFalseValue(), SISize, SIAAInfo,
|
||||
SI2->getFalseValue(), V2Size, V2AAInfo);
|
||||
return MergeAliasResults(ThisAlias, Alias);
|
||||
}
|
||||
|
||||
// If both arms of the Select node NoAlias or MustAlias V2, then returns
|
||||
// NoAlias / MustAlias. Otherwise, returns MayAlias.
|
||||
AliasResult Alias =
|
||||
aliasCheck(V2, V2Size, V2TBAAInfo, SI->getTrueValue(), SISize, SITBAAInfo);
|
||||
aliasCheck(V2, V2Size, V2AAInfo, SI->getTrueValue(), SISize, SIAAInfo);
|
||||
if (Alias == MayAlias)
|
||||
return MayAlias;
|
||||
|
||||
AliasResult ThisAlias =
|
||||
aliasCheck(V2, V2Size, V2TBAAInfo, SI->getFalseValue(), SISize, SITBAAInfo);
|
||||
aliasCheck(V2, V2Size, V2AAInfo, SI->getFalseValue(), SISize, SIAAInfo);
|
||||
return MergeAliasResults(ThisAlias, Alias);
|
||||
}
|
||||
|
||||
@ -1090,9 +1090,9 @@ BasicAliasAnalysis::aliasSelect(const SelectInst *SI, uint64_t SISize,
|
||||
// against another.
|
||||
AliasAnalysis::AliasResult
|
||||
BasicAliasAnalysis::aliasPHI(const PHINode *PN, uint64_t PNSize,
|
||||
const MDNode *PNTBAAInfo,
|
||||
const AAMDNodes &PNAAInfo,
|
||||
const Value *V2, uint64_t V2Size,
|
||||
const MDNode *V2TBAAInfo) {
|
||||
const AAMDNodes &V2AAInfo) {
|
||||
// Track phi nodes we have visited. We use this information when we determine
|
||||
// value equivalence.
|
||||
VisitedPhiBBs.insert(PN->getParent());
|
||||
@ -1102,8 +1102,8 @@ BasicAliasAnalysis::aliasPHI(const PHINode *PN, uint64_t PNSize,
|
||||
// on corresponding edges.
|
||||
if (const PHINode *PN2 = dyn_cast<PHINode>(V2))
|
||||
if (PN2->getParent() == PN->getParent()) {
|
||||
LocPair Locs(Location(PN, PNSize, PNTBAAInfo),
|
||||
Location(V2, V2Size, V2TBAAInfo));
|
||||
LocPair Locs(Location(PN, PNSize, PNAAInfo),
|
||||
Location(V2, V2Size, V2AAInfo));
|
||||
if (PN > V2)
|
||||
std::swap(Locs.first, Locs.second);
|
||||
// Analyse the PHIs' inputs under the assumption that the PHIs are
|
||||
@ -1121,9 +1121,9 @@ BasicAliasAnalysis::aliasPHI(const PHINode *PN, uint64_t PNSize,
|
||||
|
||||
for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
|
||||
AliasResult ThisAlias =
|
||||
aliasCheck(PN->getIncomingValue(i), PNSize, PNTBAAInfo,
|
||||
aliasCheck(PN->getIncomingValue(i), PNSize, PNAAInfo,
|
||||
PN2->getIncomingValueForBlock(PN->getIncomingBlock(i)),
|
||||
V2Size, V2TBAAInfo);
|
||||
V2Size, V2AAInfo);
|
||||
Alias = MergeAliasResults(ThisAlias, Alias);
|
||||
if (Alias == MayAlias)
|
||||
break;
|
||||
@ -1150,8 +1150,8 @@ BasicAliasAnalysis::aliasPHI(const PHINode *PN, uint64_t PNSize,
|
||||
V1Srcs.push_back(PV1);
|
||||
}
|
||||
|
||||
AliasResult Alias = aliasCheck(V2, V2Size, V2TBAAInfo,
|
||||
V1Srcs[0], PNSize, PNTBAAInfo);
|
||||
AliasResult Alias = aliasCheck(V2, V2Size, V2AAInfo,
|
||||
V1Srcs[0], PNSize, PNAAInfo);
|
||||
// Early exit if the check of the first PHI source against V2 is MayAlias.
|
||||
// Other results are not possible.
|
||||
if (Alias == MayAlias)
|
||||
@ -1162,8 +1162,8 @@ BasicAliasAnalysis::aliasPHI(const PHINode *PN, uint64_t PNSize,
|
||||
for (unsigned i = 1, e = V1Srcs.size(); i != e; ++i) {
|
||||
Value *V = V1Srcs[i];
|
||||
|
||||
AliasResult ThisAlias = aliasCheck(V2, V2Size, V2TBAAInfo,
|
||||
V, PNSize, PNTBAAInfo);
|
||||
AliasResult ThisAlias = aliasCheck(V2, V2Size, V2AAInfo,
|
||||
V, PNSize, PNAAInfo);
|
||||
Alias = MergeAliasResults(ThisAlias, Alias);
|
||||
if (Alias == MayAlias)
|
||||
break;
|
||||
@ -1177,9 +1177,9 @@ BasicAliasAnalysis::aliasPHI(const PHINode *PN, uint64_t PNSize,
|
||||
//
|
||||
AliasAnalysis::AliasResult
|
||||
BasicAliasAnalysis::aliasCheck(const Value *V1, uint64_t V1Size,
|
||||
const MDNode *V1TBAAInfo,
|
||||
AAMDNodes V1AAInfo,
|
||||
const Value *V2, uint64_t V2Size,
|
||||
const MDNode *V2TBAAInfo) {
|
||||
AAMDNodes V2AAInfo) {
|
||||
// If either of the memory references is empty, it doesn't matter what the
|
||||
// pointer values are.
|
||||
if (V1Size == 0 || V2Size == 0)
|
||||
@ -1259,8 +1259,8 @@ BasicAliasAnalysis::aliasCheck(const Value *V1, uint64_t V1Size,
|
||||
|
||||
// Check the cache before climbing up use-def chains. This also terminates
|
||||
// otherwise infinitely recursive queries.
|
||||
LocPair Locs(Location(V1, V1Size, V1TBAAInfo),
|
||||
Location(V2, V2Size, V2TBAAInfo));
|
||||
LocPair Locs(Location(V1, V1Size, V1AAInfo),
|
||||
Location(V2, V2Size, V2AAInfo));
|
||||
if (V1 > V2)
|
||||
std::swap(Locs.first, Locs.second);
|
||||
std::pair<AliasCacheTy::iterator, bool> Pair =
|
||||
@ -1274,32 +1274,32 @@ BasicAliasAnalysis::aliasCheck(const Value *V1, uint64_t V1Size,
|
||||
std::swap(V1, V2);
|
||||
std::swap(V1Size, V2Size);
|
||||
std::swap(O1, O2);
|
||||
std::swap(V1TBAAInfo, V2TBAAInfo);
|
||||
std::swap(V1AAInfo, V2AAInfo);
|
||||
}
|
||||
if (const GEPOperator *GV1 = dyn_cast<GEPOperator>(V1)) {
|
||||
AliasResult Result = aliasGEP(GV1, V1Size, V1TBAAInfo, V2, V2Size, V2TBAAInfo, O1, O2);
|
||||
AliasResult Result = aliasGEP(GV1, V1Size, V1AAInfo, V2, V2Size, V2AAInfo, O1, O2);
|
||||
if (Result != MayAlias) return AliasCache[Locs] = Result;
|
||||
}
|
||||
|
||||
if (isa<PHINode>(V2) && !isa<PHINode>(V1)) {
|
||||
std::swap(V1, V2);
|
||||
std::swap(V1Size, V2Size);
|
||||
std::swap(V1TBAAInfo, V2TBAAInfo);
|
||||
std::swap(V1AAInfo, V2AAInfo);
|
||||
}
|
||||
if (const PHINode *PN = dyn_cast<PHINode>(V1)) {
|
||||
AliasResult Result = aliasPHI(PN, V1Size, V1TBAAInfo,
|
||||
V2, V2Size, V2TBAAInfo);
|
||||
AliasResult Result = aliasPHI(PN, V1Size, V1AAInfo,
|
||||
V2, V2Size, V2AAInfo);
|
||||
if (Result != MayAlias) return AliasCache[Locs] = Result;
|
||||
}
|
||||
|
||||
if (isa<SelectInst>(V2) && !isa<SelectInst>(V1)) {
|
||||
std::swap(V1, V2);
|
||||
std::swap(V1Size, V2Size);
|
||||
std::swap(V1TBAAInfo, V2TBAAInfo);
|
||||
std::swap(V1AAInfo, V2AAInfo);
|
||||
}
|
||||
if (const SelectInst *S1 = dyn_cast<SelectInst>(V1)) {
|
||||
AliasResult Result = aliasSelect(S1, V1Size, V1TBAAInfo,
|
||||
V2, V2Size, V2TBAAInfo);
|
||||
AliasResult Result = aliasSelect(S1, V1Size, V1AAInfo,
|
||||
V2, V2Size, V2AAInfo);
|
||||
if (Result != MayAlias) return AliasCache[Locs] = Result;
|
||||
}
|
||||
|
||||
@ -1312,8 +1312,8 @@ BasicAliasAnalysis::aliasCheck(const Value *V1, uint64_t V1Size,
|
||||
return AliasCache[Locs] = PartialAlias;
|
||||
|
||||
AliasResult Result =
|
||||
AliasAnalysis::alias(Location(V1, V1Size, V1TBAAInfo),
|
||||
Location(V2, V2Size, V2TBAAInfo));
|
||||
AliasAnalysis::alias(Location(V1, V1Size, V1AAInfo),
|
||||
Location(V2, V2Size, V2AAInfo));
|
||||
return AliasCache[Locs] = Result;
|
||||
}
|
||||
|
||||
|
@ -133,14 +133,14 @@ bool llvm::isSafeToLoadUnconditionally(Value *V, Instruction *ScanFrom,
|
||||
/// it is set to 0, it will scan the whole block. You can also optionally
|
||||
/// specify an alias analysis implementation, which makes this more precise.
|
||||
///
|
||||
/// If TBAATag is non-null and a load or store is found, the TBAA tag from the
|
||||
/// load or store is recorded there. If there is no TBAA tag or if no access
|
||||
/// If AATags is non-null and a load or store is found, the AA tags from the
|
||||
/// load or store are recorded there. If there are no AA tags or if no access
|
||||
/// is found, it is left unmodified.
|
||||
Value *llvm::FindAvailableLoadedValue(Value *Ptr, BasicBlock *ScanBB,
|
||||
BasicBlock::iterator &ScanFrom,
|
||||
unsigned MaxInstsToScan,
|
||||
AliasAnalysis *AA,
|
||||
MDNode **TBAATag) {
|
||||
AAMDNodes *AATags) {
|
||||
if (MaxInstsToScan == 0) MaxInstsToScan = ~0U;
|
||||
|
||||
// If we're using alias analysis to disambiguate get the size of *Ptr.
|
||||
@ -169,7 +169,7 @@ Value *llvm::FindAvailableLoadedValue(Value *Ptr, BasicBlock *ScanBB,
|
||||
// those cases are unlikely.)
|
||||
if (LoadInst *LI = dyn_cast<LoadInst>(Inst))
|
||||
if (AreEquivalentAddressValues(LI->getOperand(0), Ptr)) {
|
||||
if (TBAATag) *TBAATag = LI->getMetadata(LLVMContext::MD_tbaa);
|
||||
if (AATags) LI->getAAMetadata(*AATags);
|
||||
return LI;
|
||||
}
|
||||
|
||||
@ -178,7 +178,7 @@ Value *llvm::FindAvailableLoadedValue(Value *Ptr, BasicBlock *ScanBB,
|
||||
// (This is true even if the store is volatile or atomic, although
|
||||
// those cases are unlikely.)
|
||||
if (AreEquivalentAddressValues(SI->getOperand(1), Ptr)) {
|
||||
if (TBAATag) *TBAATag = SI->getMetadata(LLVMContext::MD_tbaa);
|
||||
if (AATags) SI->getAAMetadata(*AATags);
|
||||
return SI->getOperand(0);
|
||||
}
|
||||
|
||||
|
@ -158,29 +158,32 @@ AliasAnalysis::ModRefResult GetLocation(const Instruction *Inst,
|
||||
return AliasAnalysis::Mod;
|
||||
}
|
||||
|
||||
if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(Inst))
|
||||
if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(Inst)) {
|
||||
AAMDNodes AAInfo;
|
||||
|
||||
switch (II->getIntrinsicID()) {
|
||||
case Intrinsic::lifetime_start:
|
||||
case Intrinsic::lifetime_end:
|
||||
case Intrinsic::invariant_start:
|
||||
II->getAAMetadata(AAInfo);
|
||||
Loc = AliasAnalysis::Location(II->getArgOperand(1),
|
||||
cast<ConstantInt>(II->getArgOperand(0))
|
||||
->getZExtValue(),
|
||||
II->getMetadata(LLVMContext::MD_tbaa));
|
||||
->getZExtValue(), AAInfo);
|
||||
// These intrinsics don't really modify the memory, but returning Mod
|
||||
// will allow them to be handled conservatively.
|
||||
return AliasAnalysis::Mod;
|
||||
case Intrinsic::invariant_end:
|
||||
II->getAAMetadata(AAInfo);
|
||||
Loc = AliasAnalysis::Location(II->getArgOperand(2),
|
||||
cast<ConstantInt>(II->getArgOperand(1))
|
||||
->getZExtValue(),
|
||||
II->getMetadata(LLVMContext::MD_tbaa));
|
||||
->getZExtValue(), AAInfo);
|
||||
// These intrinsics don't really modify the memory, but returning Mod
|
||||
// will allow them to be handled conservatively.
|
||||
return AliasAnalysis::Mod;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Otherwise, just do the coarse-grained thing that always works.
|
||||
if (Inst->mayWriteToMemory())
|
||||
@ -922,10 +925,10 @@ getNonLocalPointerDepFromBB(const PHITransAddr &Pointer,
|
||||
// Set up a temporary NLPI value. If the map doesn't yet have an entry for
|
||||
// CacheKey, this value will be inserted as the associated value. Otherwise,
|
||||
// it'll be ignored, and we'll have to check to see if the cached size and
|
||||
// tbaa tag are consistent with the current query.
|
||||
// aa tags are consistent with the current query.
|
||||
NonLocalPointerInfo InitialNLPI;
|
||||
InitialNLPI.Size = Loc.Size;
|
||||
InitialNLPI.TBAATag = Loc.TBAATag;
|
||||
InitialNLPI.AATags = Loc.AATags;
|
||||
|
||||
// Get the NLPI for CacheKey, inserting one into the map if it doesn't
|
||||
// already have one.
|
||||
@ -955,21 +958,21 @@ getNonLocalPointerDepFromBB(const PHITransAddr &Pointer,
|
||||
SkipFirstBlock);
|
||||
}
|
||||
|
||||
// If the query's TBAATag is inconsistent with the cached one,
|
||||
// If the query's AATags are inconsistent with the cached one,
|
||||
// conservatively throw out the cached data and restart the query with
|
||||
// no tag if needed.
|
||||
if (CacheInfo->TBAATag != Loc.TBAATag) {
|
||||
if (CacheInfo->TBAATag) {
|
||||
if (CacheInfo->AATags != Loc.AATags) {
|
||||
if (CacheInfo->AATags) {
|
||||
CacheInfo->Pair = BBSkipFirstBlockPair();
|
||||
CacheInfo->TBAATag = nullptr;
|
||||
CacheInfo->AATags = AAMDNodes();
|
||||
for (NonLocalDepInfo::iterator DI = CacheInfo->NonLocalDeps.begin(),
|
||||
DE = CacheInfo->NonLocalDeps.end(); DI != DE; ++DI)
|
||||
if (Instruction *Inst = DI->getResult().getInst())
|
||||
RemoveFromReverseMap(ReverseNonLocalPtrDeps, Inst, CacheKey);
|
||||
CacheInfo->NonLocalDeps.clear();
|
||||
}
|
||||
if (Loc.TBAATag)
|
||||
return getNonLocalPointerDepFromBB(Pointer, Loc.getWithoutTBAATag(),
|
||||
if (Loc.AATags)
|
||||
return getNonLocalPointerDepFromBB(Pointer, Loc.getWithoutAATags(),
|
||||
isLoad, StartBB, Result, Visited,
|
||||
SkipFirstBlock);
|
||||
}
|
||||
|
@ -162,10 +162,10 @@ ScalarEvolutionAliasAnalysis::alias(const Location &LocA,
|
||||
if ((AO && AO != LocA.Ptr) || (BO && BO != LocB.Ptr))
|
||||
if (alias(Location(AO ? AO : LocA.Ptr,
|
||||
AO ? +UnknownSize : LocA.Size,
|
||||
AO ? nullptr : LocA.TBAATag),
|
||||
AO ? AAMDNodes() : LocA.AATags),
|
||||
Location(BO ? BO : LocB.Ptr,
|
||||
BO ? +UnknownSize : LocB.Size,
|
||||
BO ? nullptr : LocB.TBAATag)) == NoAlias)
|
||||
BO ? AAMDNodes() : LocB.AATags)) == NoAlias)
|
||||
return NoAlias;
|
||||
|
||||
// Forward the query to the next analysis.
|
||||
|
@ -454,9 +454,9 @@ TypeBasedAliasAnalysis::alias(const Location &LocA,
|
||||
|
||||
// Get the attached MDNodes. If either value lacks a tbaa MDNode, we must
|
||||
// be conservative.
|
||||
const MDNode *AM = LocA.TBAATag;
|
||||
const MDNode *AM = LocA.AATags.TBAA;
|
||||
if (!AM) return AliasAnalysis::alias(LocA, LocB);
|
||||
const MDNode *BM = LocB.TBAATag;
|
||||
const MDNode *BM = LocB.AATags.TBAA;
|
||||
if (!BM) return AliasAnalysis::alias(LocA, LocB);
|
||||
|
||||
// If they may alias, chain to the next AliasAnalysis.
|
||||
@ -472,7 +472,7 @@ bool TypeBasedAliasAnalysis::pointsToConstantMemory(const Location &Loc,
|
||||
if (!EnableTBAA)
|
||||
return AliasAnalysis::pointsToConstantMemory(Loc, OrLocal);
|
||||
|
||||
const MDNode *M = Loc.TBAATag;
|
||||
const MDNode *M = Loc.AATags.TBAA;
|
||||
if (!M) return AliasAnalysis::pointsToConstantMemory(Loc, OrLocal);
|
||||
|
||||
// If this is an "immutable" type, we can assume the pointer is pointing
|
||||
@ -513,7 +513,7 @@ TypeBasedAliasAnalysis::getModRefInfo(ImmutableCallSite CS,
|
||||
if (!EnableTBAA)
|
||||
return AliasAnalysis::getModRefInfo(CS, Loc);
|
||||
|
||||
if (const MDNode *L = Loc.TBAATag)
|
||||
if (const MDNode *L = Loc.AATags.TBAA)
|
||||
if (const MDNode *M =
|
||||
CS.getInstruction()->getMetadata(LLVMContext::MD_tbaa))
|
||||
if (!Aliases(L, M))
|
||||
@ -611,3 +611,12 @@ MDNode *MDNode::getMostGenericTBAA(MDNode *A, MDNode *B) {
|
||||
Value *Ops[3] = { Ret, Ret, ConstantInt::get(Int64, 0) };
|
||||
return MDNode::get(A->getContext(), Ops);
|
||||
}
|
||||
|
||||
void Instruction::getAAMetadata(AAMDNodes &N, bool Merge) const {
|
||||
if (Merge)
|
||||
N.TBAA = MDNode::getMostGenericTBAA(N.TBAA,
|
||||
getMetadata(LLVMContext::MD_tbaa));
|
||||
else
|
||||
N.TBAA = getMetadata(LLVMContext::MD_tbaa);
|
||||
}
|
||||
|
||||
|
@ -229,10 +229,10 @@ MachineFunction::DeleteMachineBasicBlock(MachineBasicBlock *MBB) {
|
||||
MachineMemOperand *
|
||||
MachineFunction::getMachineMemOperand(MachinePointerInfo PtrInfo, unsigned f,
|
||||
uint64_t s, unsigned base_alignment,
|
||||
const MDNode *TBAAInfo,
|
||||
const AAMDNodes &AAInfo,
|
||||
const MDNode *Ranges) {
|
||||
return new (Allocator) MachineMemOperand(PtrInfo, f, s, base_alignment,
|
||||
TBAAInfo, Ranges);
|
||||
AAInfo, Ranges);
|
||||
}
|
||||
|
||||
MachineMemOperand *
|
||||
@ -279,7 +279,7 @@ MachineFunction::extractLoadMemRefs(MachineInstr::mmo_iterator Begin,
|
||||
getMachineMemOperand((*I)->getPointerInfo(),
|
||||
(*I)->getFlags() & ~MachineMemOperand::MOStore,
|
||||
(*I)->getSize(), (*I)->getBaseAlignment(),
|
||||
(*I)->getTBAAInfo());
|
||||
(*I)->getAAInfo());
|
||||
Result[Index] = JustLoad;
|
||||
}
|
||||
++Index;
|
||||
@ -311,7 +311,7 @@ MachineFunction::extractStoreMemRefs(MachineInstr::mmo_iterator Begin,
|
||||
getMachineMemOperand((*I)->getPointerInfo(),
|
||||
(*I)->getFlags() & ~MachineMemOperand::MOLoad,
|
||||
(*I)->getSize(), (*I)->getBaseAlignment(),
|
||||
(*I)->getTBAAInfo());
|
||||
(*I)->getAAInfo());
|
||||
Result[Index] = JustStore;
|
||||
}
|
||||
++Index;
|
||||
|
@ -429,11 +429,11 @@ MachinePointerInfo MachinePointerInfo::getStack(int64_t Offset) {
|
||||
|
||||
MachineMemOperand::MachineMemOperand(MachinePointerInfo ptrinfo, unsigned f,
|
||||
uint64_t s, unsigned int a,
|
||||
const MDNode *TBAAInfo,
|
||||
const AAMDNodes &AAInfo,
|
||||
const MDNode *Ranges)
|
||||
: PtrInfo(ptrinfo), Size(s),
|
||||
Flags((f & ((1 << MOMaxBits) - 1)) | ((Log2_32(a) + 1) << MOMaxBits)),
|
||||
TBAAInfo(TBAAInfo), Ranges(Ranges) {
|
||||
AAInfo(AAInfo), Ranges(Ranges) {
|
||||
assert((PtrInfo.V.isNull() || PtrInfo.V.is<const PseudoSourceValue*>() ||
|
||||
isa<PointerType>(PtrInfo.V.get<const Value*>()->getType())) &&
|
||||
"invalid pointer value");
|
||||
@ -514,7 +514,7 @@ raw_ostream &llvm::operator<<(raw_ostream &OS, const MachineMemOperand &MMO) {
|
||||
OS << "(align=" << MMO.getAlignment() << ")";
|
||||
|
||||
// Print TBAA info.
|
||||
if (const MDNode *TBAAInfo = MMO.getTBAAInfo()) {
|
||||
if (const MDNode *TBAAInfo = MMO.getAAInfo().TBAA) {
|
||||
OS << "(tbaa=";
|
||||
if (TBAAInfo->getNumOperands() > 0)
|
||||
TBAAInfo->getOperand(0)->printAsOperand(OS, /*PrintType=*/false);
|
||||
@ -1379,7 +1379,7 @@ bool MachineInstr::isInvariantLoad(AliasAnalysis *AA) const {
|
||||
// If we have an AliasAnalysis, ask it whether the memory is constant.
|
||||
if (AA && AA->pointsToConstantMemory(
|
||||
AliasAnalysis::Location(V, (*I)->getSize(),
|
||||
(*I)->getTBAAInfo())))
|
||||
(*I)->getAAInfo())))
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -563,9 +563,9 @@ static bool MIsNeedChainEdge(AliasAnalysis *AA, const MachineFrameInfo *MFI,
|
||||
|
||||
AliasAnalysis::AliasResult AAResult = AA->alias(
|
||||
AliasAnalysis::Location(MMOa->getValue(), Overlapa,
|
||||
UseTBAA ? MMOa->getTBAAInfo() : nullptr),
|
||||
UseTBAA ? MMOa->getAAInfo() : AAMDNodes()),
|
||||
AliasAnalysis::Location(MMOb->getValue(), Overlapb,
|
||||
UseTBAA ? MMOb->getTBAAInfo() : nullptr));
|
||||
UseTBAA ? MMOb->getAAInfo() : AAMDNodes()));
|
||||
|
||||
return (AAResult != AliasAnalysis::NoAlias);
|
||||
}
|
||||
|
@ -2949,7 +2949,7 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
|
||||
LN0->getChain(), NewPtr,
|
||||
LN0->getPointerInfo(),
|
||||
ExtVT, LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
Alignment, LN0->getTBAAInfo());
|
||||
Alignment, LN0->getAAInfo());
|
||||
AddToWorklist(N);
|
||||
CombineTo(LN0, Load, Load.getValue(1));
|
||||
return SDValue(N, 0); // Return N so it doesn't get rechecked!
|
||||
@ -5814,12 +5814,12 @@ SDValue DAGCombiner::ReduceLoadWidth(SDNode *N) {
|
||||
Load = DAG.getLoad(VT, SDLoc(N0), LN0->getChain(), NewPtr,
|
||||
LN0->getPointerInfo().getWithOffset(PtrOff),
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->isInvariant(), NewAlign, LN0->getTBAAInfo());
|
||||
LN0->isInvariant(), NewAlign, LN0->getAAInfo());
|
||||
else
|
||||
Load = DAG.getExtLoad(ExtType, SDLoc(N0), VT, LN0->getChain(),NewPtr,
|
||||
LN0->getPointerInfo().getWithOffset(PtrOff),
|
||||
ExtVT, LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
NewAlign, LN0->getTBAAInfo());
|
||||
NewAlign, LN0->getAAInfo());
|
||||
|
||||
// Replace the old load's chain with the new load's chain.
|
||||
WorklistRemover DeadNodes(*this);
|
||||
@ -6272,7 +6272,7 @@ SDValue DAGCombiner::visitBITCAST(SDNode *N) {
|
||||
LN0->getBasePtr(), LN0->getPointerInfo(),
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->isInvariant(), OrigAlign,
|
||||
LN0->getTBAAInfo());
|
||||
LN0->getAAInfo());
|
||||
AddToWorklist(N);
|
||||
CombineTo(N0.getNode(),
|
||||
DAG.getNode(ISD::BITCAST, SDLoc(N0),
|
||||
@ -8038,7 +8038,7 @@ SDValue DAGCombiner::visitLOAD(SDNode *N) {
|
||||
Chain, Ptr, LD->getPointerInfo(),
|
||||
LD->getMemoryVT(),
|
||||
LD->isVolatile(), LD->isNonTemporal(), Align,
|
||||
LD->getTBAAInfo());
|
||||
LD->getAAInfo());
|
||||
return CombineTo(N, NewLoad, SDValue(NewLoad.getNode(), 1), true);
|
||||
}
|
||||
}
|
||||
@ -8874,7 +8874,7 @@ SDValue DAGCombiner::ReduceLoadOpStoreWidth(SDNode *N) {
|
||||
LD->getPointerInfo().getWithOffset(PtrOff),
|
||||
LD->isVolatile(), LD->isNonTemporal(),
|
||||
LD->isInvariant(), NewAlign,
|
||||
LD->getTBAAInfo());
|
||||
LD->getAAInfo());
|
||||
SDValue NewVal = DAG.getNode(Opc, SDLoc(Value), NewVT, NewLD,
|
||||
DAG.getConstant(NewImm, NewVT));
|
||||
SDValue NewST = DAG.getStore(Chain, SDLoc(N),
|
||||
@ -9536,7 +9536,7 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
|
||||
return DAG.getStore(Chain, SDLoc(N), Value.getOperand(0),
|
||||
Ptr, ST->getPointerInfo(), ST->isVolatile(),
|
||||
ST->isNonTemporal(), OrigAlign,
|
||||
ST->getTBAAInfo());
|
||||
ST->getAAInfo());
|
||||
}
|
||||
|
||||
// Turn 'store undef, Ptr' -> nothing.
|
||||
@ -9590,19 +9590,19 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
|
||||
unsigned Alignment = ST->getAlignment();
|
||||
bool isVolatile = ST->isVolatile();
|
||||
bool isNonTemporal = ST->isNonTemporal();
|
||||
const MDNode *TBAAInfo = ST->getTBAAInfo();
|
||||
AAMDNodes AAInfo = ST->getAAInfo();
|
||||
|
||||
SDValue St0 = DAG.getStore(Chain, SDLoc(ST), Lo,
|
||||
Ptr, ST->getPointerInfo(),
|
||||
isVolatile, isNonTemporal,
|
||||
ST->getAlignment(), TBAAInfo);
|
||||
ST->getAlignment(), AAInfo);
|
||||
Ptr = DAG.getNode(ISD::ADD, SDLoc(N), Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(4, Ptr.getValueType()));
|
||||
Alignment = MinAlign(Alignment, 4U);
|
||||
SDValue St1 = DAG.getStore(Chain, SDLoc(ST), Hi,
|
||||
Ptr, ST->getPointerInfo().getWithOffset(4),
|
||||
isVolatile, isNonTemporal,
|
||||
Alignment, TBAAInfo);
|
||||
Alignment, AAInfo);
|
||||
return DAG.getNode(ISD::TokenFactor, SDLoc(N), MVT::Other,
|
||||
St0, St1);
|
||||
}
|
||||
@ -9619,7 +9619,7 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
|
||||
return DAG.getTruncStore(Chain, SDLoc(N), Value,
|
||||
Ptr, ST->getPointerInfo(), ST->getMemoryVT(),
|
||||
ST->isVolatile(), ST->isNonTemporal(), Align,
|
||||
ST->getTBAAInfo());
|
||||
ST->getAAInfo());
|
||||
}
|
||||
}
|
||||
|
||||
@ -10010,13 +10010,13 @@ SDValue DAGCombiner::visitEXTRACT_VECTOR_ELT(SDNode *N) {
|
||||
Load = DAG.getExtLoad(ExtType, SDLoc(N), NVT, LN0->getChain(),
|
||||
NewPtr, LN0->getPointerInfo().getWithOffset(PtrOff),
|
||||
LVT, LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
Align, LN0->getTBAAInfo());
|
||||
Align, LN0->getAAInfo());
|
||||
Chain = Load.getValue(1);
|
||||
} else {
|
||||
Load = DAG.getLoad(LVT, SDLoc(N), LN0->getChain(), NewPtr,
|
||||
LN0->getPointerInfo().getWithOffset(PtrOff),
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->isInvariant(), Align, LN0->getTBAAInfo());
|
||||
LN0->isInvariant(), Align, LN0->getAAInfo());
|
||||
Chain = Load.getValue(1);
|
||||
if (NVT.bitsLT(LVT))
|
||||
Load = DAG.getNode(ISD::TRUNCATE, SDLoc(N), NVT, Load);
|
||||
@ -11159,7 +11159,7 @@ bool DAGCombiner::SimplifySelectOps(SDNode *TheSelect, SDValue LHS,
|
||||
if (LLD->getExtensionType() == ISD::NON_EXTLOAD) {
|
||||
Load = DAG.getLoad(TheSelect->getValueType(0),
|
||||
SDLoc(TheSelect),
|
||||
// FIXME: Discards pointer and TBAA info.
|
||||
// FIXME: Discards pointer and AA info.
|
||||
LLD->getChain(), Addr, MachinePointerInfo(),
|
||||
LLD->isVolatile(), LLD->isNonTemporal(),
|
||||
LLD->isInvariant(), LLD->getAlignment());
|
||||
@ -11168,7 +11168,7 @@ bool DAGCombiner::SimplifySelectOps(SDNode *TheSelect, SDValue LHS,
|
||||
RLD->getExtensionType() : LLD->getExtensionType(),
|
||||
SDLoc(TheSelect),
|
||||
TheSelect->getValueType(0),
|
||||
// FIXME: Discards pointer and TBAA info.
|
||||
// FIXME: Discards pointer and AA info.
|
||||
LLD->getChain(), Addr, MachinePointerInfo(),
|
||||
LLD->getMemoryVT(), LLD->isVolatile(),
|
||||
LLD->isNonTemporal(), LLD->getAlignment());
|
||||
@ -11669,10 +11669,10 @@ bool DAGCombiner::isAlias(LSBaseSDNode *Op0, LSBaseSDNode *Op1) const {
|
||||
AliasAnalysis::AliasResult AAResult =
|
||||
AA.alias(AliasAnalysis::Location(Op0->getMemOperand()->getValue(),
|
||||
Overlap1,
|
||||
UseTBAA ? Op0->getTBAAInfo() : nullptr),
|
||||
UseTBAA ? Op0->getAAInfo() : AAMDNodes()),
|
||||
AliasAnalysis::Location(Op1->getMemOperand()->getValue(),
|
||||
Overlap2,
|
||||
UseTBAA ? Op1->getTBAAInfo() : nullptr));
|
||||
UseTBAA ? Op1->getAAInfo() : AAMDNodes()));
|
||||
if (AAResult == AliasAnalysis::NoAlias)
|
||||
return false;
|
||||
}
|
||||
|
@ -2158,9 +2158,11 @@ FastISel::createMachineMemOperandFor(const Instruction *I) const {
|
||||
|
||||
bool IsNonTemporal = I->getMetadata("nontemporal") != nullptr;
|
||||
bool IsInvariant = I->getMetadata("invariant.load") != nullptr;
|
||||
const MDNode *TBAAInfo = I->getMetadata(LLVMContext::MD_tbaa);
|
||||
const MDNode *Ranges = I->getMetadata(LLVMContext::MD_range);
|
||||
|
||||
AAMDNodes AAInfo;
|
||||
I->getAAMetadata(AAInfo);
|
||||
|
||||
if (Alignment == 0) // Ensure that codegen never sees alignment 0.
|
||||
Alignment = DL.getABITypeAlignment(ValTy);
|
||||
|
||||
@ -2174,5 +2176,5 @@ FastISel::createMachineMemOperandFor(const Instruction *I) const {
|
||||
Flags |= MachineMemOperand::MOInvariant;
|
||||
|
||||
return FuncInfo.MF->getMachineMemOperand(MachinePointerInfo(Ptr), Flags, Size,
|
||||
Alignment, TBAAInfo, Ranges);
|
||||
Alignment, AAInfo, Ranges);
|
||||
}
|
||||
|
@ -385,7 +385,7 @@ static void ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG,
|
||||
MemVT, ST->isVolatile(),
|
||||
ST->isNonTemporal(),
|
||||
MinAlign(ST->getAlignment(), Offset),
|
||||
ST->getTBAAInfo()));
|
||||
ST->getAAInfo()));
|
||||
// The order of the stores doesn't matter - say it with a TokenFactor.
|
||||
SDValue Result = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Stores);
|
||||
DAGLegalize->ReplaceNode(SDValue(ST, 0), Result);
|
||||
@ -417,7 +417,7 @@ static void ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG,
|
||||
Store2 = DAG.getTruncStore(Chain, dl, TLI.isLittleEndian()?Hi:Lo, Ptr,
|
||||
ST->getPointerInfo().getWithOffset(IncrementSize),
|
||||
NewStoredVT, ST->isVolatile(), ST->isNonTemporal(),
|
||||
Alignment, ST->getTBAAInfo());
|
||||
Alignment, ST->getAAInfo());
|
||||
|
||||
SDValue Result =
|
||||
DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Store1, Store2);
|
||||
@ -476,7 +476,7 @@ ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG,
|
||||
LD->isVolatile(), LD->isNonTemporal(),
|
||||
LD->isInvariant(),
|
||||
MinAlign(LD->getAlignment(), Offset),
|
||||
LD->getTBAAInfo());
|
||||
LD->getAAInfo());
|
||||
// Follow the load with a store to the stack slot. Remember the store.
|
||||
Stores.push_back(DAG.getStore(Load.getValue(1), dl, Load, StackPtr,
|
||||
MachinePointerInfo(), false, false, 0));
|
||||
@ -495,7 +495,7 @@ ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG,
|
||||
MemVT, LD->isVolatile(),
|
||||
LD->isNonTemporal(),
|
||||
MinAlign(LD->getAlignment(), Offset),
|
||||
LD->getTBAAInfo());
|
||||
LD->getAAInfo());
|
||||
// Follow the load with a store to the stack slot. Remember the store.
|
||||
// On big-endian machines this requires a truncating store to ensure
|
||||
// that the bits end up in the right place.
|
||||
@ -538,25 +538,25 @@ ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG,
|
||||
if (TLI.isLittleEndian()) {
|
||||
Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, VT, Chain, Ptr, LD->getPointerInfo(),
|
||||
NewLoadedVT, LD->isVolatile(),
|
||||
LD->isNonTemporal(), Alignment, LD->getTBAAInfo());
|
||||
LD->isNonTemporal(), Alignment, LD->getAAInfo());
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(IncrementSize, Ptr.getValueType()));
|
||||
Hi = DAG.getExtLoad(HiExtType, dl, VT, Chain, Ptr,
|
||||
LD->getPointerInfo().getWithOffset(IncrementSize),
|
||||
NewLoadedVT, LD->isVolatile(),
|
||||
LD->isNonTemporal(), MinAlign(Alignment, IncrementSize),
|
||||
LD->getTBAAInfo());
|
||||
LD->getAAInfo());
|
||||
} else {
|
||||
Hi = DAG.getExtLoad(HiExtType, dl, VT, Chain, Ptr, LD->getPointerInfo(),
|
||||
NewLoadedVT, LD->isVolatile(),
|
||||
LD->isNonTemporal(), Alignment, LD->getTBAAInfo());
|
||||
LD->isNonTemporal(), Alignment, LD->getAAInfo());
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(IncrementSize, Ptr.getValueType()));
|
||||
Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, VT, Chain, Ptr,
|
||||
LD->getPointerInfo().getWithOffset(IncrementSize),
|
||||
NewLoadedVT, LD->isVolatile(),
|
||||
LD->isNonTemporal(), MinAlign(Alignment, IncrementSize),
|
||||
LD->getTBAAInfo());
|
||||
LD->getAAInfo());
|
||||
}
|
||||
|
||||
// aggregate the two parts
|
||||
@ -659,7 +659,7 @@ SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) {
|
||||
unsigned Alignment = ST->getAlignment();
|
||||
bool isVolatile = ST->isVolatile();
|
||||
bool isNonTemporal = ST->isNonTemporal();
|
||||
const MDNode *TBAAInfo = ST->getTBAAInfo();
|
||||
AAMDNodes AAInfo = ST->getAAInfo();
|
||||
SDLoc dl(ST);
|
||||
if (ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(ST->getValue())) {
|
||||
if (CFP->getValueType(0) == MVT::f32 &&
|
||||
@ -668,7 +668,7 @@ SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) {
|
||||
bitcastToAPInt().zextOrTrunc(32),
|
||||
MVT::i32);
|
||||
return DAG.getStore(Chain, dl, Con, Ptr, ST->getPointerInfo(),
|
||||
isVolatile, isNonTemporal, Alignment, TBAAInfo);
|
||||
isVolatile, isNonTemporal, Alignment, AAInfo);
|
||||
}
|
||||
|
||||
if (CFP->getValueType(0) == MVT::f64) {
|
||||
@ -677,7 +677,7 @@ SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) {
|
||||
SDValue Con = DAG.getConstant(CFP->getValueAPF().bitcastToAPInt().
|
||||
zextOrTrunc(64), MVT::i64);
|
||||
return DAG.getStore(Chain, dl, Con, Ptr, ST->getPointerInfo(),
|
||||
isVolatile, isNonTemporal, Alignment, TBAAInfo);
|
||||
isVolatile, isNonTemporal, Alignment, AAInfo);
|
||||
}
|
||||
|
||||
if (TLI.isTypeLegal(MVT::i32) && !ST->isVolatile()) {
|
||||
@ -690,13 +690,13 @@ SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) {
|
||||
if (TLI.isBigEndian()) std::swap(Lo, Hi);
|
||||
|
||||
Lo = DAG.getStore(Chain, dl, Lo, Ptr, ST->getPointerInfo(), isVolatile,
|
||||
isNonTemporal, Alignment, TBAAInfo);
|
||||
isNonTemporal, Alignment, AAInfo);
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(4, Ptr.getValueType()));
|
||||
Hi = DAG.getStore(Chain, dl, Hi, Ptr,
|
||||
ST->getPointerInfo().getWithOffset(4),
|
||||
isVolatile, isNonTemporal, MinAlign(Alignment, 4U),
|
||||
TBAAInfo);
|
||||
AAInfo);
|
||||
|
||||
return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
|
||||
}
|
||||
@ -714,7 +714,7 @@ void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) {
|
||||
unsigned Alignment = ST->getAlignment();
|
||||
bool isVolatile = ST->isVolatile();
|
||||
bool isNonTemporal = ST->isNonTemporal();
|
||||
const MDNode *TBAAInfo = ST->getTBAAInfo();
|
||||
AAMDNodes AAInfo = ST->getAAInfo();
|
||||
|
||||
if (!ST->isTruncatingStore()) {
|
||||
if (SDNode *OptStore = OptimizeFloatStore(ST).getNode()) {
|
||||
@ -754,7 +754,7 @@ void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) {
|
||||
SDValue Result =
|
||||
DAG.getStore(Chain, dl, Value, Ptr,
|
||||
ST->getPointerInfo(), isVolatile,
|
||||
isNonTemporal, Alignment, TBAAInfo);
|
||||
isNonTemporal, Alignment, AAInfo);
|
||||
ReplaceNode(SDValue(Node, 0), Result);
|
||||
break;
|
||||
}
|
||||
@ -777,7 +777,7 @@ void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) {
|
||||
SDValue Result =
|
||||
DAG.getTruncStore(Chain, dl, Value, Ptr, ST->getPointerInfo(),
|
||||
NVT, isVolatile, isNonTemporal, Alignment,
|
||||
TBAAInfo);
|
||||
AAInfo);
|
||||
ReplaceNode(SDValue(Node, 0), Result);
|
||||
} else if (StWidth & (StWidth - 1)) {
|
||||
// If not storing a power-of-2 number of bits, expand as two stores.
|
||||
@ -799,7 +799,7 @@ void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) {
|
||||
Lo = DAG.getTruncStore(Chain, dl, Value, Ptr, ST->getPointerInfo(),
|
||||
RoundVT,
|
||||
isVolatile, isNonTemporal, Alignment,
|
||||
TBAAInfo);
|
||||
AAInfo);
|
||||
|
||||
// Store the remaining ExtraWidth bits.
|
||||
IncrementSize = RoundWidth / 8;
|
||||
@ -811,7 +811,7 @@ void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) {
|
||||
Hi = DAG.getTruncStore(Chain, dl, Hi, Ptr,
|
||||
ST->getPointerInfo().getWithOffset(IncrementSize),
|
||||
ExtraVT, isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize), TBAAInfo);
|
||||
MinAlign(Alignment, IncrementSize), AAInfo);
|
||||
} else {
|
||||
// Big endian - avoid unaligned stores.
|
||||
// TRUNCSTORE:i24 X -> TRUNCSTORE:i16 (srl X, 8), TRUNCSTORE@+2:i8 X
|
||||
@ -821,7 +821,7 @@ void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) {
|
||||
TLI.getShiftAmountTy(Value.getValueType())));
|
||||
Hi = DAG.getTruncStore(Chain, dl, Hi, Ptr, ST->getPointerInfo(),
|
||||
RoundVT, isVolatile, isNonTemporal, Alignment,
|
||||
TBAAInfo);
|
||||
AAInfo);
|
||||
|
||||
// Store the remaining ExtraWidth bits.
|
||||
IncrementSize = RoundWidth / 8;
|
||||
@ -830,7 +830,7 @@ void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) {
|
||||
Lo = DAG.getTruncStore(Chain, dl, Value, Ptr,
|
||||
ST->getPointerInfo().getWithOffset(IncrementSize),
|
||||
ExtraVT, isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize), TBAAInfo);
|
||||
MinAlign(Alignment, IncrementSize), AAInfo);
|
||||
}
|
||||
|
||||
// The order of the stores doesn't matter.
|
||||
@ -868,7 +868,7 @@ void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) {
|
||||
Value = DAG.getNode(ISD::TRUNCATE, dl, StVT, Value);
|
||||
SDValue Result =
|
||||
DAG.getStore(Chain, dl, Value, Ptr, ST->getPointerInfo(),
|
||||
isVolatile, isNonTemporal, Alignment, TBAAInfo);
|
||||
isVolatile, isNonTemporal, Alignment, AAInfo);
|
||||
ReplaceNode(SDValue(Node, 0), Result);
|
||||
break;
|
||||
}
|
||||
@ -938,7 +938,7 @@ void SelectionDAGLegalize::LegalizeLoadOps(SDNode *Node) {
|
||||
unsigned Alignment = LD->getAlignment();
|
||||
bool isVolatile = LD->isVolatile();
|
||||
bool isNonTemporal = LD->isNonTemporal();
|
||||
const MDNode *TBAAInfo = LD->getTBAAInfo();
|
||||
AAMDNodes AAInfo = LD->getAAInfo();
|
||||
|
||||
if (SrcWidth != SrcVT.getStoreSizeInBits() &&
|
||||
// Some targets pretend to have an i1 loading operation, and actually
|
||||
@ -965,7 +965,7 @@ void SelectionDAGLegalize::LegalizeLoadOps(SDNode *Node) {
|
||||
SDValue Result =
|
||||
DAG.getExtLoad(NewExtType, dl, Node->getValueType(0),
|
||||
Chain, Ptr, LD->getPointerInfo(),
|
||||
NVT, isVolatile, isNonTemporal, Alignment, TBAAInfo);
|
||||
NVT, isVolatile, isNonTemporal, Alignment, AAInfo);
|
||||
|
||||
Ch = Result.getValue(1); // The chain.
|
||||
|
||||
@ -1002,7 +1002,7 @@ void SelectionDAGLegalize::LegalizeLoadOps(SDNode *Node) {
|
||||
Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, Node->getValueType(0),
|
||||
Chain, Ptr,
|
||||
LD->getPointerInfo(), RoundVT, isVolatile,
|
||||
isNonTemporal, Alignment, TBAAInfo);
|
||||
isNonTemporal, Alignment, AAInfo);
|
||||
|
||||
// Load the remaining ExtraWidth bits.
|
||||
IncrementSize = RoundWidth / 8;
|
||||
@ -1011,7 +1011,7 @@ void SelectionDAGLegalize::LegalizeLoadOps(SDNode *Node) {
|
||||
Hi = DAG.getExtLoad(ExtType, dl, Node->getValueType(0), Chain, Ptr,
|
||||
LD->getPointerInfo().getWithOffset(IncrementSize),
|
||||
ExtraVT, isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize), TBAAInfo);
|
||||
MinAlign(Alignment, IncrementSize), AAInfo);
|
||||
|
||||
// Build a factor node to remember that this load is independent of
|
||||
// the other one.
|
||||
@ -1031,7 +1031,7 @@ void SelectionDAGLegalize::LegalizeLoadOps(SDNode *Node) {
|
||||
// Load the top RoundWidth bits.
|
||||
Hi = DAG.getExtLoad(ExtType, dl, Node->getValueType(0), Chain, Ptr,
|
||||
LD->getPointerInfo(), RoundVT, isVolatile,
|
||||
isNonTemporal, Alignment, TBAAInfo);
|
||||
isNonTemporal, Alignment, AAInfo);
|
||||
|
||||
// Load the remaining ExtraWidth bits.
|
||||
IncrementSize = RoundWidth / 8;
|
||||
@ -1041,7 +1041,7 @@ void SelectionDAGLegalize::LegalizeLoadOps(SDNode *Node) {
|
||||
dl, Node->getValueType(0), Chain, Ptr,
|
||||
LD->getPointerInfo().getWithOffset(IncrementSize),
|
||||
ExtraVT, isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize), TBAAInfo);
|
||||
MinAlign(Alignment, IncrementSize), AAInfo);
|
||||
|
||||
// Build a factor node to remember that this load is independent of
|
||||
// the other one.
|
||||
|
@ -543,7 +543,7 @@ SDValue DAGTypeLegalizer::SoftenFloatRes_LOAD(SDNode *N) {
|
||||
NVT, dl, L->getChain(), L->getBasePtr(), L->getOffset(),
|
||||
L->getPointerInfo(), NVT, L->isVolatile(),
|
||||
L->isNonTemporal(), false, L->getAlignment(),
|
||||
L->getTBAAInfo());
|
||||
L->getAAInfo());
|
||||
// Legalized the chain result - switch anything that used the old chain to
|
||||
// use the new one.
|
||||
ReplaceValueWith(SDValue(N, 1), NewL.getValue(1));
|
||||
@ -556,7 +556,7 @@ SDValue DAGTypeLegalizer::SoftenFloatRes_LOAD(SDNode *N) {
|
||||
L->getBasePtr(), L->getOffset(), L->getPointerInfo(),
|
||||
L->getMemoryVT(), L->isVolatile(),
|
||||
L->isNonTemporal(), false, L->getAlignment(),
|
||||
L->getTBAAInfo());
|
||||
L->getAAInfo());
|
||||
// Legalized the chain result - switch anything that used the old chain to
|
||||
// use the new one.
|
||||
ReplaceValueWith(SDValue(N, 1), NewL.getValue(1));
|
||||
|
@ -1859,7 +1859,7 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
|
||||
bool isVolatile = N->isVolatile();
|
||||
bool isNonTemporal = N->isNonTemporal();
|
||||
bool isInvariant = N->isInvariant();
|
||||
const MDNode *TBAAInfo = N->getTBAAInfo();
|
||||
AAMDNodes AAInfo = N->getAAInfo();
|
||||
SDLoc dl(N);
|
||||
|
||||
assert(NVT.isByteSized() && "Expanded type not byte sized!");
|
||||
@ -1868,7 +1868,7 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
|
||||
EVT MemVT = N->getMemoryVT();
|
||||
|
||||
Lo = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr, N->getPointerInfo(),
|
||||
MemVT, isVolatile, isNonTemporal, Alignment, TBAAInfo);
|
||||
MemVT, isVolatile, isNonTemporal, Alignment, AAInfo);
|
||||
|
||||
// Remember the chain.
|
||||
Ch = Lo.getValue(1);
|
||||
@ -1891,7 +1891,7 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
|
||||
// Little-endian - low bits are at low addresses.
|
||||
Lo = DAG.getLoad(NVT, dl, Ch, Ptr, N->getPointerInfo(),
|
||||
isVolatile, isNonTemporal, isInvariant, Alignment,
|
||||
TBAAInfo);
|
||||
AAInfo);
|
||||
|
||||
unsigned ExcessBits =
|
||||
N->getMemoryVT().getSizeInBits() - NVT.getSizeInBits();
|
||||
@ -1904,7 +1904,7 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
|
||||
Hi = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr,
|
||||
N->getPointerInfo().getWithOffset(IncrementSize), NEVT,
|
||||
isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize), TBAAInfo);
|
||||
MinAlign(Alignment, IncrementSize), AAInfo);
|
||||
|
||||
// Build a factor node to remember that this load is independent of the
|
||||
// other one.
|
||||
@ -1922,7 +1922,7 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
|
||||
Hi = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr, N->getPointerInfo(),
|
||||
EVT::getIntegerVT(*DAG.getContext(),
|
||||
MemVT.getSizeInBits() - ExcessBits),
|
||||
isVolatile, isNonTemporal, Alignment, TBAAInfo);
|
||||
isVolatile, isNonTemporal, Alignment, AAInfo);
|
||||
|
||||
// Increment the pointer to the other half.
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
@ -1932,7 +1932,7 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
|
||||
N->getPointerInfo().getWithOffset(IncrementSize),
|
||||
EVT::getIntegerVT(*DAG.getContext(), ExcessBits),
|
||||
isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize), TBAAInfo);
|
||||
MinAlign(Alignment, IncrementSize), AAInfo);
|
||||
|
||||
// Build a factor node to remember that this load is independent of the
|
||||
// other one.
|
||||
@ -2709,7 +2709,7 @@ SDValue DAGTypeLegalizer::ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
||||
unsigned Alignment = N->getAlignment();
|
||||
bool isVolatile = N->isVolatile();
|
||||
bool isNonTemporal = N->isNonTemporal();
|
||||
const MDNode *TBAAInfo = N->getTBAAInfo();
|
||||
AAMDNodes AAInfo = N->getAAInfo();
|
||||
SDLoc dl(N);
|
||||
SDValue Lo, Hi;
|
||||
|
||||
@ -2719,7 +2719,7 @@ SDValue DAGTypeLegalizer::ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
||||
GetExpandedInteger(N->getValue(), Lo, Hi);
|
||||
return DAG.getTruncStore(Ch, dl, Lo, Ptr, N->getPointerInfo(),
|
||||
N->getMemoryVT(), isVolatile, isNonTemporal,
|
||||
Alignment, TBAAInfo);
|
||||
Alignment, AAInfo);
|
||||
}
|
||||
|
||||
if (TLI.isLittleEndian()) {
|
||||
@ -2727,7 +2727,7 @@ SDValue DAGTypeLegalizer::ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
||||
GetExpandedInteger(N->getValue(), Lo, Hi);
|
||||
|
||||
Lo = DAG.getStore(Ch, dl, Lo, Ptr, N->getPointerInfo(),
|
||||
isVolatile, isNonTemporal, Alignment, TBAAInfo);
|
||||
isVolatile, isNonTemporal, Alignment, AAInfo);
|
||||
|
||||
unsigned ExcessBits =
|
||||
N->getMemoryVT().getSizeInBits() - NVT.getSizeInBits();
|
||||
@ -2740,7 +2740,7 @@ SDValue DAGTypeLegalizer::ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
||||
Hi = DAG.getTruncStore(Ch, dl, Hi, Ptr,
|
||||
N->getPointerInfo().getWithOffset(IncrementSize),
|
||||
NEVT, isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize), TBAAInfo);
|
||||
MinAlign(Alignment, IncrementSize), AAInfo);
|
||||
return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
|
||||
}
|
||||
|
||||
@ -2768,7 +2768,7 @@ SDValue DAGTypeLegalizer::ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
||||
|
||||
// Store both the high bits and maybe some of the low bits.
|
||||
Hi = DAG.getTruncStore(Ch, dl, Hi, Ptr, N->getPointerInfo(),
|
||||
HiVT, isVolatile, isNonTemporal, Alignment, TBAAInfo);
|
||||
HiVT, isVolatile, isNonTemporal, Alignment, AAInfo);
|
||||
|
||||
// Increment the pointer to the other half.
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
@ -2778,7 +2778,7 @@ SDValue DAGTypeLegalizer::ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
||||
N->getPointerInfo().getWithOffset(IncrementSize),
|
||||
EVT::getIntegerVT(*DAG.getContext(), ExcessBits),
|
||||
isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize), TBAAInfo);
|
||||
MinAlign(Alignment, IncrementSize), AAInfo);
|
||||
return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
|
||||
}
|
||||
|
||||
|
@ -256,13 +256,13 @@ void DAGTypeLegalizer::ExpandRes_NormalLoad(SDNode *N, SDValue &Lo,
|
||||
bool isVolatile = LD->isVolatile();
|
||||
bool isNonTemporal = LD->isNonTemporal();
|
||||
bool isInvariant = LD->isInvariant();
|
||||
const MDNode *TBAAInfo = LD->getTBAAInfo();
|
||||
AAMDNodes AAInfo = LD->getAAInfo();
|
||||
|
||||
assert(NVT.isByteSized() && "Expanded type not byte sized!");
|
||||
|
||||
Lo = DAG.getLoad(NVT, dl, Chain, Ptr, LD->getPointerInfo(),
|
||||
isVolatile, isNonTemporal, isInvariant, Alignment,
|
||||
TBAAInfo);
|
||||
AAInfo);
|
||||
|
||||
// Increment the pointer to the other half.
|
||||
unsigned IncrementSize = NVT.getSizeInBits() / 8;
|
||||
@ -271,7 +271,7 @@ void DAGTypeLegalizer::ExpandRes_NormalLoad(SDNode *N, SDValue &Lo,
|
||||
Hi = DAG.getLoad(NVT, dl, Chain, Ptr,
|
||||
LD->getPointerInfo().getWithOffset(IncrementSize),
|
||||
isVolatile, isNonTemporal, isInvariant,
|
||||
MinAlign(Alignment, IncrementSize), TBAAInfo);
|
||||
MinAlign(Alignment, IncrementSize), AAInfo);
|
||||
|
||||
// Build a factor node to remember that this load is independent of the
|
||||
// other one.
|
||||
@ -470,7 +470,7 @@ SDValue DAGTypeLegalizer::ExpandOp_NormalStore(SDNode *N, unsigned OpNo) {
|
||||
unsigned Alignment = St->getAlignment();
|
||||
bool isVolatile = St->isVolatile();
|
||||
bool isNonTemporal = St->isNonTemporal();
|
||||
const MDNode *TBAAInfo = St->getTBAAInfo();
|
||||
AAMDNodes AAInfo = St->getAAInfo();
|
||||
|
||||
assert(NVT.isByteSized() && "Expanded type not byte sized!");
|
||||
unsigned IncrementSize = NVT.getSizeInBits() / 8;
|
||||
@ -482,14 +482,14 @@ SDValue DAGTypeLegalizer::ExpandOp_NormalStore(SDNode *N, unsigned OpNo) {
|
||||
std::swap(Lo, Hi);
|
||||
|
||||
Lo = DAG.getStore(Chain, dl, Lo, Ptr, St->getPointerInfo(),
|
||||
isVolatile, isNonTemporal, Alignment, TBAAInfo);
|
||||
isVolatile, isNonTemporal, Alignment, AAInfo);
|
||||
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(IncrementSize, Ptr.getValueType()));
|
||||
Hi = DAG.getStore(Chain, dl, Hi, Ptr,
|
||||
St->getPointerInfo().getWithOffset(IncrementSize),
|
||||
isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize), TBAAInfo);
|
||||
MinAlign(Alignment, IncrementSize), AAInfo);
|
||||
|
||||
return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
|
||||
}
|
||||
|
@ -480,7 +480,7 @@ SDValue VectorLegalizer::ExpandLoad(SDValue Op) {
|
||||
LD->getPointerInfo().getWithOffset(Offset),
|
||||
LD->isVolatile(), LD->isNonTemporal(),
|
||||
LD->isInvariant(), LD->getAlignment(),
|
||||
LD->getTBAAInfo());
|
||||
LD->getAAInfo());
|
||||
} else {
|
||||
EVT LoadVT = WideVT;
|
||||
while (RemainingBytes < LoadBytes) {
|
||||
@ -491,7 +491,7 @@ SDValue VectorLegalizer::ExpandLoad(SDValue Op) {
|
||||
LD->getPointerInfo().getWithOffset(Offset),
|
||||
LoadVT, LD->isVolatile(),
|
||||
LD->isNonTemporal(), LD->getAlignment(),
|
||||
LD->getTBAAInfo());
|
||||
LD->getAAInfo());
|
||||
}
|
||||
|
||||
RemainingBytes -= LoadBytes;
|
||||
@ -562,7 +562,7 @@ SDValue VectorLegalizer::ExpandLoad(SDValue Op) {
|
||||
Chain, BasePTR, LD->getPointerInfo().getWithOffset(Idx * Stride),
|
||||
SrcVT.getScalarType(),
|
||||
LD->isVolatile(), LD->isNonTemporal(),
|
||||
LD->getAlignment(), LD->getTBAAInfo());
|
||||
LD->getAlignment(), LD->getAAInfo());
|
||||
|
||||
BasePTR = DAG.getNode(ISD::ADD, dl, BasePTR.getValueType(), BasePTR,
|
||||
DAG.getConstant(Stride, BasePTR.getValueType()));
|
||||
@ -593,7 +593,7 @@ SDValue VectorLegalizer::ExpandStore(SDValue Op) {
|
||||
unsigned Alignment = ST->getAlignment();
|
||||
bool isVolatile = ST->isVolatile();
|
||||
bool isNonTemporal = ST->isNonTemporal();
|
||||
const MDNode *TBAAInfo = ST->getTBAAInfo();
|
||||
AAMDNodes AAInfo = ST->getAAInfo();
|
||||
|
||||
unsigned NumElem = StVT.getVectorNumElements();
|
||||
// The type of the data we want to save
|
||||
@ -621,7 +621,7 @@ SDValue VectorLegalizer::ExpandStore(SDValue Op) {
|
||||
// This scalar TruncStore may be illegal, but we legalize it later.
|
||||
SDValue Store = DAG.getTruncStore(Chain, dl, Ex, BasePTR,
|
||||
ST->getPointerInfo().getWithOffset(Idx*Stride), MemSclVT,
|
||||
isVolatile, isNonTemporal, Alignment, TBAAInfo);
|
||||
isVolatile, isNonTemporal, Alignment, AAInfo);
|
||||
|
||||
BasePTR = DAG.getNode(ISD::ADD, dl, BasePTR.getValueType(), BasePTR,
|
||||
DAG.getConstant(Stride, BasePTR.getValueType()));
|
||||
|
@ -221,7 +221,7 @@ SDValue DAGTypeLegalizer::ScalarizeVecRes_LOAD(LoadSDNode *N) {
|
||||
N->getMemoryVT().getVectorElementType(),
|
||||
N->isVolatile(), N->isNonTemporal(),
|
||||
N->isInvariant(), N->getOriginalAlignment(),
|
||||
N->getTBAAInfo());
|
||||
N->getAAInfo());
|
||||
|
||||
// Legalized the chain result - switch anything that used the old chain to
|
||||
// use the new one.
|
||||
@ -507,12 +507,12 @@ SDValue DAGTypeLegalizer::ScalarizeVecOp_STORE(StoreSDNode *N, unsigned OpNo){
|
||||
N->getBasePtr(), N->getPointerInfo(),
|
||||
N->getMemoryVT().getVectorElementType(),
|
||||
N->isVolatile(), N->isNonTemporal(),
|
||||
N->getAlignment(), N->getTBAAInfo());
|
||||
N->getAlignment(), N->getAAInfo());
|
||||
|
||||
return DAG.getStore(N->getChain(), dl, GetScalarizedVector(N->getOperand(1)),
|
||||
N->getBasePtr(), N->getPointerInfo(),
|
||||
N->isVolatile(), N->isNonTemporal(),
|
||||
N->getOriginalAlignment(), N->getTBAAInfo());
|
||||
N->getOriginalAlignment(), N->getAAInfo());
|
||||
}
|
||||
|
||||
/// ScalarizeVecOp_FP_ROUND - If the value to round is a vector that needs
|
||||
@ -921,14 +921,14 @@ void DAGTypeLegalizer::SplitVecRes_LOAD(LoadSDNode *LD, SDValue &Lo,
|
||||
bool isVolatile = LD->isVolatile();
|
||||
bool isNonTemporal = LD->isNonTemporal();
|
||||
bool isInvariant = LD->isInvariant();
|
||||
const MDNode *TBAAInfo = LD->getTBAAInfo();
|
||||
AAMDNodes AAInfo = LD->getAAInfo();
|
||||
|
||||
EVT LoMemVT, HiMemVT;
|
||||
std::tie(LoMemVT, HiMemVT) = DAG.GetSplitDestVTs(MemoryVT);
|
||||
|
||||
Lo = DAG.getLoad(ISD::UNINDEXED, ExtType, LoVT, dl, Ch, Ptr, Offset,
|
||||
LD->getPointerInfo(), LoMemVT, isVolatile, isNonTemporal,
|
||||
isInvariant, Alignment, TBAAInfo);
|
||||
isInvariant, Alignment, AAInfo);
|
||||
|
||||
unsigned IncrementSize = LoMemVT.getSizeInBits()/8;
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
@ -936,7 +936,7 @@ void DAGTypeLegalizer::SplitVecRes_LOAD(LoadSDNode *LD, SDValue &Lo,
|
||||
Hi = DAG.getLoad(ISD::UNINDEXED, ExtType, HiVT, dl, Ch, Ptr, Offset,
|
||||
LD->getPointerInfo().getWithOffset(IncrementSize),
|
||||
HiMemVT, isVolatile, isNonTemporal, isInvariant, Alignment,
|
||||
TBAAInfo);
|
||||
AAInfo);
|
||||
|
||||
// Build a factor node to remember that this load is independent of the
|
||||
// other one.
|
||||
@ -1372,7 +1372,7 @@ SDValue DAGTypeLegalizer::SplitVecOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
||||
unsigned Alignment = N->getOriginalAlignment();
|
||||
bool isVol = N->isVolatile();
|
||||
bool isNT = N->isNonTemporal();
|
||||
const MDNode *TBAAInfo = N->getTBAAInfo();
|
||||
AAMDNodes AAInfo = N->getAAInfo();
|
||||
SDValue Lo, Hi;
|
||||
GetSplitVector(N->getOperand(1), Lo, Hi);
|
||||
|
||||
@ -1383,10 +1383,10 @@ SDValue DAGTypeLegalizer::SplitVecOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
||||
|
||||
if (isTruncating)
|
||||
Lo = DAG.getTruncStore(Ch, DL, Lo, Ptr, N->getPointerInfo(),
|
||||
LoMemVT, isVol, isNT, Alignment, TBAAInfo);
|
||||
LoMemVT, isVol, isNT, Alignment, AAInfo);
|
||||
else
|
||||
Lo = DAG.getStore(Ch, DL, Lo, Ptr, N->getPointerInfo(),
|
||||
isVol, isNT, Alignment, TBAAInfo);
|
||||
isVol, isNT, Alignment, AAInfo);
|
||||
|
||||
// Increment the pointer to the other half.
|
||||
Ptr = DAG.getNode(ISD::ADD, DL, Ptr.getValueType(), Ptr,
|
||||
@ -1395,11 +1395,11 @@ SDValue DAGTypeLegalizer::SplitVecOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
||||
if (isTruncating)
|
||||
Hi = DAG.getTruncStore(Ch, DL, Hi, Ptr,
|
||||
N->getPointerInfo().getWithOffset(IncrementSize),
|
||||
HiMemVT, isVol, isNT, Alignment, TBAAInfo);
|
||||
HiMemVT, isVol, isNT, Alignment, AAInfo);
|
||||
else
|
||||
Hi = DAG.getStore(Ch, DL, Hi, Ptr,
|
||||
N->getPointerInfo().getWithOffset(IncrementSize),
|
||||
isVol, isNT, Alignment, TBAAInfo);
|
||||
isVol, isNT, Alignment, AAInfo);
|
||||
|
||||
return DAG.getNode(ISD::TokenFactor, DL, MVT::Other, Lo, Hi);
|
||||
}
|
||||
@ -2735,7 +2735,7 @@ SDValue DAGTypeLegalizer::GenWidenVectorLoads(SmallVectorImpl<SDValue> &LdChain,
|
||||
bool isVolatile = LD->isVolatile();
|
||||
bool isNonTemporal = LD->isNonTemporal();
|
||||
bool isInvariant = LD->isInvariant();
|
||||
const MDNode *TBAAInfo = LD->getTBAAInfo();
|
||||
AAMDNodes AAInfo = LD->getAAInfo();
|
||||
|
||||
int LdWidth = LdVT.getSizeInBits();
|
||||
int WidthDiff = WidenWidth - LdWidth; // Difference
|
||||
@ -2746,7 +2746,7 @@ SDValue DAGTypeLegalizer::GenWidenVectorLoads(SmallVectorImpl<SDValue> &LdChain,
|
||||
int NewVTWidth = NewVT.getSizeInBits();
|
||||
SDValue LdOp = DAG.getLoad(NewVT, dl, Chain, BasePtr, LD->getPointerInfo(),
|
||||
isVolatile, isNonTemporal, isInvariant, Align,
|
||||
TBAAInfo);
|
||||
AAInfo);
|
||||
LdChain.push_back(LdOp.getValue(1));
|
||||
|
||||
// Check if we can load the element with one instruction
|
||||
@ -2791,7 +2791,7 @@ SDValue DAGTypeLegalizer::GenWidenVectorLoads(SmallVectorImpl<SDValue> &LdChain,
|
||||
L = DAG.getLoad(NewVT, dl, Chain, BasePtr,
|
||||
LD->getPointerInfo().getWithOffset(Offset), isVolatile,
|
||||
isNonTemporal, isInvariant, MinAlign(Align, Increment),
|
||||
TBAAInfo);
|
||||
AAInfo);
|
||||
LdChain.push_back(L.getValue(1));
|
||||
if (L->getValueType(0).isVector()) {
|
||||
SmallVector<SDValue, 16> Loads;
|
||||
@ -2807,7 +2807,7 @@ SDValue DAGTypeLegalizer::GenWidenVectorLoads(SmallVectorImpl<SDValue> &LdChain,
|
||||
L = DAG.getLoad(NewVT, dl, Chain, BasePtr,
|
||||
LD->getPointerInfo().getWithOffset(Offset), isVolatile,
|
||||
isNonTemporal, isInvariant, MinAlign(Align, Increment),
|
||||
TBAAInfo);
|
||||
AAInfo);
|
||||
LdChain.push_back(L.getValue(1));
|
||||
}
|
||||
|
||||
@ -2887,7 +2887,7 @@ DAGTypeLegalizer::GenWidenVectorExtLoads(SmallVectorImpl<SDValue> &LdChain,
|
||||
unsigned Align = LD->getAlignment();
|
||||
bool isVolatile = LD->isVolatile();
|
||||
bool isNonTemporal = LD->isNonTemporal();
|
||||
const MDNode *TBAAInfo = LD->getTBAAInfo();
|
||||
AAMDNodes AAInfo = LD->getAAInfo();
|
||||
|
||||
EVT EltVT = WidenVT.getVectorElementType();
|
||||
EVT LdEltVT = LdVT.getVectorElementType();
|
||||
@ -2899,7 +2899,7 @@ DAGTypeLegalizer::GenWidenVectorExtLoads(SmallVectorImpl<SDValue> &LdChain,
|
||||
unsigned Increment = LdEltVT.getSizeInBits() / 8;
|
||||
Ops[0] = DAG.getExtLoad(ExtType, dl, EltVT, Chain, BasePtr,
|
||||
LD->getPointerInfo(),
|
||||
LdEltVT, isVolatile, isNonTemporal, Align, TBAAInfo);
|
||||
LdEltVT, isVolatile, isNonTemporal, Align, AAInfo);
|
||||
LdChain.push_back(Ops[0].getValue(1));
|
||||
unsigned i = 0, Offset = Increment;
|
||||
for (i=1; i < NumElts; ++i, Offset += Increment) {
|
||||
@ -2909,7 +2909,7 @@ DAGTypeLegalizer::GenWidenVectorExtLoads(SmallVectorImpl<SDValue> &LdChain,
|
||||
BasePtr.getValueType()));
|
||||
Ops[i] = DAG.getExtLoad(ExtType, dl, EltVT, Chain, NewBasePtr,
|
||||
LD->getPointerInfo().getWithOffset(Offset), LdEltVT,
|
||||
isVolatile, isNonTemporal, Align, TBAAInfo);
|
||||
isVolatile, isNonTemporal, Align, AAInfo);
|
||||
LdChain.push_back(Ops[i].getValue(1));
|
||||
}
|
||||
|
||||
@ -2932,7 +2932,7 @@ void DAGTypeLegalizer::GenWidenVectorStores(SmallVectorImpl<SDValue> &StChain,
|
||||
unsigned Align = ST->getAlignment();
|
||||
bool isVolatile = ST->isVolatile();
|
||||
bool isNonTemporal = ST->isNonTemporal();
|
||||
const MDNode *TBAAInfo = ST->getTBAAInfo();
|
||||
AAMDNodes AAInfo = ST->getAAInfo();
|
||||
SDValue ValOp = GetWidenedVector(ST->getValue());
|
||||
SDLoc dl(ST);
|
||||
|
||||
@ -2959,7 +2959,7 @@ void DAGTypeLegalizer::GenWidenVectorStores(SmallVectorImpl<SDValue> &StChain,
|
||||
StChain.push_back(DAG.getStore(Chain, dl, EOp, BasePtr,
|
||||
ST->getPointerInfo().getWithOffset(Offset),
|
||||
isVolatile, isNonTemporal,
|
||||
MinAlign(Align, Offset), TBAAInfo));
|
||||
MinAlign(Align, Offset), AAInfo));
|
||||
StWidth -= NewVTWidth;
|
||||
Offset += Increment;
|
||||
Idx += NumVTElts;
|
||||
@ -2979,7 +2979,7 @@ void DAGTypeLegalizer::GenWidenVectorStores(SmallVectorImpl<SDValue> &StChain,
|
||||
StChain.push_back(DAG.getStore(Chain, dl, EOp, BasePtr,
|
||||
ST->getPointerInfo().getWithOffset(Offset),
|
||||
isVolatile, isNonTemporal,
|
||||
MinAlign(Align, Offset), TBAAInfo));
|
||||
MinAlign(Align, Offset), AAInfo));
|
||||
StWidth -= NewVTWidth;
|
||||
Offset += Increment;
|
||||
BasePtr = DAG.getNode(ISD::ADD, dl, BasePtr.getValueType(), BasePtr,
|
||||
@ -3001,7 +3001,7 @@ DAGTypeLegalizer::GenWidenVectorTruncStores(SmallVectorImpl<SDValue> &StChain,
|
||||
unsigned Align = ST->getAlignment();
|
||||
bool isVolatile = ST->isVolatile();
|
||||
bool isNonTemporal = ST->isNonTemporal();
|
||||
const MDNode *TBAAInfo = ST->getTBAAInfo();
|
||||
AAMDNodes AAInfo = ST->getAAInfo();
|
||||
SDValue ValOp = GetWidenedVector(ST->getValue());
|
||||
SDLoc dl(ST);
|
||||
|
||||
@ -3025,7 +3025,7 @@ DAGTypeLegalizer::GenWidenVectorTruncStores(SmallVectorImpl<SDValue> &StChain,
|
||||
StChain.push_back(DAG.getTruncStore(Chain, dl, EOp, BasePtr,
|
||||
ST->getPointerInfo(), StEltVT,
|
||||
isVolatile, isNonTemporal, Align,
|
||||
TBAAInfo));
|
||||
AAInfo));
|
||||
unsigned Offset = Increment;
|
||||
for (unsigned i=1; i < NumElts; ++i, Offset += Increment) {
|
||||
SDValue NewBasePtr = DAG.getNode(ISD::ADD, dl, BasePtr.getValueType(),
|
||||
@ -3036,7 +3036,7 @@ DAGTypeLegalizer::GenWidenVectorTruncStores(SmallVectorImpl<SDValue> &StChain,
|
||||
StChain.push_back(DAG.getTruncStore(Chain, dl, EOp, NewBasePtr,
|
||||
ST->getPointerInfo().getWithOffset(Offset),
|
||||
StEltVT, isVolatile, isNonTemporal,
|
||||
MinAlign(Align, Offset), TBAAInfo));
|
||||
MinAlign(Align, Offset), AAInfo));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4645,7 +4645,7 @@ SelectionDAG::getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
|
||||
SDValue Ptr, SDValue Offset,
|
||||
MachinePointerInfo PtrInfo, EVT MemVT,
|
||||
bool isVolatile, bool isNonTemporal, bool isInvariant,
|
||||
unsigned Alignment, const MDNode *TBAAInfo,
|
||||
unsigned Alignment, const AAMDNodes &AAInfo,
|
||||
const MDNode *Ranges) {
|
||||
assert(Chain.getValueType() == MVT::Other &&
|
||||
"Invalid chain type");
|
||||
@ -4668,7 +4668,7 @@ SelectionDAG::getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
|
||||
MachineFunction &MF = getMachineFunction();
|
||||
MachineMemOperand *MMO =
|
||||
MF.getMachineMemOperand(PtrInfo, Flags, MemVT.getStoreSize(), Alignment,
|
||||
TBAAInfo, Ranges);
|
||||
AAInfo, Ranges);
|
||||
return getLoad(AM, ExtType, VT, dl, Chain, Ptr, Offset, MemVT, MMO);
|
||||
}
|
||||
|
||||
@ -4726,12 +4726,12 @@ SDValue SelectionDAG::getLoad(EVT VT, SDLoc dl,
|
||||
MachinePointerInfo PtrInfo,
|
||||
bool isVolatile, bool isNonTemporal,
|
||||
bool isInvariant, unsigned Alignment,
|
||||
const MDNode *TBAAInfo,
|
||||
const AAMDNodes &AAInfo,
|
||||
const MDNode *Ranges) {
|
||||
SDValue Undef = getUNDEF(Ptr.getValueType());
|
||||
return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
|
||||
PtrInfo, VT, isVolatile, isNonTemporal, isInvariant, Alignment,
|
||||
TBAAInfo, Ranges);
|
||||
AAInfo, Ranges);
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getLoad(EVT VT, SDLoc dl,
|
||||
@ -4746,11 +4746,11 @@ SDValue SelectionDAG::getExtLoad(ISD::LoadExtType ExtType, SDLoc dl, EVT VT,
|
||||
SDValue Chain, SDValue Ptr,
|
||||
MachinePointerInfo PtrInfo, EVT MemVT,
|
||||
bool isVolatile, bool isNonTemporal,
|
||||
unsigned Alignment, const MDNode *TBAAInfo) {
|
||||
unsigned Alignment, const AAMDNodes &AAInfo) {
|
||||
SDValue Undef = getUNDEF(Ptr.getValueType());
|
||||
return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef,
|
||||
PtrInfo, MemVT, isVolatile, isNonTemporal, false, Alignment,
|
||||
TBAAInfo);
|
||||
AAInfo);
|
||||
}
|
||||
|
||||
|
||||
@ -4777,7 +4777,7 @@ SelectionDAG::getIndexedLoad(SDValue OrigLoad, SDLoc dl, SDValue Base,
|
||||
SDValue SelectionDAG::getStore(SDValue Chain, SDLoc dl, SDValue Val,
|
||||
SDValue Ptr, MachinePointerInfo PtrInfo,
|
||||
bool isVolatile, bool isNonTemporal,
|
||||
unsigned Alignment, const MDNode *TBAAInfo) {
|
||||
unsigned Alignment, const AAMDNodes &AAInfo) {
|
||||
assert(Chain.getValueType() == MVT::Other &&
|
||||
"Invalid chain type");
|
||||
if (Alignment == 0) // Ensure that codegen never sees alignment 0
|
||||
@ -4796,7 +4796,7 @@ SDValue SelectionDAG::getStore(SDValue Chain, SDLoc dl, SDValue Val,
|
||||
MachineMemOperand *MMO =
|
||||
MF.getMachineMemOperand(PtrInfo, Flags,
|
||||
Val.getValueType().getStoreSize(), Alignment,
|
||||
TBAAInfo);
|
||||
AAInfo);
|
||||
|
||||
return getStore(Chain, dl, Val, Ptr, MMO);
|
||||
}
|
||||
@ -4832,7 +4832,7 @@ SDValue SelectionDAG::getTruncStore(SDValue Chain, SDLoc dl, SDValue Val,
|
||||
SDValue Ptr, MachinePointerInfo PtrInfo,
|
||||
EVT SVT,bool isVolatile, bool isNonTemporal,
|
||||
unsigned Alignment,
|
||||
const MDNode *TBAAInfo) {
|
||||
const AAMDNodes &AAInfo) {
|
||||
assert(Chain.getValueType() == MVT::Other &&
|
||||
"Invalid chain type");
|
||||
if (Alignment == 0) // Ensure that codegen never sees alignment 0
|
||||
@ -4850,7 +4850,7 @@ SDValue SelectionDAG::getTruncStore(SDValue Chain, SDLoc dl, SDValue Val,
|
||||
MachineFunction &MF = getMachineFunction();
|
||||
MachineMemOperand *MMO =
|
||||
MF.getMachineMemOperand(PtrInfo, Flags, SVT.getStoreSize(), Alignment,
|
||||
TBAAInfo);
|
||||
AAInfo);
|
||||
|
||||
return getTruncStore(Chain, dl, Val, Ptr, SVT, MMO);
|
||||
}
|
||||
|
@ -3467,7 +3467,9 @@ void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
|
||||
bool isNonTemporal = I.getMetadata("nontemporal") != nullptr;
|
||||
bool isInvariant = I.getMetadata("invariant.load") != nullptr;
|
||||
unsigned Alignment = I.getAlignment();
|
||||
const MDNode *TBAAInfo = I.getMetadata(LLVMContext::MD_tbaa);
|
||||
|
||||
AAMDNodes AAInfo;
|
||||
I.getAAMetadata(AAInfo);
|
||||
const MDNode *Ranges = I.getMetadata(LLVMContext::MD_range);
|
||||
|
||||
SmallVector<EVT, 4> ValueVTs;
|
||||
@ -3483,7 +3485,7 @@ void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
|
||||
// Serialize volatile loads with other side effects.
|
||||
Root = getRoot();
|
||||
else if (AA->pointsToConstantMemory(
|
||||
AliasAnalysis::Location(SV, AA->getTypeStoreSize(Ty), TBAAInfo))) {
|
||||
AliasAnalysis::Location(SV, AA->getTypeStoreSize(Ty), AAInfo))) {
|
||||
// Do not serialize (non-volatile) loads of constant memory with anything.
|
||||
Root = DAG.getEntryNode();
|
||||
ConstantMemory = true;
|
||||
@ -3520,7 +3522,7 @@ void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
|
||||
DAG.getConstant(Offsets[i], PtrVT));
|
||||
SDValue L = DAG.getLoad(ValueVTs[i], getCurSDLoc(), Root,
|
||||
A, MachinePointerInfo(SV, Offsets[i]), isVolatile,
|
||||
isNonTemporal, isInvariant, Alignment, TBAAInfo,
|
||||
isNonTemporal, isInvariant, Alignment, AAInfo,
|
||||
Ranges);
|
||||
|
||||
Values[i] = L;
|
||||
@ -3567,7 +3569,9 @@ void SelectionDAGBuilder::visitStore(const StoreInst &I) {
|
||||
bool isVolatile = I.isVolatile();
|
||||
bool isNonTemporal = I.getMetadata("nontemporal") != nullptr;
|
||||
unsigned Alignment = I.getAlignment();
|
||||
const MDNode *TBAAInfo = I.getMetadata(LLVMContext::MD_tbaa);
|
||||
|
||||
AAMDNodes AAInfo;
|
||||
I.getAAMetadata(AAInfo);
|
||||
|
||||
unsigned ChainI = 0;
|
||||
for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
|
||||
@ -3583,7 +3587,7 @@ void SelectionDAGBuilder::visitStore(const StoreInst &I) {
|
||||
SDValue St = DAG.getStore(Root, getCurSDLoc(),
|
||||
SDValue(Src.getNode(), Src.getResNo() + i),
|
||||
Add, MachinePointerInfo(PtrV, Offsets[i]),
|
||||
isVolatile, isNonTemporal, Alignment, TBAAInfo);
|
||||
isVolatile, isNonTemporal, Alignment, AAInfo);
|
||||
Chains[ChainI] = St;
|
||||
}
|
||||
|
||||
|
@ -687,6 +687,10 @@ void Instruction::setMetadata(unsigned KindID, MDNode *Node) {
|
||||
// Otherwise, removing an entry that doesn't exist on the instruction.
|
||||
}
|
||||
|
||||
void Instruction::setAAMetadata(const AAMDNodes &N) {
|
||||
setMetadata(LLVMContext::MD_tbaa, N.TBAA);
|
||||
}
|
||||
|
||||
MDNode *Instruction::getMetadataImpl(unsigned KindID) const {
|
||||
// Handle 'dbg' as a special case since it is not stored in the hash table.
|
||||
if (KindID == LLVMContext::MD_dbg)
|
||||
|
@ -8606,7 +8606,7 @@ static SDValue PerformSTORECombine(SDNode *N,
|
||||
return DAG.getStore(St->getChain(), dl, V, St->getBasePtr(),
|
||||
St->getPointerInfo(), St->isVolatile(),
|
||||
St->isNonTemporal(), St->getAlignment(),
|
||||
St->getTBAAInfo());
|
||||
St->getAAInfo());
|
||||
}
|
||||
|
||||
/// hasNormalLoadOperand - Check if any of the operands of a BUILD_VECTOR node
|
||||
|
@ -1246,13 +1246,13 @@ SDValue MipsSETargetLowering::lowerSTORE(SDValue Op, SelectionDAG &DAG) const {
|
||||
// i32 store to lower address.
|
||||
Chain = DAG.getStore(Chain, DL, Lo, Ptr, MachinePointerInfo(),
|
||||
Nd.isVolatile(), Nd.isNonTemporal(), Nd.getAlignment(),
|
||||
Nd.getTBAAInfo());
|
||||
Nd.getAAInfo());
|
||||
|
||||
// i32 store to higher address.
|
||||
Ptr = DAG.getNode(ISD::ADD, DL, PtrVT, Ptr, DAG.getConstant(4, PtrVT));
|
||||
return DAG.getStore(Chain, DL, Hi, Ptr, MachinePointerInfo(),
|
||||
Nd.isVolatile(), Nd.isNonTemporal(),
|
||||
std::min(Nd.getAlignment(), 4U), Nd.getTBAAInfo());
|
||||
std::min(Nd.getAlignment(), 4U), Nd.getAAInfo());
|
||||
}
|
||||
|
||||
SDValue MipsSETargetLowering::lowerMulDiv(SDValue Op, unsigned NewOpc,
|
||||
|
@ -1000,8 +1000,8 @@ bool SystemZDAGToDAGISel::canUseBlockOperation(StoreSDNode *Store,
|
||||
if (V1 == V2 && End1 == End2)
|
||||
return false;
|
||||
|
||||
return !AA->alias(AliasAnalysis::Location(V1, End1, Load->getTBAAInfo()),
|
||||
AliasAnalysis::Location(V2, End2, Store->getTBAAInfo()));
|
||||
return !AA->alias(AliasAnalysis::Location(V1, End1, Load->getAAInfo()),
|
||||
AliasAnalysis::Location(V2, End2, Store->getAAInfo()));
|
||||
}
|
||||
|
||||
bool SystemZDAGToDAGISel::storeLoadCanUseMVC(SDNode *N) const {
|
||||
|
@ -969,7 +969,7 @@ LowerATOMIC_LOAD(SDValue Op, SelectionDAG &DAG) const {
|
||||
N->getBasePtr(), N->getPointerInfo(),
|
||||
N->isVolatile(), N->isNonTemporal(),
|
||||
N->isInvariant(), N->getAlignment(),
|
||||
N->getTBAAInfo(), N->getRanges());
|
||||
N->getAAInfo(), N->getRanges());
|
||||
}
|
||||
if (N->getMemoryVT() == MVT::i16) {
|
||||
if (N->getAlignment() < 2)
|
||||
@ -977,13 +977,13 @@ LowerATOMIC_LOAD(SDValue Op, SelectionDAG &DAG) const {
|
||||
return DAG.getExtLoad(ISD::EXTLOAD, SDLoc(Op), MVT::i32, N->getChain(),
|
||||
N->getBasePtr(), N->getPointerInfo(), MVT::i16,
|
||||
N->isVolatile(), N->isNonTemporal(),
|
||||
N->getAlignment(), N->getTBAAInfo());
|
||||
N->getAlignment(), N->getAAInfo());
|
||||
}
|
||||
if (N->getMemoryVT() == MVT::i8)
|
||||
return DAG.getExtLoad(ISD::EXTLOAD, SDLoc(Op), MVT::i32, N->getChain(),
|
||||
N->getBasePtr(), N->getPointerInfo(), MVT::i8,
|
||||
N->isVolatile(), N->isNonTemporal(),
|
||||
N->getAlignment(), N->getTBAAInfo());
|
||||
N->getAlignment(), N->getAAInfo());
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
@ -999,7 +999,7 @@ LowerATOMIC_STORE(SDValue Op, SelectionDAG &DAG) const {
|
||||
return DAG.getStore(N->getChain(), SDLoc(Op), N->getVal(),
|
||||
N->getBasePtr(), N->getPointerInfo(),
|
||||
N->isVolatile(), N->isNonTemporal(),
|
||||
N->getAlignment(), N->getTBAAInfo());
|
||||
N->getAlignment(), N->getAAInfo());
|
||||
}
|
||||
if (N->getMemoryVT() == MVT::i16) {
|
||||
if (N->getAlignment() < 2)
|
||||
@ -1007,13 +1007,13 @@ LowerATOMIC_STORE(SDValue Op, SelectionDAG &DAG) const {
|
||||
return DAG.getTruncStore(N->getChain(), SDLoc(Op), N->getVal(),
|
||||
N->getBasePtr(), N->getPointerInfo(), MVT::i16,
|
||||
N->isVolatile(), N->isNonTemporal(),
|
||||
N->getAlignment(), N->getTBAAInfo());
|
||||
N->getAlignment(), N->getAAInfo());
|
||||
}
|
||||
if (N->getMemoryVT() == MVT::i8)
|
||||
return DAG.getTruncStore(N->getChain(), SDLoc(Op), N->getVal(),
|
||||
N->getBasePtr(), N->getPointerInfo(), MVT::i8,
|
||||
N->isVolatile(), N->isNonTemporal(),
|
||||
N->getAlignment(), N->getTBAAInfo());
|
||||
N->getAlignment(), N->getAAInfo());
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
|
@ -720,9 +720,11 @@ CallGraphNode *ArgPromotion::DoPromotion(Function *F,
|
||||
// of the previous load.
|
||||
LoadInst *newLoad = new LoadInst(V, V->getName()+".val", Call);
|
||||
newLoad->setAlignment(OrigLoad->getAlignment());
|
||||
// Transfer the TBAA info too.
|
||||
newLoad->setMetadata(LLVMContext::MD_tbaa,
|
||||
OrigLoad->getMetadata(LLVMContext::MD_tbaa));
|
||||
// Transfer the AA info too.
|
||||
AAMDNodes AAInfo;
|
||||
OrigLoad->getAAMetadata(AAInfo);
|
||||
newLoad->setAAMetadata(AAInfo);
|
||||
|
||||
Args.push_back(newLoad);
|
||||
AA.copyValue(OrigLoad, Args.back());
|
||||
}
|
||||
|
@ -204,9 +204,11 @@ bool FunctionAttrs::AddReadAttrs(const CallGraphSCC &SCC) {
|
||||
CI != CE; ++CI) {
|
||||
Value *Arg = *CI;
|
||||
if (Arg->getType()->isPointerTy()) {
|
||||
AAMDNodes AAInfo;
|
||||
I->getAAMetadata(AAInfo);
|
||||
|
||||
AliasAnalysis::Location Loc(Arg,
|
||||
AliasAnalysis::UnknownSize,
|
||||
I->getMetadata(LLVMContext::MD_tbaa));
|
||||
AliasAnalysis::UnknownSize, AAInfo);
|
||||
if (!AA->pointsToConstantMemory(Loc, /*OrLocal=*/true)) {
|
||||
if (MRB & AliasAnalysis::Mod)
|
||||
// Writes non-local memory. Give up.
|
||||
|
@ -836,12 +836,13 @@ bool InstCombiner::SimplifyStoreAtEndOfBlock(StoreInst &SI) {
|
||||
InsertNewInstBefore(NewSI, *BBI);
|
||||
NewSI->setDebugLoc(OtherStore->getDebugLoc());
|
||||
|
||||
// If the two stores had the same TBAA tag, preserve it.
|
||||
if (MDNode *TBAATag = SI.getMetadata(LLVMContext::MD_tbaa))
|
||||
if ((TBAATag = MDNode::getMostGenericTBAA(TBAATag,
|
||||
OtherStore->getMetadata(LLVMContext::MD_tbaa))))
|
||||
NewSI->setMetadata(LLVMContext::MD_tbaa, TBAATag);
|
||||
|
||||
// If the two stores had AA tags, merge them.
|
||||
AAMDNodes AATags;
|
||||
SI.getAAMetadata(AATags);
|
||||
if (AATags) {
|
||||
OtherStore->getAAMetadata(AATags, /* Merge = */ true);
|
||||
NewSI->setAAMetadata(AATags);
|
||||
}
|
||||
|
||||
// Nuke the old stores.
|
||||
EraseInstFromFunction(SI);
|
||||
|
@ -62,8 +62,8 @@ ObjCARCAliasAnalysis::alias(const Location &LocA, const Location &LocB) {
|
||||
const Value *SA = StripPointerCastsAndObjCCalls(LocA.Ptr);
|
||||
const Value *SB = StripPointerCastsAndObjCCalls(LocB.Ptr);
|
||||
AliasResult Result =
|
||||
AliasAnalysis::alias(Location(SA, LocA.Size, LocA.TBAATag),
|
||||
Location(SB, LocB.Size, LocB.TBAATag));
|
||||
AliasAnalysis::alias(Location(SA, LocA.Size, LocA.AATags),
|
||||
Location(SB, LocB.Size, LocB.AATags));
|
||||
if (Result != MayAlias)
|
||||
return Result;
|
||||
|
||||
@ -93,7 +93,7 @@ ObjCARCAliasAnalysis::pointsToConstantMemory(const Location &Loc,
|
||||
// First, strip off no-ops, including ObjC-specific no-ops, and try making
|
||||
// a precise alias query.
|
||||
const Value *S = StripPointerCastsAndObjCCalls(Loc.Ptr);
|
||||
if (AliasAnalysis::pointsToConstantMemory(Location(S, Loc.Size, Loc.TBAATag),
|
||||
if (AliasAnalysis::pointsToConstantMemory(Location(S, Loc.Size, Loc.AATags),
|
||||
OrLocal))
|
||||
return true;
|
||||
|
||||
|
@ -1669,9 +1669,11 @@ bool GVN::PerformLoadPRE(LoadInst *LI, AvailValInBlkVect &ValuesPerBlock,
|
||||
LI->getAlignment(),
|
||||
UnavailablePred->getTerminator());
|
||||
|
||||
// Transfer the old load's TBAA tag to the new load.
|
||||
if (MDNode *Tag = LI->getMetadata(LLVMContext::MD_tbaa))
|
||||
NewLoad->setMetadata(LLVMContext::MD_tbaa, Tag);
|
||||
// Transfer the old load's AA tags to the new load.
|
||||
AAMDNodes Tags;
|
||||
LI->getAAMetadata(Tags);
|
||||
if (Tags)
|
||||
NewLoad->setAAMetadata(Tags);
|
||||
|
||||
// Transfer DebugLoc.
|
||||
NewLoad->setDebugLoc(LI->getDebugLoc());
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "llvm/IR/DataLayout.h"
|
||||
#include "llvm/IR/IntrinsicInst.h"
|
||||
#include "llvm/IR/LLVMContext.h"
|
||||
#include "llvm/IR/Metadata.h"
|
||||
#include "llvm/IR/ValueHandle.h"
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
@ -888,9 +889,10 @@ bool JumpThreading::SimplifyPartiallyRedundantLoad(LoadInst *LI) {
|
||||
if (BBIt != LoadBB->begin())
|
||||
return false;
|
||||
|
||||
// If all of the loads and stores that feed the value have the same TBAA tag,
|
||||
// then we can propagate it onto any newly inserted loads.
|
||||
MDNode *TBAATag = LI->getMetadata(LLVMContext::MD_tbaa);
|
||||
// If all of the loads and stores that feed the value have the same AA tags,
|
||||
// then we can propagate them onto any newly inserted loads.
|
||||
AAMDNodes AATags;
|
||||
LI->getAAMetadata(AATags);
|
||||
|
||||
SmallPtrSet<BasicBlock*, 8> PredsScanned;
|
||||
typedef SmallVector<std::pair<BasicBlock*, Value*>, 8> AvailablePredsTy;
|
||||
@ -909,16 +911,16 @@ bool JumpThreading::SimplifyPartiallyRedundantLoad(LoadInst *LI) {
|
||||
|
||||
// Scan the predecessor to see if the value is available in the pred.
|
||||
BBIt = PredBB->end();
|
||||
MDNode *ThisTBAATag = nullptr;
|
||||
AAMDNodes ThisAATags;
|
||||
Value *PredAvailable = FindAvailableLoadedValue(LoadedPtr, PredBB, BBIt, 6,
|
||||
nullptr, &ThisTBAATag);
|
||||
nullptr, &ThisAATags);
|
||||
if (!PredAvailable) {
|
||||
OneUnavailablePred = PredBB;
|
||||
continue;
|
||||
}
|
||||
|
||||
// If tbaa tags disagree or are not present, forget about them.
|
||||
if (TBAATag != ThisTBAATag) TBAATag = nullptr;
|
||||
// If AA tags disagree or are not present, forget about them.
|
||||
if (AATags != ThisAATags) AATags = AAMDNodes();
|
||||
|
||||
// If so, this load is partially redundant. Remember this info so that we
|
||||
// can create a PHI node.
|
||||
@ -978,8 +980,8 @@ bool JumpThreading::SimplifyPartiallyRedundantLoad(LoadInst *LI) {
|
||||
LI->getAlignment(),
|
||||
UnavailablePred->getTerminator());
|
||||
NewVal->setDebugLoc(LI->getDebugLoc());
|
||||
if (TBAATag)
|
||||
NewVal->setMetadata(LLVMContext::MD_tbaa, TBAATag);
|
||||
if (AATags)
|
||||
NewVal->setAAMetadata(AATags);
|
||||
|
||||
AvailablePreds.push_back(std::make_pair(UnavailablePred, NewVal));
|
||||
}
|
||||
|
@ -180,9 +180,9 @@ namespace {
|
||||
/// store into the memory location pointed to by V.
|
||||
///
|
||||
bool pointerInvalidatedByLoop(Value *V, uint64_t Size,
|
||||
const MDNode *TBAAInfo) {
|
||||
const AAMDNodes &AAInfo) {
|
||||
// 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, AAInfo).isMod();
|
||||
}
|
||||
|
||||
bool canSinkOrHoistInst(Instruction &I);
|
||||
@ -448,8 +448,11 @@ bool LICM::canSinkOrHoistInst(Instruction &I) {
|
||||
uint64_t Size = 0;
|
||||
if (LI->getType()->isSized())
|
||||
Size = AA->getTypeStoreSize(LI->getType());
|
||||
return !pointerInvalidatedByLoop(LI->getOperand(0), Size,
|
||||
LI->getMetadata(LLVMContext::MD_tbaa));
|
||||
|
||||
AAMDNodes AAInfo;
|
||||
LI->getAAMetadata(AAInfo);
|
||||
|
||||
return !pointerInvalidatedByLoop(LI->getOperand(0), Size, AAInfo);
|
||||
} else if (CallInst *CI = dyn_cast<CallInst>(&I)) {
|
||||
// Don't sink or hoist dbg info; it's legal, but not useful.
|
||||
if (isa<DbgInfoIntrinsic>(I))
|
||||
@ -690,7 +693,7 @@ namespace {
|
||||
LoopInfo &LI;
|
||||
DebugLoc DL;
|
||||
int Alignment;
|
||||
MDNode *TBAATag;
|
||||
AAMDNodes AATags;
|
||||
|
||||
Value *maybeInsertLCSSAPHI(Value *V, BasicBlock *BB) const {
|
||||
if (Instruction *I = dyn_cast<Instruction>(V))
|
||||
@ -714,10 +717,10 @@ namespace {
|
||||
SmallVectorImpl<BasicBlock *> &LEB,
|
||||
SmallVectorImpl<Instruction *> &LIP, PredIteratorCache &PIC,
|
||||
AliasSetTracker &ast, LoopInfo &li, DebugLoc dl, int alignment,
|
||||
MDNode *TBAATag)
|
||||
const AAMDNodes &AATags)
|
||||
: LoadAndStorePromoter(Insts, S), SomePtr(SP), PointerMustAliases(PMA),
|
||||
LoopExitBlocks(LEB), LoopInsertPts(LIP), PredCache(PIC), AST(ast),
|
||||
LI(li), DL(dl), Alignment(alignment), TBAATag(TBAATag) {}
|
||||
LI(li), DL(dl), Alignment(alignment), AATags(AATags) {}
|
||||
|
||||
bool isInstInList(Instruction *I,
|
||||
const SmallVectorImpl<Instruction*> &) const override {
|
||||
@ -743,7 +746,7 @@ namespace {
|
||||
StoreInst *NewSI = new StoreInst(LiveInValue, Ptr, InsertPos);
|
||||
NewSI->setAlignment(Alignment);
|
||||
NewSI->setDebugLoc(DL);
|
||||
if (TBAATag) NewSI->setMetadata(LLVMContext::MD_tbaa, TBAATag);
|
||||
if (AATags) NewSI->setAAMetadata(AATags);
|
||||
}
|
||||
}
|
||||
|
||||
@ -798,11 +801,11 @@ void LICM::PromoteAliasSet(AliasSet &AS,
|
||||
// We start with an alignment of one and try to find instructions that allow
|
||||
// us to prove better alignment.
|
||||
unsigned Alignment = 1;
|
||||
MDNode *TBAATag = nullptr;
|
||||
AAMDNodes AATags;
|
||||
|
||||
// Check that all of the pointers in the alias set have the same type. We
|
||||
// cannot (yet) promote a memory location that is loaded and stored in
|
||||
// different sizes. While we are at it, collect alignment and TBAA info.
|
||||
// different sizes. While we are at it, collect alignment and AA info.
|
||||
for (AliasSet::iterator ASI = AS.begin(), E = AS.end(); ASI != E; ++ASI) {
|
||||
Value *ASIV = ASI->getValue();
|
||||
PointerMustAliases.insert(ASIV);
|
||||
@ -855,13 +858,12 @@ void LICM::PromoteAliasSet(AliasSet &AS,
|
||||
} else
|
||||
return; // Not a load or store.
|
||||
|
||||
// Merge the TBAA tags.
|
||||
// Merge the AA tags.
|
||||
if (LoopUses.empty()) {
|
||||
// On the first load/store, just take its TBAA tag.
|
||||
TBAATag = UI->getMetadata(LLVMContext::MD_tbaa);
|
||||
} else if (TBAATag) {
|
||||
TBAATag = MDNode::getMostGenericTBAA(TBAATag,
|
||||
UI->getMetadata(LLVMContext::MD_tbaa));
|
||||
// On the first load/store, just take its AA tags.
|
||||
UI->getAAMetadata(AATags);
|
||||
} else if (AATags) {
|
||||
UI->getAAMetadata(AATags, /* Merge = */ true);
|
||||
}
|
||||
|
||||
LoopUses.push_back(UI);
|
||||
@ -896,7 +898,7 @@ void LICM::PromoteAliasSet(AliasSet &AS,
|
||||
SmallVector<PHINode*, 16> NewPHIs;
|
||||
SSAUpdater SSA(&NewPHIs);
|
||||
LoopPromoter Promoter(SomePtr, LoopUses, SSA, PointerMustAliases, ExitBlocks,
|
||||
InsertPts, PIC, *CurAST, *LI, DL, Alignment, TBAATag);
|
||||
InsertPts, PIC, *CurAST, *LI, DL, Alignment, AATags);
|
||||
|
||||
// Set up the preheader to have a definition of the value. It is the live-out
|
||||
// value from the preheader that uses in the loop will use.
|
||||
@ -905,7 +907,7 @@ void LICM::PromoteAliasSet(AliasSet &AS,
|
||||
Preheader->getTerminator());
|
||||
PreheaderLoad->setAlignment(Alignment);
|
||||
PreheaderLoad->setDebugLoc(DL);
|
||||
if (TBAATag) PreheaderLoad->setMetadata(LLVMContext::MD_tbaa, TBAATag);
|
||||
if (AATags) PreheaderLoad->setAAMetadata(AATags);
|
||||
SSA.AddAvailableValue(Preheader, PreheaderLoad);
|
||||
|
||||
// Rewrite all the loads in the loop and remember all the definitions from
|
||||
|
@ -1148,10 +1148,12 @@ static void speculatePHINodeLoads(PHINode &PN) {
|
||||
PHINode *NewPN = PHIBuilder.CreatePHI(LoadTy, PN.getNumIncomingValues(),
|
||||
PN.getName() + ".sroa.speculated");
|
||||
|
||||
// Get the TBAA tag and alignment to use from one of the loads. It doesn't
|
||||
// Get the AA tags and alignment to use from one of the loads. It doesn't
|
||||
// matter which one we get and if any differ.
|
||||
LoadInst *SomeLoad = cast<LoadInst>(PN.user_back());
|
||||
MDNode *TBAATag = SomeLoad->getMetadata(LLVMContext::MD_tbaa);
|
||||
|
||||
AAMDNodes AATags;
|
||||
SomeLoad->getAAMetadata(AATags);
|
||||
unsigned Align = SomeLoad->getAlignment();
|
||||
|
||||
// Rewrite all loads of the PN to use the new PHI.
|
||||
@ -1172,8 +1174,8 @@ static void speculatePHINodeLoads(PHINode &PN) {
|
||||
InVal, (PN.getName() + ".sroa.speculate.load." + Pred->getName()));
|
||||
++NumLoadsSpeculated;
|
||||
Load->setAlignment(Align);
|
||||
if (TBAATag)
|
||||
Load->setMetadata(LLVMContext::MD_tbaa, TBAATag);
|
||||
if (AATags)
|
||||
Load->setAAMetadata(AATags);
|
||||
NewPN->addIncoming(Load, Pred);
|
||||
}
|
||||
|
||||
@ -1238,12 +1240,15 @@ static void speculateSelectInstLoads(SelectInst &SI) {
|
||||
IRB.CreateLoad(FV, LI->getName() + ".sroa.speculate.load.false");
|
||||
NumLoadsSpeculated += 2;
|
||||
|
||||
// Transfer alignment and TBAA info if present.
|
||||
// Transfer alignment and AA info if present.
|
||||
TL->setAlignment(LI->getAlignment());
|
||||
FL->setAlignment(LI->getAlignment());
|
||||
if (MDNode *Tag = LI->getMetadata(LLVMContext::MD_tbaa)) {
|
||||
TL->setMetadata(LLVMContext::MD_tbaa, Tag);
|
||||
FL->setMetadata(LLVMContext::MD_tbaa, Tag);
|
||||
|
||||
AAMDNodes Tags;
|
||||
LI->getAAMetadata(Tags);
|
||||
if (Tags) {
|
||||
TL->setAAMetadata(Tags);
|
||||
FL->setAAMetadata(Tags);
|
||||
}
|
||||
|
||||
Value *V = IRB.CreateSelect(SI.getCondition(), TL, FL,
|
||||
|
@ -1333,12 +1333,15 @@ static bool tryToMakeAllocaBePromotable(AllocaInst *AI, const DataLayout *DL) {
|
||||
LoadInst *FalseLoad =
|
||||
Builder.CreateLoad(SI->getFalseValue(), LI->getName()+".f");
|
||||
|
||||
// Transfer alignment and TBAA info if present.
|
||||
// Transfer alignment and AA info if present.
|
||||
TrueLoad->setAlignment(LI->getAlignment());
|
||||
FalseLoad->setAlignment(LI->getAlignment());
|
||||
if (MDNode *Tag = LI->getMetadata(LLVMContext::MD_tbaa)) {
|
||||
TrueLoad->setMetadata(LLVMContext::MD_tbaa, Tag);
|
||||
FalseLoad->setMetadata(LLVMContext::MD_tbaa, Tag);
|
||||
|
||||
AAMDNodes Tags;
|
||||
LI->getAAMetadata(Tags);
|
||||
if (Tags) {
|
||||
TrueLoad->setAAMetadata(Tags);
|
||||
FalseLoad->setAAMetadata(Tags);
|
||||
}
|
||||
|
||||
Value *V = Builder.CreateSelect(SI->getCondition(), TrueLoad, FalseLoad);
|
||||
@ -1364,10 +1367,12 @@ static bool tryToMakeAllocaBePromotable(AllocaInst *AI, const DataLayout *DL) {
|
||||
PHINode *NewPN = PHINode::Create(LoadTy, PN->getNumIncomingValues(),
|
||||
PN->getName()+".ld", PN);
|
||||
|
||||
// Get the TBAA tag and alignment to use from one of the loads. It doesn't
|
||||
// Get the AA tags and alignment to use from one of the loads. It doesn't
|
||||
// matter which one we get and if any differ, it doesn't matter.
|
||||
LoadInst *SomeLoad = cast<LoadInst>(PN->user_back());
|
||||
MDNode *TBAATag = SomeLoad->getMetadata(LLVMContext::MD_tbaa);
|
||||
|
||||
AAMDNodes AATags;
|
||||
SomeLoad->getAAMetadata(AATags);
|
||||
unsigned Align = SomeLoad->getAlignment();
|
||||
|
||||
// Rewrite all loads of the PN to use the new PHI.
|
||||
@ -1389,7 +1394,7 @@ static bool tryToMakeAllocaBePromotable(AllocaInst *AI, const DataLayout *DL) {
|
||||
PN->getName() + "." + Pred->getName(),
|
||||
Pred->getTerminator());
|
||||
Load->setAlignment(Align);
|
||||
if (TBAATag) Load->setMetadata(LLVMContext::MD_tbaa, TBAATag);
|
||||
if (AATags) Load->setAAMetadata(AATags);
|
||||
}
|
||||
|
||||
NewPN->addIncoming(Load, Pred);
|
||||
|
@ -3937,7 +3937,7 @@ public:
|
||||
/// \brief Register a load and whether it is only read from.
|
||||
void addLoad(AliasAnalysis::Location &Loc, bool IsReadOnly) {
|
||||
Value *Ptr = const_cast<Value*>(Loc.Ptr);
|
||||
AST.add(Ptr, AliasAnalysis::UnknownSize, Loc.TBAATag);
|
||||
AST.add(Ptr, AliasAnalysis::UnknownSize, Loc.AATags);
|
||||
Accesses.insert(MemAccessInfo(Ptr, false));
|
||||
if (IsReadOnly)
|
||||
ReadOnlyPtr.insert(Ptr);
|
||||
@ -3946,7 +3946,7 @@ public:
|
||||
/// \brief Register a store.
|
||||
void addStore(AliasAnalysis::Location &Loc) {
|
||||
Value *Ptr = const_cast<Value*>(Loc.Ptr);
|
||||
AST.add(Ptr, AliasAnalysis::UnknownSize, Loc.TBAATag);
|
||||
AST.add(Ptr, AliasAnalysis::UnknownSize, Loc.AATags);
|
||||
Accesses.insert(MemAccessInfo(Ptr, true));
|
||||
}
|
||||
|
||||
@ -4737,7 +4737,7 @@ bool LoopVectorizationLegality::canVectorizeMemory() {
|
||||
// condition, so we cannot rely on it when determining whether or not we
|
||||
// need runtime pointer checks.
|
||||
if (blockNeedsPredication(ST->getParent()))
|
||||
Loc.TBAATag = nullptr;
|
||||
Loc.AATags.TBAA = nullptr;
|
||||
|
||||
Accesses.addStore(Loc);
|
||||
}
|
||||
@ -4772,7 +4772,7 @@ bool LoopVectorizationLegality::canVectorizeMemory() {
|
||||
// condition, so we cannot rely on it when determining whether or not we
|
||||
// need runtime pointer checks.
|
||||
if (blockNeedsPredication(LD->getParent()))
|
||||
Loc.TBAATag = nullptr;
|
||||
Loc.AATags.TBAA = nullptr;
|
||||
|
||||
Accesses.addLoad(Loc, IsReadOnlyPtr);
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
; RUN: opt < %s -tbaa -basicaa -aa-eval -evaluate-tbaa -print-no-aliases -print-may-aliases -disable-output 2>&1 | FileCheck %s
|
||||
; RUN: opt < %s -tbaa -basicaa -aa-eval -evaluate-aa-metadata -print-no-aliases -print-may-aliases -disable-output 2>&1 | FileCheck %s
|
||||
|
||||
; Generated with "clang -cc1 -disable-llvm-optzns -O1 -emit-llvm"
|
||||
; #include <new>
|
||||
|
@ -1,4 +1,4 @@
|
||||
; RUN: opt < %s -tbaa -basicaa -aa-eval -evaluate-tbaa -print-no-aliases -print-may-aliases -disable-output 2>&1 | FileCheck %s
|
||||
; RUN: opt < %s -tbaa -basicaa -aa-eval -evaluate-aa-metadata -print-no-aliases -print-may-aliases -disable-output 2>&1 | FileCheck %s
|
||||
; RUN: opt < %s -tbaa -basicaa -gvn -S | FileCheck %s --check-prefix=OPT
|
||||
; Generated from clang/test/CodeGen/tbaa.cpp with "-O1 -struct-path-tbaa -disable-llvm-optzns".
|
||||
|
||||
|
@ -65,7 +65,7 @@ TEST_F(MixedTBAATest, MixedTBAA) {
|
||||
// Run the TBAA eval pass on a mixture of path-aware and non-path-aware TBAA.
|
||||
// The order of the metadata (path-aware vs non-path-aware) is important,
|
||||
// because the AA eval pass only runs one test per store-pair.
|
||||
const char* args[] = { "MixedTBAATest", "-evaluate-tbaa" };
|
||||
const char* args[] = { "MixedTBAATest", "-evaluate-aa-metadata" };
|
||||
cl::ParseCommandLineOptions(sizeof(args) / sizeof(const char*), args);
|
||||
PM.add(createTypeBasedAliasAnalysisPass());
|
||||
PM.add(createAAEvalPass());
|
||||
|
Loading…
x
Reference in New Issue
Block a user