mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-27 13:40:30 +00:00
Make CodeGen TBAA-aware.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116890 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8b95c3ebfb
commit
f96e4bd2a3
@ -371,7 +371,8 @@ public:
|
||||
/// explicitly deallocated.
|
||||
MachineMemOperand *getMachineMemOperand(MachinePointerInfo PtrInfo,
|
||||
unsigned f, uint64_t s,
|
||||
unsigned base_alignment);
|
||||
unsigned base_alignment,
|
||||
const MDNode *TBAAInfo = 0);
|
||||
|
||||
/// getMachineMemOperand - Allocate a new MachineMemOperand by copying
|
||||
/// an existing one, adjusting by an offset and using the given size.
|
||||
|
@ -82,6 +82,7 @@ class MachineMemOperand {
|
||||
MachinePointerInfo PtrInfo;
|
||||
uint64_t Size;
|
||||
unsigned Flags;
|
||||
const MDNode *TBAAInfo;
|
||||
|
||||
public:
|
||||
/// Flags values. These may be or'd together.
|
||||
@ -101,7 +102,7 @@ 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);
|
||||
unsigned base_alignment, const MDNode *TBAAInfo = 0);
|
||||
|
||||
const MachinePointerInfo &getPointerInfo() const { return PtrInfo; }
|
||||
|
||||
@ -133,6 +134,9 @@ 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; }
|
||||
|
||||
bool isLoad() const { return Flags & MOLoad; }
|
||||
bool isStore() const { return Flags & MOStore; }
|
||||
bool isVolatile() const { return Flags & MOVolatile; }
|
||||
|
@ -631,18 +631,21 @@ public:
|
||||
///
|
||||
SDValue getLoad(EVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
|
||||
MachinePointerInfo PtrInfo, bool isVolatile,
|
||||
bool isNonTemporal, unsigned Alignment);
|
||||
bool isNonTemporal, unsigned Alignment,
|
||||
const MDNode *TBAAInfo = 0);
|
||||
SDValue getExtLoad(ISD::LoadExtType ExtType, EVT VT, DebugLoc dl,
|
||||
SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo,
|
||||
EVT MemVT, bool isVolatile,
|
||||
bool isNonTemporal, unsigned Alignment);
|
||||
bool isNonTemporal, unsigned Alignment,
|
||||
const MDNode *TBAAInfo = 0);
|
||||
SDValue getIndexedLoad(SDValue OrigLoad, DebugLoc dl, SDValue Base,
|
||||
SDValue Offset, ISD::MemIndexedMode AM);
|
||||
SDValue getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
|
||||
EVT VT, DebugLoc dl,
|
||||
SDValue Chain, SDValue Ptr, SDValue Offset,
|
||||
MachinePointerInfo PtrInfo, EVT MemVT,
|
||||
bool isVolatile, bool isNonTemporal, unsigned Alignment);
|
||||
bool isVolatile, bool isNonTemporal, unsigned Alignment,
|
||||
const MDNode *TBAAInfo = 0);
|
||||
SDValue getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
|
||||
EVT VT, DebugLoc dl,
|
||||
SDValue Chain, SDValue Ptr, SDValue Offset,
|
||||
@ -652,13 +655,15 @@ public:
|
||||
///
|
||||
SDValue getStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
|
||||
MachinePointerInfo PtrInfo, bool isVolatile,
|
||||
bool isNonTemporal, unsigned Alignment);
|
||||
bool isNonTemporal, unsigned Alignment,
|
||||
const MDNode *TBAAInfo = 0);
|
||||
SDValue getStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
|
||||
MachineMemOperand *MMO);
|
||||
SDValue getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
|
||||
MachinePointerInfo PtrInfo, EVT TVT,
|
||||
bool isNonTemporal, bool isVolatile,
|
||||
unsigned Alignment);
|
||||
unsigned Alignment,
|
||||
const MDNode *TBAAInfo = 0);
|
||||
SDValue getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
|
||||
EVT TVT, MachineMemOperand *MMO);
|
||||
SDValue getIndexedStore(SDValue OrigStoe, DebugLoc dl, SDValue Base,
|
||||
|
@ -902,6 +902,9 @@ public:
|
||||
const Value *getSrcValue() const { return MMO->getValue(); }
|
||||
int64_t getSrcValueOffset() const { return MMO->getOffset(); }
|
||||
|
||||
/// Returns the TBAAInfo that describes the dereference.
|
||||
const MDNode *getTBAAInfo() const { return MMO->getTBAAInfo(); }
|
||||
|
||||
/// getMemoryVT - Return the type of the in-memory value.
|
||||
EVT getMemoryVT() const { return MemoryVT; }
|
||||
|
||||
|
@ -191,8 +191,10 @@ MachineFunction::DeleteMachineBasicBlock(MachineBasicBlock *MBB) {
|
||||
|
||||
MachineMemOperand *
|
||||
MachineFunction::getMachineMemOperand(MachinePointerInfo PtrInfo, unsigned f,
|
||||
uint64_t s, unsigned base_alignment) {
|
||||
return new (Allocator) MachineMemOperand(PtrInfo, f, s, base_alignment);
|
||||
uint64_t s, unsigned base_alignment,
|
||||
const MDNode *TBAAInfo) {
|
||||
return new (Allocator) MachineMemOperand(PtrInfo, f, s, base_alignment,
|
||||
TBAAInfo);
|
||||
}
|
||||
|
||||
MachineMemOperand *
|
||||
@ -201,7 +203,8 @@ MachineFunction::getMachineMemOperand(const MachineMemOperand *MMO,
|
||||
return new (Allocator)
|
||||
MachineMemOperand(MachinePointerInfo(MMO->getValue(),
|
||||
MMO->getOffset()+Offset),
|
||||
MMO->getFlags(), Size, MMO->getBaseAlignment());
|
||||
MMO->getFlags(), Size,
|
||||
MMO->getBaseAlignment(), 0);
|
||||
}
|
||||
|
||||
MachineInstr::mmo_iterator
|
||||
@ -231,7 +234,8 @@ MachineFunction::extractLoadMemRefs(MachineInstr::mmo_iterator Begin,
|
||||
MachineMemOperand *JustLoad =
|
||||
getMachineMemOperand((*I)->getPointerInfo(),
|
||||
(*I)->getFlags() & ~MachineMemOperand::MOStore,
|
||||
(*I)->getSize(), (*I)->getBaseAlignment());
|
||||
(*I)->getSize(), (*I)->getBaseAlignment(),
|
||||
(*I)->getTBAAInfo());
|
||||
Result[Index] = JustLoad;
|
||||
}
|
||||
++Index;
|
||||
@ -262,7 +266,8 @@ MachineFunction::extractStoreMemRefs(MachineInstr::mmo_iterator Begin,
|
||||
MachineMemOperand *JustStore =
|
||||
getMachineMemOperand((*I)->getPointerInfo(),
|
||||
(*I)->getFlags() & ~MachineMemOperand::MOLoad,
|
||||
(*I)->getSize(), (*I)->getBaseAlignment());
|
||||
(*I)->getSize(), (*I)->getBaseAlignment(),
|
||||
(*I)->getTBAAInfo());
|
||||
Result[Index] = JustStore;
|
||||
}
|
||||
++Index;
|
||||
|
@ -367,9 +367,11 @@ MachinePointerInfo MachinePointerInfo::getStack(int64_t Offset) {
|
||||
}
|
||||
|
||||
MachineMemOperand::MachineMemOperand(MachinePointerInfo ptrinfo, unsigned f,
|
||||
uint64_t s, unsigned int a)
|
||||
uint64_t s, unsigned int a,
|
||||
const MDNode *TBAAInfo)
|
||||
: PtrInfo(ptrinfo), Size(s),
|
||||
Flags((f & ((1 << MOMaxBits) - 1)) | ((Log2_32(a) + 1) << MOMaxBits)) {
|
||||
Flags((f & ((1 << MOMaxBits) - 1)) | ((Log2_32(a) + 1) << MOMaxBits)),
|
||||
TBAAInfo(TBAAInfo) {
|
||||
assert((PtrInfo.V == 0 || isa<PointerType>(PtrInfo.V->getType())) &&
|
||||
"invalid pointer value");
|
||||
assert(getBaseAlignment() == a && "Alignment is not a power of 2!");
|
||||
@ -442,6 +444,16 @@ raw_ostream &llvm::operator<<(raw_ostream &OS, const MachineMemOperand &MMO) {
|
||||
MMO.getBaseAlignment() != MMO.getSize())
|
||||
OS << "(align=" << MMO.getAlignment() << ")";
|
||||
|
||||
// Print TBAA info.
|
||||
if (const MDNode *TBAAInfo = MMO.getTBAAInfo()) {
|
||||
OS << "(tbaa=";
|
||||
if (TBAAInfo->getNumOperands() > 0)
|
||||
WriteAsOperand(OS, TBAAInfo->getOperand(0), /*PrintType=*/false);
|
||||
else
|
||||
OS << "<unknown>";
|
||||
OS << ")";
|
||||
}
|
||||
|
||||
return OS;
|
||||
}
|
||||
|
||||
@ -1198,7 +1210,9 @@ bool MachineInstr::isInvariantLoad(AliasAnalysis *AA) const {
|
||||
if (PSV->isConstant(MFI))
|
||||
continue;
|
||||
// If we have an AliasAnalysis, ask it whether the memory is constant.
|
||||
if (AA && AA->pointsToConstantMemory(V))
|
||||
if (AA && AA->pointsToConstantMemory(
|
||||
AliasAnalysis::Location(V, (*I)->getSize(),
|
||||
(*I)->getTBAAInfo())))
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -777,7 +777,9 @@ bool MachineLICM::isLoadFromConstantMemory(MachineInstr *MI) {
|
||||
MachineFunction &MF = *MI->getParent()->getParent();
|
||||
return PSV->isConstant(MF.getFrameInfo());
|
||||
} else {
|
||||
return AA->pointsToConstantMemory(MMO->getValue());
|
||||
return AA->pointsToConstantMemory(AliasAnalysis::Location(MMO->getValue(),
|
||||
MMO->getSize(),
|
||||
MMO->getTBAAInfo()));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -248,16 +248,19 @@ namespace {
|
||||
bool isAlias(SDValue Ptr1, int64_t Size1,
|
||||
const Value *SrcValue1, int SrcValueOffset1,
|
||||
unsigned SrcValueAlign1,
|
||||
const MDNode *TBAAInfo1,
|
||||
SDValue Ptr2, int64_t Size2,
|
||||
const Value *SrcValue2, int SrcValueOffset2,
|
||||
unsigned SrcValueAlign2) const;
|
||||
unsigned SrcValueAlign2,
|
||||
const MDNode *TBAAInfo2) const;
|
||||
|
||||
/// FindAliasInfo - Extracts the relevant alias information from the memory
|
||||
/// node. Returns true if the operand was a load.
|
||||
bool FindAliasInfo(SDNode *N,
|
||||
SDValue &Ptr, int64_t &Size,
|
||||
const Value *&SrcValue, int &SrcValueOffset,
|
||||
unsigned &SrcValueAlignment) const;
|
||||
unsigned &SrcValueAlignment,
|
||||
const MDNode *&TBAAInfo) const;
|
||||
|
||||
/// FindBetterChain - Walk up chain skipping non-aliasing memory nodes,
|
||||
/// looking for a better chain (aliasing node.)
|
||||
@ -7045,9 +7048,11 @@ static bool FindBaseOffset(SDValue Ptr, SDValue &Base, int64_t &Offset,
|
||||
bool DAGCombiner::isAlias(SDValue Ptr1, int64_t Size1,
|
||||
const Value *SrcValue1, int SrcValueOffset1,
|
||||
unsigned SrcValueAlign1,
|
||||
const MDNode *TBAAInfo1,
|
||||
SDValue Ptr2, int64_t Size2,
|
||||
const Value *SrcValue2, int SrcValueOffset2,
|
||||
unsigned SrcValueAlign2) const {
|
||||
unsigned SrcValueAlign2,
|
||||
const MDNode *TBAAInfo2) const {
|
||||
// If they are the same then they must be aliases.
|
||||
if (Ptr1 == Ptr2) return true;
|
||||
|
||||
@ -7101,7 +7106,8 @@ bool DAGCombiner::isAlias(SDValue Ptr1, int64_t Size1,
|
||||
int64_t Overlap1 = Size1 + SrcValueOffset1 - MinOffset;
|
||||
int64_t Overlap2 = Size2 + SrcValueOffset2 - MinOffset;
|
||||
AliasAnalysis::AliasResult AAResult =
|
||||
AA.alias(SrcValue1, Overlap1, SrcValue2, Overlap2);
|
||||
AA.alias(AliasAnalysis::Location(SrcValue1, Overlap1, TBAAInfo1),
|
||||
AliasAnalysis::Location(SrcValue2, Overlap2, TBAAInfo2));
|
||||
if (AAResult == AliasAnalysis::NoAlias)
|
||||
return false;
|
||||
}
|
||||
@ -7116,13 +7122,15 @@ bool DAGCombiner::FindAliasInfo(SDNode *N,
|
||||
SDValue &Ptr, int64_t &Size,
|
||||
const Value *&SrcValue,
|
||||
int &SrcValueOffset,
|
||||
unsigned &SrcValueAlign) const {
|
||||
unsigned &SrcValueAlign,
|
||||
const MDNode *&TBAAInfo) const {
|
||||
if (LoadSDNode *LD = dyn_cast<LoadSDNode>(N)) {
|
||||
Ptr = LD->getBasePtr();
|
||||
Size = LD->getMemoryVT().getSizeInBits() >> 3;
|
||||
SrcValue = LD->getSrcValue();
|
||||
SrcValueOffset = LD->getSrcValueOffset();
|
||||
SrcValueAlign = LD->getOriginalAlignment();
|
||||
TBAAInfo = LD->getTBAAInfo();
|
||||
return true;
|
||||
} else if (StoreSDNode *ST = dyn_cast<StoreSDNode>(N)) {
|
||||
Ptr = ST->getBasePtr();
|
||||
@ -7130,6 +7138,7 @@ bool DAGCombiner::FindAliasInfo(SDNode *N,
|
||||
SrcValue = ST->getSrcValue();
|
||||
SrcValueOffset = ST->getSrcValueOffset();
|
||||
SrcValueAlign = ST->getOriginalAlignment();
|
||||
TBAAInfo = ST->getTBAAInfo();
|
||||
} else {
|
||||
llvm_unreachable("FindAliasInfo expected a memory operand");
|
||||
}
|
||||
@ -7150,8 +7159,9 @@ void DAGCombiner::GatherAllAliases(SDNode *N, SDValue OriginalChain,
|
||||
const Value *SrcValue;
|
||||
int SrcValueOffset;
|
||||
unsigned SrcValueAlign;
|
||||
const MDNode *SrcTBAAInfo;
|
||||
bool IsLoad = FindAliasInfo(N, Ptr, Size, SrcValue, SrcValueOffset,
|
||||
SrcValueAlign);
|
||||
SrcValueAlign, SrcTBAAInfo);
|
||||
|
||||
// Starting off.
|
||||
Chains.push_back(OriginalChain);
|
||||
@ -7195,15 +7205,18 @@ void DAGCombiner::GatherAllAliases(SDNode *N, SDValue OriginalChain,
|
||||
const Value *OpSrcValue;
|
||||
int OpSrcValueOffset;
|
||||
unsigned OpSrcValueAlign;
|
||||
const MDNode *OpSrcTBAAInfo;
|
||||
bool IsOpLoad = FindAliasInfo(Chain.getNode(), OpPtr, OpSize,
|
||||
OpSrcValue, OpSrcValueOffset,
|
||||
OpSrcValueAlign);
|
||||
OpSrcValueAlign,
|
||||
OpSrcTBAAInfo);
|
||||
|
||||
// If chain is alias then stop here.
|
||||
if (!(IsLoad && IsOpLoad) &&
|
||||
isAlias(Ptr, Size, SrcValue, SrcValueOffset, SrcValueAlign,
|
||||
SrcTBAAInfo,
|
||||
OpPtr, OpSize, OpSrcValue, OpSrcValueOffset,
|
||||
OpSrcValueAlign)) {
|
||||
OpSrcValueAlign, OpSrcTBAAInfo)) {
|
||||
Aliases.push_back(Chain);
|
||||
} else {
|
||||
// Look further up the chain.
|
||||
|
@ -3895,7 +3895,7 @@ SelectionDAG::getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
|
||||
SDValue Ptr, SDValue Offset,
|
||||
MachinePointerInfo PtrInfo, EVT MemVT,
|
||||
bool isVolatile, bool isNonTemporal,
|
||||
unsigned Alignment) {
|
||||
unsigned Alignment, const MDNode *TBAAInfo) {
|
||||
if (Alignment == 0) // Ensure that codegen never sees alignment 0
|
||||
Alignment = getEVTAlignment(VT);
|
||||
|
||||
@ -3912,7 +3912,8 @@ SelectionDAG::getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
|
||||
|
||||
MachineFunction &MF = getMachineFunction();
|
||||
MachineMemOperand *MMO =
|
||||
MF.getMachineMemOperand(PtrInfo, Flags, MemVT.getStoreSize(), Alignment);
|
||||
MF.getMachineMemOperand(PtrInfo, Flags, MemVT.getStoreSize(), Alignment,
|
||||
TBAAInfo);
|
||||
return getLoad(AM, ExtType, VT, dl, Chain, Ptr, Offset, MemVT, MMO);
|
||||
}
|
||||
|
||||
@ -3966,20 +3967,21 @@ SDValue SelectionDAG::getLoad(EVT VT, DebugLoc dl,
|
||||
SDValue Chain, SDValue Ptr,
|
||||
MachinePointerInfo PtrInfo,
|
||||
bool isVolatile, bool isNonTemporal,
|
||||
unsigned Alignment) {
|
||||
unsigned Alignment, const MDNode *TBAAInfo) {
|
||||
SDValue Undef = getUNDEF(Ptr.getValueType());
|
||||
return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
|
||||
PtrInfo, VT, isVolatile, isNonTemporal, Alignment);
|
||||
PtrInfo, VT, isVolatile, isNonTemporal, Alignment, TBAAInfo);
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getExtLoad(ISD::LoadExtType ExtType, EVT VT, DebugLoc dl,
|
||||
SDValue Chain, SDValue Ptr,
|
||||
MachinePointerInfo PtrInfo, EVT MemVT,
|
||||
bool isVolatile, bool isNonTemporal,
|
||||
unsigned Alignment) {
|
||||
unsigned Alignment, const MDNode *TBAAInfo) {
|
||||
SDValue Undef = getUNDEF(Ptr.getValueType());
|
||||
return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef,
|
||||
PtrInfo, MemVT, isVolatile, isNonTemporal, Alignment);
|
||||
PtrInfo, MemVT, isVolatile, isNonTemporal, Alignment,
|
||||
TBAAInfo);
|
||||
}
|
||||
|
||||
|
||||
@ -3998,7 +4000,7 @@ SelectionDAG::getIndexedLoad(SDValue OrigLoad, DebugLoc dl, SDValue Base,
|
||||
SDValue SelectionDAG::getStore(SDValue Chain, DebugLoc dl, SDValue Val,
|
||||
SDValue Ptr, MachinePointerInfo PtrInfo,
|
||||
bool isVolatile, bool isNonTemporal,
|
||||
unsigned Alignment) {
|
||||
unsigned Alignment, const MDNode *TBAAInfo) {
|
||||
if (Alignment == 0) // Ensure that codegen never sees alignment 0
|
||||
Alignment = getEVTAlignment(Val.getValueType());
|
||||
|
||||
@ -4014,7 +4016,8 @@ SDValue SelectionDAG::getStore(SDValue Chain, DebugLoc dl, SDValue Val,
|
||||
MachineFunction &MF = getMachineFunction();
|
||||
MachineMemOperand *MMO =
|
||||
MF.getMachineMemOperand(PtrInfo, Flags,
|
||||
Val.getValueType().getStoreSize(), Alignment);
|
||||
Val.getValueType().getStoreSize(), Alignment,
|
||||
TBAAInfo);
|
||||
|
||||
return getStore(Chain, dl, Val, Ptr, MMO);
|
||||
}
|
||||
@ -4045,7 +4048,8 @@ SDValue SelectionDAG::getStore(SDValue Chain, DebugLoc dl, SDValue Val,
|
||||
SDValue SelectionDAG::getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val,
|
||||
SDValue Ptr, MachinePointerInfo PtrInfo,
|
||||
EVT SVT,bool isVolatile, bool isNonTemporal,
|
||||
unsigned Alignment) {
|
||||
unsigned Alignment,
|
||||
const MDNode *TBAAInfo) {
|
||||
if (Alignment == 0) // Ensure that codegen never sees alignment 0
|
||||
Alignment = getEVTAlignment(SVT);
|
||||
|
||||
@ -4060,7 +4064,8 @@ SDValue SelectionDAG::getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val,
|
||||
|
||||
MachineFunction &MF = getMachineFunction();
|
||||
MachineMemOperand *MMO =
|
||||
MF.getMachineMemOperand(PtrInfo, Flags, SVT.getStoreSize(), Alignment);
|
||||
MF.getMachineMemOperand(PtrInfo, Flags, SVT.getStoreSize(), Alignment,
|
||||
TBAAInfo);
|
||||
|
||||
return getTruncStore(Chain, dl, Val, Ptr, SVT, MMO);
|
||||
}
|
||||
|
@ -2934,6 +2934,7 @@ void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
|
||||
bool isVolatile = I.isVolatile();
|
||||
bool isNonTemporal = I.getMetadata("nontemporal") != 0;
|
||||
unsigned Alignment = I.getAlignment();
|
||||
const MDNode *TBAAInfo = I.getMetadata(LLVMContext::MD_tbaa);
|
||||
|
||||
SmallVector<EVT, 4> ValueVTs;
|
||||
SmallVector<uint64_t, 4> Offsets;
|
||||
@ -2947,7 +2948,8 @@ void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
|
||||
if (I.isVolatile())
|
||||
// Serialize volatile loads with other side effects.
|
||||
Root = getRoot();
|
||||
else if (AA->pointsToConstantMemory(SV)) {
|
||||
else if (AA->pointsToConstantMemory(
|
||||
AliasAnalysis::Location(SV, AA->getTypeStoreSize(Ty), TBAAInfo))) {
|
||||
// Do not serialize (non-volatile) loads of constant memory with anything.
|
||||
Root = DAG.getEntryNode();
|
||||
ConstantMemory = true;
|
||||
@ -2965,7 +2967,7 @@ void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
|
||||
DAG.getConstant(Offsets[i], PtrVT));
|
||||
SDValue L = DAG.getLoad(ValueVTs[i], getCurDebugLoc(), Root,
|
||||
A, MachinePointerInfo(SV, Offsets[i]), isVolatile,
|
||||
isNonTemporal, Alignment);
|
||||
isNonTemporal, Alignment, TBAAInfo);
|
||||
|
||||
Values[i] = L;
|
||||
Chains[i] = L.getValue(1);
|
||||
@ -3008,6 +3010,7 @@ void SelectionDAGBuilder::visitStore(const StoreInst &I) {
|
||||
bool isVolatile = I.isVolatile();
|
||||
bool isNonTemporal = I.getMetadata("nontemporal") != 0;
|
||||
unsigned Alignment = I.getAlignment();
|
||||
const MDNode *TBAAInfo = I.getMetadata(LLVMContext::MD_tbaa);
|
||||
|
||||
for (unsigned i = 0; i != NumValues; ++i) {
|
||||
SDValue Add = DAG.getNode(ISD::ADD, getCurDebugLoc(), PtrVT, Ptr,
|
||||
@ -3015,7 +3018,7 @@ void SelectionDAGBuilder::visitStore(const StoreInst &I) {
|
||||
Chains[i] = DAG.getStore(Root, getCurDebugLoc(),
|
||||
SDValue(Src.getNode(), Src.getResNo() + i),
|
||||
Add, MachinePointerInfo(PtrV, Offsets[i]),
|
||||
isVolatile, isNonTemporal, Alignment);
|
||||
isVolatile, isNonTemporal, Alignment, TBAAInfo);
|
||||
}
|
||||
|
||||
DAG.setRoot(DAG.getNode(ISD::TokenFactor, getCurDebugLoc(),
|
||||
|
Loading…
Reference in New Issue
Block a user