forked from OSchip/llvm-project
Add non-temporal flags and remove an assumption of default arguments.
llvm-svn: 96240
This commit is contained in:
parent
cbd39c5def
commit
39c6d01879
|
@ -581,18 +581,18 @@ public:
|
|||
/// determined by their operands, and they produce a value AND a token chain.
|
||||
///
|
||||
SDValue getLoad(EVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
|
||||
const Value *SV, int SVOffset, bool isVolatile=false,
|
||||
unsigned Alignment=0);
|
||||
const Value *SV, int SVOffset, bool isVolatile,
|
||||
bool isNonTemporal, unsigned Alignment);
|
||||
SDValue getExtLoad(ISD::LoadExtType ExtType, DebugLoc dl, EVT VT,
|
||||
SDValue Chain, SDValue Ptr, const Value *SV,
|
||||
int SVOffset, EVT MemVT, bool isVolatile=false,
|
||||
unsigned Alignment=0);
|
||||
SDValue Chain, SDValue Ptr, const Value *SV,
|
||||
int SVOffset, EVT MemVT, bool isVolatile,
|
||||
bool isNonTemporal, unsigned Alignment);
|
||||
SDValue getIndexedLoad(SDValue OrigLoad, DebugLoc dl, SDValue Base,
|
||||
SDValue Offset, ISD::MemIndexedMode AM);
|
||||
SDValue getLoad(ISD::MemIndexedMode AM, DebugLoc dl, ISD::LoadExtType ExtType,
|
||||
EVT VT, SDValue Chain, SDValue Ptr, SDValue Offset,
|
||||
const Value *SV, int SVOffset, EVT MemVT,
|
||||
bool isVolatile=false, unsigned Alignment=0);
|
||||
bool isVolatile, bool isNonTemporal, unsigned Alignment);
|
||||
SDValue getLoad(ISD::MemIndexedMode AM, DebugLoc dl, ISD::LoadExtType ExtType,
|
||||
EVT VT, SDValue Chain, SDValue Ptr, SDValue Offset,
|
||||
EVT MemVT, MachineMemOperand *MMO);
|
||||
|
@ -600,13 +600,14 @@ public:
|
|||
/// getStore - Helper function to build ISD::STORE nodes.
|
||||
///
|
||||
SDValue getStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
|
||||
const Value *SV, int SVOffset, bool isVolatile=false,
|
||||
unsigned Alignment=0);
|
||||
const Value *SV, int SVOffset, bool isVolatile,
|
||||
bool isNonTemporal, unsigned Alignment);
|
||||
SDValue getStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
|
||||
MachineMemOperand *MMO);
|
||||
SDValue getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
|
||||
const Value *SV, int SVOffset, EVT TVT,
|
||||
bool isVolatile=false, unsigned Alignment=0);
|
||||
const Value *SV, int SVOffset, EVT TVT,
|
||||
bool isNonTemporal, bool isVolatile,
|
||||
unsigned Alignment);
|
||||
SDValue getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
|
||||
EVT TVT, MachineMemOperand *MMO);
|
||||
SDValue getIndexedStore(SDValue OrigStoe, DebugLoc dl, SDValue Base,
|
||||
|
|
|
@ -1596,6 +1596,7 @@ public:
|
|||
}
|
||||
|
||||
bool isVolatile() const { return (SubclassData >> 5) & 1; }
|
||||
bool isNonTemporal() const { return MMO->isNonTemporal(); }
|
||||
|
||||
/// Returns the SrcValue and offset that describes the location of the access
|
||||
const Value *getSrcValue() const { return MMO->getValue(); }
|
||||
|
|
|
@ -1881,7 +1881,8 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
|
|||
LN0->getChain(), LN0->getBasePtr(),
|
||||
LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(), MemVT,
|
||||
LN0->isVolatile(), LN0->getAlignment());
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
AddToWorkList(N);
|
||||
CombineTo(N0.getNode(), ExtLoad, ExtLoad.getValue(1));
|
||||
return SDValue(N, 0); // Return N so it doesn't get rechecked!
|
||||
|
@ -1903,7 +1904,8 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
|
|||
LN0->getChain(),
|
||||
LN0->getBasePtr(), LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(), MemVT,
|
||||
LN0->isVolatile(), LN0->getAlignment());
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
AddToWorkList(N);
|
||||
CombineTo(N0.getNode(), ExtLoad, ExtLoad.getValue(1));
|
||||
return SDValue(N, 0); // Return N so it doesn't get rechecked!
|
||||
|
@ -1935,7 +1937,8 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
|
|||
DAG.getExtLoad(ISD::ZEXTLOAD, LN0->getDebugLoc(), LoadResultTy,
|
||||
LN0->getChain(), LN0->getBasePtr(),
|
||||
LN0->getSrcValue(), LN0->getSrcValueOffset(),
|
||||
ExtVT, LN0->isVolatile(), LN0->getAlignment());
|
||||
ExtVT, LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
AddToWorkList(N);
|
||||
CombineTo(LN0, NewLoad, NewLoad.getValue(1));
|
||||
return SDValue(N, 0); // Return N so it doesn't get rechecked!
|
||||
|
@ -1970,7 +1973,8 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
|
|||
DAG.getExtLoad(ISD::ZEXTLOAD, LN0->getDebugLoc(), LoadResultTy,
|
||||
LN0->getChain(), NewPtr,
|
||||
LN0->getSrcValue(), LN0->getSrcValueOffset(),
|
||||
ExtVT, LN0->isVolatile(), Alignment);
|
||||
ExtVT, LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
Alignment);
|
||||
AddToWorkList(N);
|
||||
CombineTo(LN0, Load, Load.getValue(1));
|
||||
return SDValue(N, 0); // Return N so it doesn't get rechecked!
|
||||
|
@ -3143,7 +3147,8 @@ SDValue DAGCombiner::visitSIGN_EXTEND(SDNode *N) {
|
|||
LN0->getBasePtr(), LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(),
|
||||
N0.getValueType(),
|
||||
LN0->isVolatile(), LN0->getAlignment());
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
CombineTo(N, ExtLoad);
|
||||
SDValue Trunc = DAG.getNode(ISD::TRUNCATE, N0.getDebugLoc(),
|
||||
N0.getValueType(), ExtLoad);
|
||||
|
@ -3185,7 +3190,8 @@ SDValue DAGCombiner::visitSIGN_EXTEND(SDNode *N) {
|
|||
LN0->getChain(),
|
||||
LN0->getBasePtr(), LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(), MemVT,
|
||||
LN0->isVolatile(), LN0->getAlignment());
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
CombineTo(N, ExtLoad);
|
||||
CombineTo(N0.getNode(),
|
||||
DAG.getNode(ISD::TRUNCATE, N0.getDebugLoc(),
|
||||
|
@ -3315,7 +3321,8 @@ SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) {
|
|||
LN0->getBasePtr(), LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(),
|
||||
N0.getValueType(),
|
||||
LN0->isVolatile(), LN0->getAlignment());
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
CombineTo(N, ExtLoad);
|
||||
SDValue Trunc = DAG.getNode(ISD::TRUNCATE, N0.getDebugLoc(),
|
||||
N0.getValueType(), ExtLoad);
|
||||
|
@ -3357,7 +3364,8 @@ SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) {
|
|||
LN0->getChain(),
|
||||
LN0->getBasePtr(), LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(), MemVT,
|
||||
LN0->isVolatile(), LN0->getAlignment());
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
CombineTo(N, ExtLoad);
|
||||
CombineTo(N0.getNode(),
|
||||
DAG.getNode(ISD::TRUNCATE, N0.getDebugLoc(), N0.getValueType(),
|
||||
|
@ -3471,7 +3479,8 @@ SDValue DAGCombiner::visitANY_EXTEND(SDNode *N) {
|
|||
LN0->getBasePtr(), LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(),
|
||||
N0.getValueType(),
|
||||
LN0->isVolatile(), LN0->getAlignment());
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
CombineTo(N, ExtLoad);
|
||||
SDValue Trunc = DAG.getNode(ISD::TRUNCATE, N0.getDebugLoc(),
|
||||
N0.getValueType(), ExtLoad);
|
||||
|
@ -3513,7 +3522,8 @@ SDValue DAGCombiner::visitANY_EXTEND(SDNode *N) {
|
|||
VT, LN0->getChain(), LN0->getBasePtr(),
|
||||
LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(), MemVT,
|
||||
LN0->isVolatile(), LN0->getAlignment());
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
CombineTo(N, ExtLoad);
|
||||
CombineTo(N0.getNode(),
|
||||
DAG.getNode(ISD::TRUNCATE, N0.getDebugLoc(),
|
||||
|
@ -3636,10 +3646,11 @@ SDValue DAGCombiner::ReduceLoadWidth(SDNode *N) {
|
|||
SDValue Load = (ExtType == ISD::NON_EXTLOAD)
|
||||
? DAG.getLoad(VT, N0.getDebugLoc(), LN0->getChain(), NewPtr,
|
||||
LN0->getSrcValue(), LN0->getSrcValueOffset() + PtrOff,
|
||||
LN0->isVolatile(), NewAlign)
|
||||
LN0->isVolatile(), LN0->isNonTemporal(), NewAlign)
|
||||
: DAG.getExtLoad(ExtType, N0.getDebugLoc(), VT, LN0->getChain(), NewPtr,
|
||||
LN0->getSrcValue(), LN0->getSrcValueOffset() + PtrOff,
|
||||
ExtVT, LN0->isVolatile(), NewAlign);
|
||||
ExtVT, LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
NewAlign);
|
||||
|
||||
// Replace the old load's chain with the new load's chain.
|
||||
WorkListRemover DeadNodes(*this);
|
||||
|
@ -3726,7 +3737,8 @@ SDValue DAGCombiner::visitSIGN_EXTEND_INREG(SDNode *N) {
|
|||
LN0->getChain(),
|
||||
LN0->getBasePtr(), LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(), EVT,
|
||||
LN0->isVolatile(), LN0->getAlignment());
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
CombineTo(N, ExtLoad);
|
||||
CombineTo(N0.getNode(), ExtLoad, ExtLoad.getValue(1));
|
||||
return SDValue(N, 0); // Return N so it doesn't get rechecked!
|
||||
|
@ -3742,7 +3754,8 @@ SDValue DAGCombiner::visitSIGN_EXTEND_INREG(SDNode *N) {
|
|||
LN0->getChain(),
|
||||
LN0->getBasePtr(), LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(), EVT,
|
||||
LN0->isVolatile(), LN0->getAlignment());
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
CombineTo(N, ExtLoad);
|
||||
CombineTo(N0.getNode(), ExtLoad, ExtLoad.getValue(1));
|
||||
return SDValue(N, 0); // Return N so it doesn't get rechecked!
|
||||
|
@ -3826,7 +3839,7 @@ SDValue DAGCombiner::CombineConsecutiveLoads(SDNode *N, EVT VT) {
|
|||
(!LegalOperations || TLI.isOperationLegal(ISD::LOAD, VT)))
|
||||
return DAG.getLoad(VT, N->getDebugLoc(), LD1->getChain(),
|
||||
LD1->getBasePtr(), LD1->getSrcValue(),
|
||||
LD1->getSrcValueOffset(), false, Align);
|
||||
LD1->getSrcValueOffset(), false, false, Align);
|
||||
}
|
||||
|
||||
return SDValue();
|
||||
|
@ -3896,7 +3909,8 @@ SDValue DAGCombiner::visitBIT_CONVERT(SDNode *N) {
|
|||
SDValue Load = DAG.getLoad(VT, N->getDebugLoc(), LN0->getChain(),
|
||||
LN0->getBasePtr(),
|
||||
LN0->getSrcValue(), LN0->getSrcValueOffset(),
|
||||
LN0->isVolatile(), OrigAlign);
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
OrigAlign);
|
||||
AddToWorkList(N);
|
||||
CombineTo(N0.getNode(),
|
||||
DAG.getNode(ISD::BIT_CONVERT, N0.getDebugLoc(),
|
||||
|
@ -4492,7 +4506,8 @@ SDValue DAGCombiner::visitFP_EXTEND(SDNode *N) {
|
|||
LN0->getBasePtr(), LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(),
|
||||
N0.getValueType(),
|
||||
LN0->isVolatile(), LN0->getAlignment());
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
CombineTo(N, ExtLoad);
|
||||
CombineTo(N0.getNode(),
|
||||
DAG.getNode(ISD::FP_ROUND, N0.getDebugLoc(),
|
||||
|
@ -4960,7 +4975,7 @@ SDValue DAGCombiner::visitLOAD(SDNode *N) {
|
|||
LD->getValueType(0),
|
||||
Chain, Ptr, LD->getSrcValue(),
|
||||
LD->getSrcValueOffset(), LD->getMemoryVT(),
|
||||
LD->isVolatile(), Align);
|
||||
LD->isVolatile(), LD->isNonTemporal(), Align);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5042,7 +5057,8 @@ SDValue DAGCombiner::visitLOAD(SDNode *N) {
|
|||
ReplLoad = DAG.getLoad(N->getValueType(0), LD->getDebugLoc(),
|
||||
BetterChain, Ptr,
|
||||
LD->getSrcValue(), LD->getSrcValueOffset(),
|
||||
LD->isVolatile(), LD->getAlignment());
|
||||
LD->isVolatile(), LD->isNonTemporal(),
|
||||
LD->getAlignment());
|
||||
} else {
|
||||
ReplLoad = DAG.getExtLoad(LD->getExtensionType(), LD->getDebugLoc(),
|
||||
LD->getValueType(0),
|
||||
|
@ -5050,6 +5066,7 @@ SDValue DAGCombiner::visitLOAD(SDNode *N) {
|
|||
LD->getSrcValueOffset(),
|
||||
LD->getMemoryVT(),
|
||||
LD->isVolatile(),
|
||||
LD->isNonTemporal(),
|
||||
LD->getAlignment());
|
||||
}
|
||||
|
||||
|
@ -5149,13 +5166,14 @@ SDValue DAGCombiner::ReduceLoadOpStoreWidth(SDNode *N) {
|
|||
SDValue NewLD = DAG.getLoad(NewVT, N0.getDebugLoc(),
|
||||
LD->getChain(), NewPtr,
|
||||
LD->getSrcValue(), LD->getSrcValueOffset(),
|
||||
LD->isVolatile(), NewAlign);
|
||||
LD->isVolatile(), LD->isNonTemporal(),
|
||||
NewAlign);
|
||||
SDValue NewVal = DAG.getNode(Opc, Value.getDebugLoc(), NewVT, NewLD,
|
||||
DAG.getConstant(NewImm, NewVT));
|
||||
SDValue NewST = DAG.getStore(Chain, N->getDebugLoc(),
|
||||
NewVal, NewPtr,
|
||||
ST->getSrcValue(), ST->getSrcValueOffset(),
|
||||
false, NewAlign);
|
||||
false, false, NewAlign);
|
||||
|
||||
AddToWorkList(NewPtr.getNode());
|
||||
AddToWorkList(NewLD.getNode());
|
||||
|
@ -5184,7 +5202,7 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
|
|||
return DAG.getTruncStore(Chain, N->getDebugLoc(), Value,
|
||||
Ptr, ST->getSrcValue(),
|
||||
ST->getSrcValueOffset(), ST->getMemoryVT(),
|
||||
ST->isVolatile(), Align);
|
||||
ST->isVolatile(), ST->isNonTemporal(), Align);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5201,7 +5219,8 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
|
|||
TLI.isOperationLegalOrCustom(ISD::STORE, SVT)))
|
||||
return DAG.getStore(Chain, N->getDebugLoc(), Value.getOperand(0),
|
||||
Ptr, ST->getSrcValue(),
|
||||
ST->getSrcValueOffset(), ST->isVolatile(), OrigAlign);
|
||||
ST->getSrcValueOffset(), ST->isVolatile(),
|
||||
ST->isNonTemporal(), OrigAlign);
|
||||
}
|
||||
|
||||
// Turn 'store float 1.0, Ptr' -> 'store int 0x12345678, Ptr'
|
||||
|
@ -5227,7 +5246,7 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
|
|||
return DAG.getStore(Chain, N->getDebugLoc(), Tmp,
|
||||
Ptr, ST->getSrcValue(),
|
||||
ST->getSrcValueOffset(), ST->isVolatile(),
|
||||
ST->getAlignment());
|
||||
ST->isNonTemporal(), ST->getAlignment());
|
||||
}
|
||||
break;
|
||||
case MVT::f64:
|
||||
|
@ -5239,7 +5258,7 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
|
|||
return DAG.getStore(Chain, N->getDebugLoc(), Tmp,
|
||||
Ptr, ST->getSrcValue(),
|
||||
ST->getSrcValueOffset(), ST->isVolatile(),
|
||||
ST->getAlignment());
|
||||
ST->isNonTemporal(), ST->getAlignment());
|
||||
} else if (!ST->isVolatile() &&
|
||||
TLI.isOperationLegalOrCustom(ISD::STORE, MVT::i32)) {
|
||||
// Many FP stores are not made apparent until after legalize, e.g. for
|
||||
|
@ -5253,18 +5272,21 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
|
|||
int SVOffset = ST->getSrcValueOffset();
|
||||
unsigned Alignment = ST->getAlignment();
|
||||
bool isVolatile = ST->isVolatile();
|
||||
bool isNonTemporal = ST->isNonTemporal();
|
||||
|
||||
SDValue St0 = DAG.getStore(Chain, ST->getDebugLoc(), Lo,
|
||||
Ptr, ST->getSrcValue(),
|
||||
ST->getSrcValueOffset(),
|
||||
isVolatile, ST->getAlignment());
|
||||
isVolatile, isNonTemporal,
|
||||
ST->getAlignment());
|
||||
Ptr = DAG.getNode(ISD::ADD, N->getDebugLoc(), Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(4, Ptr.getValueType()));
|
||||
SVOffset += 4;
|
||||
Alignment = MinAlign(Alignment, 4U);
|
||||
SDValue St1 = DAG.getStore(Chain, ST->getDebugLoc(), Hi,
|
||||
Ptr, ST->getSrcValue(),
|
||||
SVOffset, isVolatile, Alignment);
|
||||
SVOffset, isVolatile, isNonTemporal,
|
||||
Alignment);
|
||||
return DAG.getNode(ISD::TokenFactor, N->getDebugLoc(), MVT::Other,
|
||||
St0, St1);
|
||||
}
|
||||
|
@ -5286,12 +5308,13 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
|
|||
if (ST->isTruncatingStore()) {
|
||||
ReplStore = DAG.getTruncStore(BetterChain, N->getDebugLoc(), Value, Ptr,
|
||||
ST->getSrcValue(),ST->getSrcValueOffset(),
|
||||
ST->getMemoryVT(),
|
||||
ST->isVolatile(), ST->getAlignment());
|
||||
ST->getMemoryVT(), ST->isVolatile(),
|
||||
ST->isNonTemporal(), ST->getAlignment());
|
||||
} else {
|
||||
ReplStore = DAG.getStore(BetterChain, N->getDebugLoc(), Value, Ptr,
|
||||
ST->getSrcValue(), ST->getSrcValueOffset(),
|
||||
ST->isVolatile(), ST->getAlignment());
|
||||
ST->isVolatile(), ST->isNonTemporal(),
|
||||
ST->getAlignment());
|
||||
}
|
||||
|
||||
// Create token to keep both nodes around.
|
||||
|
@ -5325,7 +5348,8 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
|
|||
return DAG.getTruncStore(Chain, N->getDebugLoc(), Shorter,
|
||||
Ptr, ST->getSrcValue(),
|
||||
ST->getSrcValueOffset(), ST->getMemoryVT(),
|
||||
ST->isVolatile(), ST->getAlignment());
|
||||
ST->isVolatile(), ST->isNonTemporal(),
|
||||
ST->getAlignment());
|
||||
|
||||
// Otherwise, see if we can simplify the operation with
|
||||
// SimplifyDemandedBits, which only works if the value has a single use.
|
||||
|
@ -5358,7 +5382,8 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
|
|||
return DAG.getTruncStore(Chain, N->getDebugLoc(), Value.getOperand(0),
|
||||
Ptr, ST->getSrcValue(),
|
||||
ST->getSrcValueOffset(), ST->getMemoryVT(),
|
||||
ST->isVolatile(), ST->getAlignment());
|
||||
ST->isVolatile(), ST->isNonTemporal(),
|
||||
ST->getAlignment());
|
||||
}
|
||||
|
||||
return ReduceLoadOpStoreWidth(N);
|
||||
|
@ -5503,7 +5528,7 @@ SDValue DAGCombiner::visitEXTRACT_VECTOR_ELT(SDNode *N) {
|
|||
|
||||
return DAG.getLoad(LVT, N->getDebugLoc(), LN0->getChain(), NewPtr,
|
||||
LN0->getSrcValue(), LN0->getSrcValueOffset(),
|
||||
LN0->isVolatile(), Align);
|
||||
LN0->isVolatile(), LN0->isNonTemporal(), Align);
|
||||
}
|
||||
|
||||
return SDValue();
|
||||
|
@ -5883,6 +5908,7 @@ bool DAGCombiner::SimplifySelectOps(SDNode *TheSelect, SDValue LHS,
|
|||
LLD->getChain(),
|
||||
Addr, 0, 0,
|
||||
LLD->isVolatile(),
|
||||
LLD->isNonTemporal(),
|
||||
LLD->getAlignment());
|
||||
} else {
|
||||
Load = DAG.getExtLoad(LLD->getExtensionType(),
|
||||
|
@ -5891,6 +5917,7 @@ bool DAGCombiner::SimplifySelectOps(SDNode *TheSelect, SDValue LHS,
|
|||
LLD->getChain(), Addr, 0, 0,
|
||||
LLD->getMemoryVT(),
|
||||
LLD->isVolatile(),
|
||||
LLD->isNonTemporal(),
|
||||
LLD->getAlignment());
|
||||
}
|
||||
|
||||
|
@ -5998,7 +6025,7 @@ SDValue DAGCombiner::SimplifySelectCC(DebugLoc DL, SDValue N0, SDValue N1,
|
|||
CstOffset);
|
||||
return DAG.getLoad(TV->getValueType(0), DL, DAG.getEntryNode(), CPIdx,
|
||||
PseudoSourceValue::getConstantPool(), 0, false,
|
||||
Alignment);
|
||||
false, Alignment);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -377,9 +377,10 @@ static SDValue ExpandConstantFP(ConstantFPSDNode *CFP, bool UseCP,
|
|||
return DAG.getExtLoad(ISD::EXTLOAD, dl,
|
||||
OrigVT, DAG.getEntryNode(),
|
||||
CPIdx, PseudoSourceValue::getConstantPool(),
|
||||
0, VT, false, Alignment);
|
||||
0, VT, false, false, Alignment);
|
||||
return DAG.getLoad(OrigVT, dl, DAG.getEntryNode(), CPIdx,
|
||||
PseudoSourceValue::getConstantPool(), 0, false, Alignment);
|
||||
PseudoSourceValue::getConstantPool(), 0, false, false,
|
||||
Alignment);
|
||||
}
|
||||
|
||||
/// ExpandUnalignedStore - Expands an unaligned store to 2 half-size stores.
|
||||
|
@ -402,7 +403,8 @@ SDValue ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG,
|
|||
// FIXME: Does not handle truncating floating point stores!
|
||||
SDValue Result = DAG.getNode(ISD::BIT_CONVERT, dl, intVT, Val);
|
||||
return DAG.getStore(Chain, dl, Result, Ptr, ST->getSrcValue(),
|
||||
SVOffset, ST->isVolatile(), Alignment);
|
||||
SVOffset, ST->isVolatile(), ST->isNonTemporal(),
|
||||
Alignment);
|
||||
} else {
|
||||
// Do a (aligned) store to a stack slot, then copy from the stack slot
|
||||
// to the final destination using (unaligned) integer loads and stores.
|
||||
|
@ -418,7 +420,8 @@ SDValue ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG,
|
|||
|
||||
// Perform the original store, only redirected to the stack slot.
|
||||
SDValue Store = DAG.getTruncStore(Chain, dl,
|
||||
Val, StackPtr, NULL, 0, StoredVT);
|
||||
Val, StackPtr, NULL, 0, StoredVT,
|
||||
false, false, 0);
|
||||
SDValue Increment = DAG.getConstant(RegBytes, TLI.getPointerTy());
|
||||
SmallVector<SDValue, 8> Stores;
|
||||
unsigned Offset = 0;
|
||||
|
@ -426,11 +429,12 @@ SDValue ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG,
|
|||
// Do all but one copies using the full register width.
|
||||
for (unsigned i = 1; i < NumRegs; i++) {
|
||||
// Load one integer register's worth from the stack slot.
|
||||
SDValue Load = DAG.getLoad(RegVT, dl, Store, StackPtr, NULL, 0);
|
||||
SDValue Load = DAG.getLoad(RegVT, dl, Store, StackPtr, NULL, 0,
|
||||
false, false, 0);
|
||||
// Store it to the final location. Remember the store.
|
||||
Stores.push_back(DAG.getStore(Load.getValue(1), dl, Load, Ptr,
|
||||
ST->getSrcValue(), SVOffset + Offset,
|
||||
ST->isVolatile(),
|
||||
ST->isVolatile(), ST->isNonTemporal(),
|
||||
MinAlign(ST->getAlignment(), Offset)));
|
||||
// Increment the pointers.
|
||||
Offset += RegBytes;
|
||||
|
@ -446,11 +450,12 @@ SDValue ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG,
|
|||
|
||||
// Load from the stack slot.
|
||||
SDValue Load = DAG.getExtLoad(ISD::EXTLOAD, dl, RegVT, Store, StackPtr,
|
||||
NULL, 0, MemVT);
|
||||
NULL, 0, MemVT, false, false, 0);
|
||||
|
||||
Stores.push_back(DAG.getTruncStore(Load.getValue(1), dl, Load, Ptr,
|
||||
ST->getSrcValue(), SVOffset + Offset,
|
||||
MemVT, ST->isVolatile(),
|
||||
ST->isNonTemporal(),
|
||||
MinAlign(ST->getAlignment(), Offset)));
|
||||
// The order of the stores doesn't matter - say it with a TokenFactor.
|
||||
return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, &Stores[0],
|
||||
|
@ -474,13 +479,14 @@ SDValue ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG,
|
|||
SDValue Store1, Store2;
|
||||
Store1 = DAG.getTruncStore(Chain, dl, TLI.isLittleEndian()?Lo:Hi, Ptr,
|
||||
ST->getSrcValue(), SVOffset, NewStoredVT,
|
||||
ST->isVolatile(), Alignment);
|
||||
ST->isVolatile(), ST->isNonTemporal(), Alignment);
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(IncrementSize, TLI.getPointerTy()));
|
||||
Alignment = MinAlign(Alignment, IncrementSize);
|
||||
Store2 = DAG.getTruncStore(Chain, dl, TLI.isLittleEndian()?Hi:Lo, Ptr,
|
||||
ST->getSrcValue(), SVOffset + IncrementSize,
|
||||
NewStoredVT, ST->isVolatile(), Alignment);
|
||||
NewStoredVT, ST->isVolatile(), ST->isNonTemporal(),
|
||||
Alignment);
|
||||
|
||||
return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Store1, Store2);
|
||||
}
|
||||
|
@ -502,7 +508,7 @@ SDValue ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG,
|
|||
// then bitconvert to floating point or vector.
|
||||
SDValue newLoad = DAG.getLoad(intVT, dl, Chain, Ptr, LD->getSrcValue(),
|
||||
SVOffset, LD->isVolatile(),
|
||||
LD->getAlignment());
|
||||
LD->isNonTemporal(), LD->getAlignment());
|
||||
SDValue Result = DAG.getNode(ISD::BIT_CONVERT, dl, LoadedVT, newLoad);
|
||||
if (VT.isFloatingPoint() && LoadedVT != VT)
|
||||
Result = DAG.getNode(ISD::FP_EXTEND, dl, VT, Result);
|
||||
|
@ -530,10 +536,11 @@ SDValue ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG,
|
|||
// Load one integer register's worth from the original location.
|
||||
SDValue Load = DAG.getLoad(RegVT, dl, Chain, Ptr, LD->getSrcValue(),
|
||||
SVOffset + Offset, LD->isVolatile(),
|
||||
LD->isNonTemporal(),
|
||||
MinAlign(LD->getAlignment(), Offset));
|
||||
// Follow the load with a store to the stack slot. Remember the store.
|
||||
Stores.push_back(DAG.getStore(Load.getValue(1), dl, Load, StackPtr,
|
||||
NULL, 0));
|
||||
NULL, 0, false, false, 0));
|
||||
// Increment the pointers.
|
||||
Offset += RegBytes;
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, Increment);
|
||||
|
@ -546,12 +553,13 @@ SDValue ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG,
|
|||
SDValue Load = DAG.getExtLoad(ISD::EXTLOAD, dl, RegVT, Chain, Ptr,
|
||||
LD->getSrcValue(), SVOffset + Offset,
|
||||
MemVT, LD->isVolatile(),
|
||||
LD->isNonTemporal(),
|
||||
MinAlign(LD->getAlignment(), Offset));
|
||||
// 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.
|
||||
Stores.push_back(DAG.getTruncStore(Load.getValue(1), dl, Load, StackPtr,
|
||||
NULL, 0, MemVT));
|
||||
NULL, 0, MemVT, false, false, 0));
|
||||
|
||||
// The order of the stores doesn't matter - say it with a TokenFactor.
|
||||
SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, &Stores[0],
|
||||
|
@ -559,7 +567,7 @@ SDValue ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG,
|
|||
|
||||
// Finally, perform the original load only redirected to the stack slot.
|
||||
Load = DAG.getExtLoad(LD->getExtensionType(), dl, VT, TF, StackBase,
|
||||
NULL, 0, LoadedVT);
|
||||
NULL, 0, LoadedVT, false, false, 0);
|
||||
|
||||
// Callers expect a MERGE_VALUES node.
|
||||
SDValue Ops[] = { Load, TF };
|
||||
|
@ -588,20 +596,22 @@ SDValue ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG,
|
|||
SDValue Lo, Hi;
|
||||
if (TLI.isLittleEndian()) {
|
||||
Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, VT, Chain, Ptr, LD->getSrcValue(),
|
||||
SVOffset, NewLoadedVT, LD->isVolatile(), Alignment);
|
||||
SVOffset, NewLoadedVT, LD->isVolatile(),
|
||||
LD->isNonTemporal(), Alignment);
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(IncrementSize, TLI.getPointerTy()));
|
||||
Hi = DAG.getExtLoad(HiExtType, dl, VT, Chain, Ptr, LD->getSrcValue(),
|
||||
SVOffset + IncrementSize, NewLoadedVT, LD->isVolatile(),
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
LD->isNonTemporal(), MinAlign(Alignment, IncrementSize));
|
||||
} else {
|
||||
Hi = DAG.getExtLoad(HiExtType, dl, VT, Chain, Ptr, LD->getSrcValue(),
|
||||
SVOffset, NewLoadedVT, LD->isVolatile(), Alignment);
|
||||
SVOffset, NewLoadedVT, LD->isVolatile(),
|
||||
LD->isNonTemporal(), Alignment);
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(IncrementSize, TLI.getPointerTy()));
|
||||
Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, VT, Chain, Ptr, LD->getSrcValue(),
|
||||
SVOffset + IncrementSize, NewLoadedVT, LD->isVolatile(),
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
LD->isNonTemporal(), MinAlign(Alignment, IncrementSize));
|
||||
}
|
||||
|
||||
// aggregate the two parts
|
||||
|
@ -643,7 +653,8 @@ PerformInsertVectorEltInMemory(SDValue Vec, SDValue Val, SDValue Idx,
|
|||
|
||||
// Store the vector.
|
||||
SDValue Ch = DAG.getStore(DAG.getEntryNode(), dl, Tmp1, StackPtr,
|
||||
PseudoSourceValue::getFixedStack(SPFI), 0);
|
||||
PseudoSourceValue::getFixedStack(SPFI), 0,
|
||||
false, false, 0);
|
||||
|
||||
// Truncate or zero extend offset to target pointer type.
|
||||
unsigned CastOpc = IdxVT.bitsGT(PtrVT) ? ISD::TRUNCATE : ISD::ZERO_EXTEND;
|
||||
|
@ -654,10 +665,12 @@ PerformInsertVectorEltInMemory(SDValue Vec, SDValue Val, SDValue Idx,
|
|||
SDValue StackPtr2 = DAG.getNode(ISD::ADD, dl, IdxVT, Tmp3, StackPtr);
|
||||
// Store the scalar value.
|
||||
Ch = DAG.getTruncStore(Ch, dl, Tmp2, StackPtr2,
|
||||
PseudoSourceValue::getFixedStack(SPFI), 0, EltVT);
|
||||
PseudoSourceValue::getFixedStack(SPFI), 0, EltVT,
|
||||
false, false, 0);
|
||||
// Load the updated vector.
|
||||
return DAG.getLoad(VT, dl, Ch, StackPtr,
|
||||
PseudoSourceValue::getFixedStack(SPFI), 0);
|
||||
PseudoSourceValue::getFixedStack(SPFI), 0,
|
||||
false, false, 0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -702,6 +715,7 @@ SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) {
|
|||
int SVOffset = ST->getSrcValueOffset();
|
||||
unsigned Alignment = ST->getAlignment();
|
||||
bool isVolatile = ST->isVolatile();
|
||||
bool isNonTemporal = ST->isNonTemporal();
|
||||
DebugLoc dl = ST->getDebugLoc();
|
||||
if (ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(ST->getValue())) {
|
||||
if (CFP->getValueType(0) == MVT::f32 &&
|
||||
|
@ -710,14 +724,14 @@ SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) {
|
|||
bitcastToAPInt().zextOrTrunc(32),
|
||||
MVT::i32);
|
||||
return DAG.getStore(Tmp1, dl, Tmp3, Tmp2, ST->getSrcValue(),
|
||||
SVOffset, isVolatile, Alignment);
|
||||
SVOffset, isVolatile, isNonTemporal, Alignment);
|
||||
} else if (CFP->getValueType(0) == MVT::f64) {
|
||||
// If this target supports 64-bit registers, do a single 64-bit store.
|
||||
if (getTypeAction(MVT::i64) == Legal) {
|
||||
Tmp3 = DAG.getConstant(CFP->getValueAPF().bitcastToAPInt().
|
||||
zextOrTrunc(64), MVT::i64);
|
||||
return DAG.getStore(Tmp1, dl, Tmp3, Tmp2, ST->getSrcValue(),
|
||||
SVOffset, isVolatile, Alignment);
|
||||
SVOffset, isVolatile, isNonTemporal, Alignment);
|
||||
} else if (getTypeAction(MVT::i32) == Legal && !ST->isVolatile()) {
|
||||
// Otherwise, if the target supports 32-bit registers, use 2 32-bit
|
||||
// stores. If the target supports neither 32- nor 64-bits, this
|
||||
|
@ -728,11 +742,11 @@ SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) {
|
|||
if (TLI.isBigEndian()) std::swap(Lo, Hi);
|
||||
|
||||
Lo = DAG.getStore(Tmp1, dl, Lo, Tmp2, ST->getSrcValue(),
|
||||
SVOffset, isVolatile, Alignment);
|
||||
SVOffset, isVolatile, isNonTemporal, Alignment);
|
||||
Tmp2 = DAG.getNode(ISD::ADD, dl, Tmp2.getValueType(), Tmp2,
|
||||
DAG.getIntPtrConstant(4));
|
||||
Hi = DAG.getStore(Tmp1, dl, Hi, Tmp2, ST->getSrcValue(), SVOffset+4,
|
||||
isVolatile, MinAlign(Alignment, 4U));
|
||||
isVolatile, isNonTemporal, MinAlign(Alignment, 4U));
|
||||
|
||||
return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
|
||||
}
|
||||
|
@ -1108,7 +1122,8 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||
|
||||
Tmp1 = DAG.getLoad(NVT, dl, Tmp1, Tmp2, LD->getSrcValue(),
|
||||
LD->getSrcValueOffset(),
|
||||
LD->isVolatile(), LD->getAlignment());
|
||||
LD->isVolatile(), LD->isNonTemporal(),
|
||||
LD->getAlignment());
|
||||
Tmp3 = LegalizeOp(DAG.getNode(ISD::BIT_CONVERT, dl, VT, Tmp1));
|
||||
Tmp4 = LegalizeOp(Tmp1.getValue(1));
|
||||
break;
|
||||
|
@ -1125,6 +1140,7 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||
int SVOffset = LD->getSrcValueOffset();
|
||||
unsigned Alignment = LD->getAlignment();
|
||||
bool isVolatile = LD->isVolatile();
|
||||
bool isNonTemporal = LD->isNonTemporal();
|
||||
|
||||
if (SrcWidth != SrcVT.getStoreSizeInBits() &&
|
||||
// Some targets pretend to have an i1 loading operation, and actually
|
||||
|
@ -1150,7 +1166,7 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||
|
||||
Result = DAG.getExtLoad(NewExtType, dl, Node->getValueType(0),
|
||||
Tmp1, Tmp2, LD->getSrcValue(), SVOffset,
|
||||
NVT, isVolatile, Alignment);
|
||||
NVT, isVolatile, isNonTemporal, Alignment);
|
||||
|
||||
Ch = Result.getValue(1); // The chain.
|
||||
|
||||
|
@ -1187,7 +1203,7 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||
Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl,
|
||||
Node->getValueType(0), Tmp1, Tmp2,
|
||||
LD->getSrcValue(), SVOffset, RoundVT, isVolatile,
|
||||
Alignment);
|
||||
isNonTemporal, Alignment);
|
||||
|
||||
// Load the remaining ExtraWidth bits.
|
||||
IncrementSize = RoundWidth / 8;
|
||||
|
@ -1195,7 +1211,7 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||
DAG.getIntPtrConstant(IncrementSize));
|
||||
Hi = DAG.getExtLoad(ExtType, dl, Node->getValueType(0), Tmp1, Tmp2,
|
||||
LD->getSrcValue(), SVOffset + IncrementSize,
|
||||
ExtraVT, isVolatile,
|
||||
ExtraVT, isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
|
||||
// Build a factor node to remember that this load is independent of the
|
||||
|
@ -1215,7 +1231,7 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||
// Load the top RoundWidth bits.
|
||||
Hi = DAG.getExtLoad(ExtType, dl, Node->getValueType(0), Tmp1, Tmp2,
|
||||
LD->getSrcValue(), SVOffset, RoundVT, isVolatile,
|
||||
Alignment);
|
||||
isNonTemporal, Alignment);
|
||||
|
||||
// Load the remaining ExtraWidth bits.
|
||||
IncrementSize = RoundWidth / 8;
|
||||
|
@ -1224,7 +1240,7 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||
Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl,
|
||||
Node->getValueType(0), Tmp1, Tmp2,
|
||||
LD->getSrcValue(), SVOffset + IncrementSize,
|
||||
ExtraVT, isVolatile,
|
||||
ExtraVT, isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
|
||||
// Build a factor node to remember that this load is independent of the
|
||||
|
@ -1284,7 +1300,8 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||
(SrcVT == MVT::f64 && Node->getValueType(0) == MVT::f128)) {
|
||||
SDValue Load = DAG.getLoad(SrcVT, dl, Tmp1, Tmp2, LD->getSrcValue(),
|
||||
LD->getSrcValueOffset(),
|
||||
LD->isVolatile(), LD->getAlignment());
|
||||
LD->isVolatile(), LD->isNonTemporal(),
|
||||
LD->getAlignment());
|
||||
Result = DAG.getNode(ISD::FP_EXTEND, dl,
|
||||
Node->getValueType(0), Load);
|
||||
Tmp1 = LegalizeOp(Result); // Relegalize new nodes.
|
||||
|
@ -1297,7 +1314,8 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||
Result = DAG.getExtLoad(ISD::EXTLOAD, dl, Node->getValueType(0),
|
||||
Tmp1, Tmp2, LD->getSrcValue(),
|
||||
LD->getSrcValueOffset(), SrcVT,
|
||||
LD->isVolatile(), LD->getAlignment());
|
||||
LD->isVolatile(), LD->isNonTemporal(),
|
||||
LD->getAlignment());
|
||||
SDValue ValRes;
|
||||
if (ExtType == ISD::SEXTLOAD)
|
||||
ValRes = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl,
|
||||
|
@ -1325,6 +1343,7 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||
int SVOffset = ST->getSrcValueOffset();
|
||||
unsigned Alignment = ST->getAlignment();
|
||||
bool isVolatile = ST->isVolatile();
|
||||
bool isNonTemporal = ST->isNonTemporal();
|
||||
|
||||
if (!ST->isTruncatingStore()) {
|
||||
if (SDNode *OptStore = OptimizeFloatStore(ST).getNode()) {
|
||||
|
@ -1361,7 +1380,7 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||
TLI.getTypeToPromoteTo(ISD::STORE, VT), Tmp3);
|
||||
Result = DAG.getStore(Tmp1, dl, Tmp3, Tmp2,
|
||||
ST->getSrcValue(), SVOffset, isVolatile,
|
||||
Alignment);
|
||||
isNonTemporal, Alignment);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
@ -1379,7 +1398,8 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||
EVT NVT = EVT::getIntegerVT(*DAG.getContext(), StVT.getStoreSizeInBits());
|
||||
Tmp3 = DAG.getZeroExtendInReg(Tmp3, dl, StVT);
|
||||
Result = DAG.getTruncStore(Tmp1, dl, Tmp3, Tmp2, ST->getSrcValue(),
|
||||
SVOffset, NVT, isVolatile, Alignment);
|
||||
SVOffset, NVT, isVolatile, isNonTemporal,
|
||||
Alignment);
|
||||
} else if (StWidth & (StWidth - 1)) {
|
||||
// If not storing a power-of-2 number of bits, expand as two stores.
|
||||
assert(!StVT.isVector() && "Unsupported truncstore!");
|
||||
|
@ -1399,7 +1419,7 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||
// Store the bottom RoundWidth bits.
|
||||
Lo = DAG.getTruncStore(Tmp1, dl, Tmp3, Tmp2, ST->getSrcValue(),
|
||||
SVOffset, RoundVT,
|
||||
isVolatile, Alignment);
|
||||
isVolatile, isNonTemporal, Alignment);
|
||||
|
||||
// Store the remaining ExtraWidth bits.
|
||||
IncrementSize = RoundWidth / 8;
|
||||
|
@ -1409,6 +1429,7 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||
DAG.getConstant(RoundWidth, TLI.getShiftAmountTy()));
|
||||
Hi = DAG.getTruncStore(Tmp1, dl, Hi, Tmp2, ST->getSrcValue(),
|
||||
SVOffset + IncrementSize, ExtraVT, isVolatile,
|
||||
isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
} else {
|
||||
// Big endian - avoid unaligned stores.
|
||||
|
@ -1417,7 +1438,8 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||
Hi = DAG.getNode(ISD::SRL, dl, Tmp3.getValueType(), Tmp3,
|
||||
DAG.getConstant(ExtraWidth, TLI.getShiftAmountTy()));
|
||||
Hi = DAG.getTruncStore(Tmp1, dl, Hi, Tmp2, ST->getSrcValue(),
|
||||
SVOffset, RoundVT, isVolatile, Alignment);
|
||||
SVOffset, RoundVT, isVolatile, isNonTemporal,
|
||||
Alignment);
|
||||
|
||||
// Store the remaining ExtraWidth bits.
|
||||
IncrementSize = RoundWidth / 8;
|
||||
|
@ -1425,6 +1447,7 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||
DAG.getIntPtrConstant(IncrementSize));
|
||||
Lo = DAG.getTruncStore(Tmp1, dl, Tmp3, Tmp2, ST->getSrcValue(),
|
||||
SVOffset + IncrementSize, ExtraVT, isVolatile,
|
||||
isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
}
|
||||
|
||||
|
@ -1457,7 +1480,8 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||
assert(isTypeLegal(StVT) && "Do not know how to expand this store!");
|
||||
Tmp3 = DAG.getNode(ISD::TRUNCATE, dl, StVT, Tmp3);
|
||||
Result = DAG.getStore(Tmp1, dl, Tmp3, Tmp2, ST->getSrcValue(),
|
||||
SVOffset, isVolatile, Alignment);
|
||||
SVOffset, isVolatile, isNonTemporal,
|
||||
Alignment);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1484,7 +1508,8 @@ SDValue SelectionDAGLegalize::ExpandExtractFromVectorThroughStack(SDValue Op) {
|
|||
DebugLoc dl = Op.getDebugLoc();
|
||||
// Store the value to a temporary stack slot, then LOAD the returned part.
|
||||
SDValue StackPtr = DAG.CreateStackTemporary(Vec.getValueType());
|
||||
SDValue Ch = DAG.getStore(DAG.getEntryNode(), dl, Vec, StackPtr, NULL, 0);
|
||||
SDValue Ch = DAG.getStore(DAG.getEntryNode(), dl, Vec, StackPtr, NULL, 0,
|
||||
false, false, 0);
|
||||
|
||||
// Add the offset to the index.
|
||||
unsigned EltSize =
|
||||
|
@ -1500,10 +1525,12 @@ SDValue SelectionDAGLegalize::ExpandExtractFromVectorThroughStack(SDValue Op) {
|
|||
StackPtr = DAG.getNode(ISD::ADD, dl, Idx.getValueType(), Idx, StackPtr);
|
||||
|
||||
if (Op.getValueType().isVector())
|
||||
return DAG.getLoad(Op.getValueType(), dl, Ch, StackPtr, NULL, 0);
|
||||
return DAG.getLoad(Op.getValueType(), dl, Ch, StackPtr, NULL, 0,
|
||||
false, false, 0);
|
||||
else
|
||||
return DAG.getExtLoad(ISD::EXTLOAD, dl, Op.getValueType(), Ch, StackPtr,
|
||||
NULL, 0, Vec.getValueType().getVectorElementType());
|
||||
NULL, 0, Vec.getValueType().getVectorElementType(),
|
||||
false, false, 0);
|
||||
}
|
||||
|
||||
SDValue SelectionDAGLegalize::ExpandVectorBuildThroughStack(SDNode* Node) {
|
||||
|
@ -1535,10 +1562,12 @@ SDValue SelectionDAGLegalize::ExpandVectorBuildThroughStack(SDNode* Node) {
|
|||
// If EltVT smaller than OpVT, only store the bits necessary.
|
||||
if (!OpVT.isVector() && EltVT.bitsLT(OpVT)) {
|
||||
Stores.push_back(DAG.getTruncStore(DAG.getEntryNode(), dl,
|
||||
Node->getOperand(i), Idx, SV, Offset, EltVT));
|
||||
Node->getOperand(i), Idx, SV, Offset,
|
||||
EltVT, false, false, 0));
|
||||
} else
|
||||
Stores.push_back(DAG.getStore(DAG.getEntryNode(), dl,
|
||||
Node->getOperand(i), Idx, SV, Offset));
|
||||
Node->getOperand(i), Idx, SV, Offset,
|
||||
false, false, 0));
|
||||
}
|
||||
|
||||
SDValue StoreChain;
|
||||
|
@ -1549,7 +1578,7 @@ SDValue SelectionDAGLegalize::ExpandVectorBuildThroughStack(SDNode* Node) {
|
|||
StoreChain = DAG.getEntryNode();
|
||||
|
||||
// Result is a load from the stack slot.
|
||||
return DAG.getLoad(VT, dl, StoreChain, FIPtr, SV, 0);
|
||||
return DAG.getLoad(VT, dl, StoreChain, FIPtr, SV, 0, false, false, 0);
|
||||
}
|
||||
|
||||
SDValue SelectionDAGLegalize::ExpandFCOPYSIGN(SDNode* Node) {
|
||||
|
@ -1572,12 +1601,14 @@ SDValue SelectionDAGLegalize::ExpandFCOPYSIGN(SDNode* Node) {
|
|||
SDValue StackPtr = DAG.CreateStackTemporary(Tmp2.getValueType());
|
||||
SDValue StorePtr = StackPtr, LoadPtr = StackPtr;
|
||||
SDValue Ch =
|
||||
DAG.getStore(DAG.getEntryNode(), dl, Tmp2, StorePtr, NULL, 0);
|
||||
DAG.getStore(DAG.getEntryNode(), dl, Tmp2, StorePtr, NULL, 0,
|
||||
false, false, 0);
|
||||
if (Tmp2.getValueType() == MVT::f64 && TLI.isLittleEndian())
|
||||
LoadPtr = DAG.getNode(ISD::ADD, dl, StackPtr.getValueType(),
|
||||
LoadPtr, DAG.getIntPtrConstant(4));
|
||||
SignBit = DAG.getExtLoad(ISD::SEXTLOAD, dl, TLI.getPointerTy(),
|
||||
Ch, LoadPtr, NULL, 0, MVT::i32);
|
||||
Ch, LoadPtr, NULL, 0, MVT::i32,
|
||||
false, false, 0);
|
||||
}
|
||||
SignBit =
|
||||
DAG.getSetCC(dl, TLI.getSetCCResultType(SignBit.getValueType()),
|
||||
|
@ -1701,20 +1732,21 @@ SDValue SelectionDAGLegalize::EmitStackConvert(SDValue SrcOp,
|
|||
|
||||
if (SrcSize > SlotSize)
|
||||
Store = DAG.getTruncStore(DAG.getEntryNode(), dl, SrcOp, FIPtr,
|
||||
SV, 0, SlotVT, false, SrcAlign);
|
||||
SV, 0, SlotVT, false, false, SrcAlign);
|
||||
else {
|
||||
assert(SrcSize == SlotSize && "Invalid store");
|
||||
Store = DAG.getStore(DAG.getEntryNode(), dl, SrcOp, FIPtr,
|
||||
SV, 0, false, SrcAlign);
|
||||
SV, 0, false, false, SrcAlign);
|
||||
}
|
||||
|
||||
// Result is a load from the stack slot.
|
||||
if (SlotSize == DestSize)
|
||||
return DAG.getLoad(DestVT, dl, Store, FIPtr, SV, 0, false, DestAlign);
|
||||
return DAG.getLoad(DestVT, dl, Store, FIPtr, SV, 0, false, false,
|
||||
DestAlign);
|
||||
|
||||
assert(SlotSize < DestSize && "Unknown extension!");
|
||||
return DAG.getExtLoad(ISD::EXTLOAD, dl, DestVT, Store, FIPtr, SV, 0, SlotVT,
|
||||
false, DestAlign);
|
||||
false, false, DestAlign);
|
||||
}
|
||||
|
||||
SDValue SelectionDAGLegalize::ExpandSCALAR_TO_VECTOR(SDNode *Node) {
|
||||
|
@ -1729,9 +1761,11 @@ SDValue SelectionDAGLegalize::ExpandSCALAR_TO_VECTOR(SDNode *Node) {
|
|||
SDValue Ch = DAG.getTruncStore(DAG.getEntryNode(), dl, Node->getOperand(0),
|
||||
StackPtr,
|
||||
PseudoSourceValue::getFixedStack(SPFI), 0,
|
||||
Node->getValueType(0).getVectorElementType());
|
||||
Node->getValueType(0).getVectorElementType(),
|
||||
false, false, 0);
|
||||
return DAG.getLoad(Node->getValueType(0), dl, Ch, StackPtr,
|
||||
PseudoSourceValue::getFixedStack(SPFI), 0);
|
||||
PseudoSourceValue::getFixedStack(SPFI), 0,
|
||||
false, false, 0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1805,7 +1839,7 @@ SDValue SelectionDAGLegalize::ExpandBUILD_VECTOR(SDNode *Node) {
|
|||
unsigned Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlignment();
|
||||
return DAG.getLoad(VT, dl, DAG.getEntryNode(), CPIdx,
|
||||
PseudoSourceValue::getConstantPool(), 0,
|
||||
false, Alignment);
|
||||
false, false, Alignment);
|
||||
}
|
||||
|
||||
if (!MoreThanTwoValues) {
|
||||
|
@ -1943,13 +1977,16 @@ SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned,
|
|||
}
|
||||
// store the lo of the constructed double - based on integer input
|
||||
SDValue Store1 = DAG.getStore(DAG.getEntryNode(), dl,
|
||||
Op0Mapped, Lo, NULL, 0);
|
||||
Op0Mapped, Lo, NULL, 0,
|
||||
false, false, 0);
|
||||
// initial hi portion of constructed double
|
||||
SDValue InitialHi = DAG.getConstant(0x43300000u, MVT::i32);
|
||||
// store the hi of the constructed double - biased exponent
|
||||
SDValue Store2=DAG.getStore(Store1, dl, InitialHi, Hi, NULL, 0);
|
||||
SDValue Store2=DAG.getStore(Store1, dl, InitialHi, Hi, NULL, 0,
|
||||
false, false, 0);
|
||||
// load the constructed double
|
||||
SDValue Load = DAG.getLoad(MVT::f64, dl, Store2, StackSlot, NULL, 0);
|
||||
SDValue Load = DAG.getLoad(MVT::f64, dl, Store2, StackSlot, NULL, 0,
|
||||
false, false, 0);
|
||||
// FP constant to bias correct the final result
|
||||
SDValue Bias = DAG.getConstantFP(isSigned ?
|
||||
BitsToDouble(0x4330000080000000ULL) :
|
||||
|
@ -2004,13 +2041,13 @@ SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned,
|
|||
if (DestVT == MVT::f32)
|
||||
FudgeInReg = DAG.getLoad(MVT::f32, dl, DAG.getEntryNode(), CPIdx,
|
||||
PseudoSourceValue::getConstantPool(), 0,
|
||||
false, Alignment);
|
||||
false, false, Alignment);
|
||||
else {
|
||||
FudgeInReg =
|
||||
LegalizeOp(DAG.getExtLoad(ISD::EXTLOAD, dl, DestVT,
|
||||
DAG.getEntryNode(), CPIdx,
|
||||
PseudoSourceValue::getConstantPool(), 0,
|
||||
MVT::f32, false, Alignment));
|
||||
MVT::f32, false, false, Alignment));
|
||||
}
|
||||
|
||||
return DAG.getNode(ISD::FADD, dl, DestVT, Tmp1, FudgeInReg);
|
||||
|
@ -2350,16 +2387,19 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node,
|
|||
EVT VT = Node->getValueType(0);
|
||||
Tmp1 = Node->getOperand(0);
|
||||
Tmp2 = Node->getOperand(1);
|
||||
SDValue VAList = DAG.getLoad(TLI.getPointerTy(), dl, Tmp1, Tmp2, V, 0);
|
||||
SDValue VAList = DAG.getLoad(TLI.getPointerTy(), dl, Tmp1, Tmp2, V, 0,
|
||||
false, false, 0);
|
||||
// Increment the pointer, VAList, to the next vaarg
|
||||
Tmp3 = DAG.getNode(ISD::ADD, dl, TLI.getPointerTy(), VAList,
|
||||
DAG.getConstant(TLI.getTargetData()->
|
||||
getTypeAllocSize(VT.getTypeForEVT(*DAG.getContext())),
|
||||
TLI.getPointerTy()));
|
||||
// Store the incremented VAList to the legalized pointer
|
||||
Tmp3 = DAG.getStore(VAList.getValue(1), dl, Tmp3, Tmp2, V, 0);
|
||||
Tmp3 = DAG.getStore(VAList.getValue(1), dl, Tmp3, Tmp2, V, 0,
|
||||
false, false, 0);
|
||||
// Load the actual argument out of the pointer VAList
|
||||
Results.push_back(DAG.getLoad(VT, dl, Tmp3, VAList, NULL, 0));
|
||||
Results.push_back(DAG.getLoad(VT, dl, Tmp3, VAList, NULL, 0,
|
||||
false, false, 0));
|
||||
Results.push_back(Results[0].getValue(1));
|
||||
break;
|
||||
}
|
||||
|
@ -2369,8 +2409,9 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node,
|
|||
const Value *VD = cast<SrcValueSDNode>(Node->getOperand(3))->getValue();
|
||||
const Value *VS = cast<SrcValueSDNode>(Node->getOperand(4))->getValue();
|
||||
Tmp1 = DAG.getLoad(TLI.getPointerTy(), dl, Node->getOperand(0),
|
||||
Node->getOperand(2), VS, 0);
|
||||
Tmp1 = DAG.getStore(Tmp1.getValue(1), dl, Tmp1, Node->getOperand(1), VD, 0);
|
||||
Node->getOperand(2), VS, 0, false, false, 0);
|
||||
Tmp1 = DAG.getStore(Tmp1.getValue(1), dl, Tmp1, Node->getOperand(1), VD, 0,
|
||||
false, false, 0);
|
||||
Results.push_back(Tmp1);
|
||||
break;
|
||||
}
|
||||
|
@ -2827,7 +2868,8 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node,
|
|||
|
||||
EVT MemVT = EVT::getIntegerVT(*DAG.getContext(), EntrySize * 8);
|
||||
SDValue LD = DAG.getExtLoad(ISD::SEXTLOAD, dl, PTy, Chain, Addr,
|
||||
PseudoSourceValue::getJumpTable(), 0, MemVT);
|
||||
PseudoSourceValue::getJumpTable(), 0, MemVT,
|
||||
false, false, 0);
|
||||
Addr = LD;
|
||||
if (TLI.getTargetMachine().getRelocationModel() == Reloc::PIC_) {
|
||||
// For PIC, the sequence is:
|
||||
|
|
|
@ -444,7 +444,7 @@ SDValue DAGTypeLegalizer::SoftenFloatRes_LOAD(SDNode *N) {
|
|||
NewL = DAG.getLoad(L->getAddressingMode(), dl, L->getExtensionType(),
|
||||
NVT, L->getChain(), L->getBasePtr(), L->getOffset(),
|
||||
L->getSrcValue(), L->getSrcValueOffset(), NVT,
|
||||
L->isVolatile(), L->getAlignment());
|
||||
L->isVolatile(), L->isNonTemporal(), L->getAlignment());
|
||||
// Legalized the chain result - switch anything that used the old chain to
|
||||
// use the new one.
|
||||
ReplaceValueWith(SDValue(N, 1), NewL.getValue(1));
|
||||
|
@ -456,8 +456,8 @@ SDValue DAGTypeLegalizer::SoftenFloatRes_LOAD(SDNode *N) {
|
|||
L->getMemoryVT(), L->getChain(),
|
||||
L->getBasePtr(), L->getOffset(),
|
||||
L->getSrcValue(), L->getSrcValueOffset(),
|
||||
L->getMemoryVT(),
|
||||
L->isVolatile(), L->getAlignment());
|
||||
L->getMemoryVT(), L->isVolatile(),
|
||||
L->isNonTemporal(), L->getAlignment());
|
||||
// Legalized the chain result - switch anything that used the old chain to
|
||||
// use the new one.
|
||||
ReplaceValueWith(SDValue(N, 1), NewL.getValue(1));
|
||||
|
@ -755,7 +755,8 @@ SDValue DAGTypeLegalizer::SoftenFloatOp_STORE(SDNode *N, unsigned OpNo) {
|
|||
|
||||
return DAG.getStore(ST->getChain(), dl, Val, ST->getBasePtr(),
|
||||
ST->getSrcValue(), ST->getSrcValueOffset(),
|
||||
ST->isVolatile(), ST->getAlignment());
|
||||
ST->isVolatile(), ST->isNonTemporal(),
|
||||
ST->getAlignment());
|
||||
}
|
||||
|
||||
|
||||
|
@ -1073,8 +1074,8 @@ void DAGTypeLegalizer::ExpandFloatRes_LOAD(SDNode *N, SDValue &Lo,
|
|||
|
||||
Hi = DAG.getExtLoad(LD->getExtensionType(), dl, NVT, Chain, Ptr,
|
||||
LD->getSrcValue(), LD->getSrcValueOffset(),
|
||||
LD->getMemoryVT(),
|
||||
LD->isVolatile(), LD->getAlignment());
|
||||
LD->getMemoryVT(), LD->isVolatile(),
|
||||
LD->isNonTemporal(), LD->getAlignment());
|
||||
|
||||
// Remember the chain.
|
||||
Chain = Hi.getValue(1);
|
||||
|
@ -1382,6 +1383,6 @@ SDValue DAGTypeLegalizer::ExpandFloatOp_STORE(SDNode *N, unsigned OpNo) {
|
|||
|
||||
return DAG.getTruncStore(Chain, N->getDebugLoc(), Hi, Ptr,
|
||||
ST->getSrcValue(), ST->getSrcValueOffset(),
|
||||
ST->getMemoryVT(),
|
||||
ST->isVolatile(), ST->getAlignment());
|
||||
ST->getMemoryVT(), ST->isVolatile(),
|
||||
ST->isNonTemporal(), ST->getAlignment());
|
||||
}
|
||||
|
|
|
@ -359,7 +359,7 @@ SDValue DAGTypeLegalizer::PromoteIntRes_LOAD(LoadSDNode *N) {
|
|||
SDValue Res = DAG.getExtLoad(ExtType, dl, NVT, N->getChain(), N->getBasePtr(),
|
||||
N->getSrcValue(), N->getSrcValueOffset(),
|
||||
N->getMemoryVT(), N->isVolatile(),
|
||||
N->getAlignment());
|
||||
N->isNonTemporal(), N->getAlignment());
|
||||
|
||||
// Legalized the chain result - switch anything that used the old chain to
|
||||
// use the new one.
|
||||
|
@ -873,6 +873,7 @@ SDValue DAGTypeLegalizer::PromoteIntOp_STORE(StoreSDNode *N, unsigned OpNo){
|
|||
int SVOffset = N->getSrcValueOffset();
|
||||
unsigned Alignment = N->getAlignment();
|
||||
bool isVolatile = N->isVolatile();
|
||||
bool isNonTemporal = N->isNonTemporal();
|
||||
DebugLoc dl = N->getDebugLoc();
|
||||
|
||||
SDValue Val = GetPromotedInteger(N->getValue()); // Get promoted value.
|
||||
|
@ -880,7 +881,7 @@ SDValue DAGTypeLegalizer::PromoteIntOp_STORE(StoreSDNode *N, unsigned OpNo){
|
|||
// Truncate the value and store the result.
|
||||
return DAG.getTruncStore(Ch, dl, Val, Ptr, N->getSrcValue(),
|
||||
SVOffset, N->getMemoryVT(),
|
||||
isVolatile, Alignment);
|
||||
isVolatile, isNonTemporal, Alignment);
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::PromoteIntOp_TRUNCATE(SDNode *N) {
|
||||
|
@ -1500,6 +1501,7 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
|
|||
int SVOffset = N->getSrcValueOffset();
|
||||
unsigned Alignment = N->getAlignment();
|
||||
bool isVolatile = N->isVolatile();
|
||||
bool isNonTemporal = N->isNonTemporal();
|
||||
DebugLoc dl = N->getDebugLoc();
|
||||
|
||||
assert(NVT.isByteSized() && "Expanded type not byte sized!");
|
||||
|
@ -1508,7 +1510,7 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
|
|||
EVT MemVT = N->getMemoryVT();
|
||||
|
||||
Lo = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr, N->getSrcValue(), SVOffset,
|
||||
MemVT, isVolatile, Alignment);
|
||||
MemVT, isVolatile, isNonTemporal, Alignment);
|
||||
|
||||
// Remember the chain.
|
||||
Ch = Lo.getValue(1);
|
||||
|
@ -1530,7 +1532,7 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
|
|||
} else if (TLI.isLittleEndian()) {
|
||||
// Little-endian - low bits are at low addresses.
|
||||
Lo = DAG.getLoad(NVT, dl, Ch, Ptr, N->getSrcValue(), SVOffset,
|
||||
isVolatile, Alignment);
|
||||
isVolatile, isNonTemporal, Alignment);
|
||||
|
||||
unsigned ExcessBits =
|
||||
N->getMemoryVT().getSizeInBits() - NVT.getSizeInBits();
|
||||
|
@ -1542,7 +1544,8 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
|
|||
DAG.getIntPtrConstant(IncrementSize));
|
||||
Hi = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr, N->getSrcValue(),
|
||||
SVOffset+IncrementSize, NEVT,
|
||||
isVolatile, MinAlign(Alignment, IncrementSize));
|
||||
isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
|
||||
// Build a factor node to remember that this load is independent of the
|
||||
// other one.
|
||||
|
@ -1560,7 +1563,7 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
|
|||
Hi = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr, N->getSrcValue(), SVOffset,
|
||||
EVT::getIntegerVT(*DAG.getContext(),
|
||||
MemVT.getSizeInBits() - ExcessBits),
|
||||
isVolatile, Alignment);
|
||||
isVolatile, isNonTemporal, Alignment);
|
||||
|
||||
// Increment the pointer to the other half.
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
|
@ -1569,7 +1572,8 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
|
|||
Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, NVT, Ch, Ptr, N->getSrcValue(),
|
||||
SVOffset+IncrementSize,
|
||||
EVT::getIntegerVT(*DAG.getContext(), ExcessBits),
|
||||
isVolatile, MinAlign(Alignment, IncrementSize));
|
||||
isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
|
||||
// Build a factor node to remember that this load is independent of the
|
||||
// other one.
|
||||
|
@ -2212,6 +2216,7 @@ SDValue DAGTypeLegalizer::ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
|||
int SVOffset = N->getSrcValueOffset();
|
||||
unsigned Alignment = N->getAlignment();
|
||||
bool isVolatile = N->isVolatile();
|
||||
bool isNonTemporal = N->isNonTemporal();
|
||||
DebugLoc dl = N->getDebugLoc();
|
||||
SDValue Lo, Hi;
|
||||
|
||||
|
@ -2220,13 +2225,14 @@ SDValue DAGTypeLegalizer::ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
|||
if (N->getMemoryVT().bitsLE(NVT)) {
|
||||
GetExpandedInteger(N->getValue(), Lo, Hi);
|
||||
return DAG.getTruncStore(Ch, dl, Lo, Ptr, N->getSrcValue(), SVOffset,
|
||||
N->getMemoryVT(), isVolatile, Alignment);
|
||||
N->getMemoryVT(), isVolatile, isNonTemporal,
|
||||
Alignment);
|
||||
} else if (TLI.isLittleEndian()) {
|
||||
// Little-endian - low bits are at low addresses.
|
||||
GetExpandedInteger(N->getValue(), Lo, Hi);
|
||||
|
||||
Lo = DAG.getStore(Ch, dl, Lo, Ptr, N->getSrcValue(), SVOffset,
|
||||
isVolatile, Alignment);
|
||||
isVolatile, isNonTemporal, Alignment);
|
||||
|
||||
unsigned ExcessBits =
|
||||
N->getMemoryVT().getSizeInBits() - NVT.getSizeInBits();
|
||||
|
@ -2238,7 +2244,8 @@ SDValue DAGTypeLegalizer::ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
|||
DAG.getIntPtrConstant(IncrementSize));
|
||||
Hi = DAG.getTruncStore(Ch, dl, Hi, Ptr, N->getSrcValue(),
|
||||
SVOffset+IncrementSize, NEVT,
|
||||
isVolatile, MinAlign(Alignment, IncrementSize));
|
||||
isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
|
||||
} else {
|
||||
// Big-endian - high bits are at low addresses. Favor aligned stores at
|
||||
|
@ -2264,7 +2271,8 @@ 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->getSrcValue(),
|
||||
SVOffset, HiVT, isVolatile, Alignment);
|
||||
SVOffset, HiVT, isVolatile, isNonTemporal,
|
||||
Alignment);
|
||||
|
||||
// Increment the pointer to the other half.
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
|
@ -2273,7 +2281,8 @@ SDValue DAGTypeLegalizer::ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
|||
Lo = DAG.getTruncStore(Ch, dl, Lo, Ptr, N->getSrcValue(),
|
||||
SVOffset+IncrementSize,
|
||||
EVT::getIntegerVT(*DAG.getContext(), ExcessBits),
|
||||
isVolatile, MinAlign(Alignment, IncrementSize));
|
||||
isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
|
||||
}
|
||||
}
|
||||
|
@ -2341,7 +2350,7 @@ SDValue DAGTypeLegalizer::ExpandIntOp_UINT_TO_FP(SDNode *N) {
|
|||
// FIXME: Avoid the extend by constructing the right constant pool?
|
||||
SDValue Fudge = DAG.getExtLoad(ISD::EXTLOAD, dl, DstVT, DAG.getEntryNode(),
|
||||
FudgePtr, NULL, 0, MVT::f32,
|
||||
false, Alignment);
|
||||
false, false, Alignment);
|
||||
return DAG.getNode(ISD::FADD, dl, DstVT, SignedConv, Fudge);
|
||||
}
|
||||
|
||||
|
|
|
@ -871,9 +871,10 @@ SDValue DAGTypeLegalizer::CreateStackStoreLoad(SDValue Op,
|
|||
// the source and destination types.
|
||||
SDValue StackPtr = DAG.CreateStackTemporary(Op.getValueType(), DestVT);
|
||||
// Emit a store to the stack slot.
|
||||
SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, Op, StackPtr, NULL, 0);
|
||||
SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, Op, StackPtr, NULL, 0,
|
||||
false, false, 0);
|
||||
// Result is a load from the stack slot.
|
||||
return DAG.getLoad(DestVT, dl, Store, StackPtr, NULL, 0);
|
||||
return DAG.getLoad(DestVT, dl, Store, StackPtr, NULL, 0, false, false, 0);
|
||||
}
|
||||
|
||||
/// CustomLowerNode - Replace the node's results with custom code provided
|
||||
|
|
|
@ -122,10 +122,11 @@ void DAGTypeLegalizer::ExpandRes_BIT_CONVERT(SDNode *N, SDValue &Lo,
|
|||
const Value *SV = PseudoSourceValue::getFixedStack(SPFI);
|
||||
|
||||
// Emit a store to the stack slot.
|
||||
SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, InOp, StackPtr, SV, 0);
|
||||
SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, InOp, StackPtr, SV, 0,
|
||||
false, false, 0);
|
||||
|
||||
// Load the first half from the stack slot.
|
||||
Lo = DAG.getLoad(NOutVT, dl, Store, StackPtr, SV, 0);
|
||||
Lo = DAG.getLoad(NOutVT, dl, Store, StackPtr, SV, 0, false, false, 0);
|
||||
|
||||
// Increment the pointer to the other half.
|
||||
unsigned IncrementSize = NOutVT.getSizeInBits() / 8;
|
||||
|
@ -134,7 +135,7 @@ void DAGTypeLegalizer::ExpandRes_BIT_CONVERT(SDNode *N, SDValue &Lo,
|
|||
|
||||
// Load the second half from the stack slot.
|
||||
Hi = DAG.getLoad(NOutVT, dl, Store, StackPtr, SV, IncrementSize, false,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
false, MinAlign(Alignment, IncrementSize));
|
||||
|
||||
// Handle endianness of the load.
|
||||
if (TLI.isBigEndian())
|
||||
|
@ -205,11 +206,12 @@ void DAGTypeLegalizer::ExpandRes_NormalLoad(SDNode *N, SDValue &Lo,
|
|||
int SVOffset = LD->getSrcValueOffset();
|
||||
unsigned Alignment = LD->getAlignment();
|
||||
bool isVolatile = LD->isVolatile();
|
||||
bool isNonTemporal = LD->isNonTemporal();
|
||||
|
||||
assert(NVT.isByteSized() && "Expanded type not byte sized!");
|
||||
|
||||
Lo = DAG.getLoad(NVT, dl, Chain, Ptr, LD->getSrcValue(), SVOffset,
|
||||
isVolatile, Alignment);
|
||||
isVolatile, isNonTemporal, Alignment);
|
||||
|
||||
// Increment the pointer to the other half.
|
||||
unsigned IncrementSize = NVT.getSizeInBits() / 8;
|
||||
|
@ -217,7 +219,8 @@ void DAGTypeLegalizer::ExpandRes_NormalLoad(SDNode *N, SDValue &Lo,
|
|||
DAG.getIntPtrConstant(IncrementSize));
|
||||
Hi = DAG.getLoad(NVT, dl, Chain, Ptr, LD->getSrcValue(),
|
||||
SVOffset+IncrementSize,
|
||||
isVolatile, MinAlign(Alignment, IncrementSize));
|
||||
isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
|
||||
// Build a factor node to remember that this load is independent of the
|
||||
// other one.
|
||||
|
@ -383,6 +386,7 @@ SDValue DAGTypeLegalizer::ExpandOp_NormalStore(SDNode *N, unsigned OpNo) {
|
|||
int SVOffset = St->getSrcValueOffset();
|
||||
unsigned Alignment = St->getAlignment();
|
||||
bool isVolatile = St->isVolatile();
|
||||
bool isNonTemporal = St->isNonTemporal();
|
||||
|
||||
assert(NVT.isByteSized() && "Expanded type not byte sized!");
|
||||
unsigned IncrementSize = NVT.getSizeInBits() / 8;
|
||||
|
@ -394,14 +398,15 @@ SDValue DAGTypeLegalizer::ExpandOp_NormalStore(SDNode *N, unsigned OpNo) {
|
|||
std::swap(Lo, Hi);
|
||||
|
||||
Lo = DAG.getStore(Chain, dl, Lo, Ptr, St->getSrcValue(), SVOffset,
|
||||
isVolatile, Alignment);
|
||||
isVolatile, isNonTemporal, Alignment);
|
||||
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getIntPtrConstant(IncrementSize));
|
||||
assert(isTypeLegal(Ptr.getValueType()) && "Pointers must be legal!");
|
||||
Hi = DAG.getStore(Chain, dl, Hi, Ptr, St->getSrcValue(),
|
||||
SVOffset + IncrementSize,
|
||||
isVolatile, MinAlign(Alignment, IncrementSize));
|
||||
isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
|
||||
return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
|
||||
}
|
||||
|
|
|
@ -172,7 +172,8 @@ SDValue DAGTypeLegalizer::ScalarizeVecRes_LOAD(LoadSDNode *N) {
|
|||
DAG.getUNDEF(N->getBasePtr().getValueType()),
|
||||
N->getSrcValue(), N->getSrcValueOffset(),
|
||||
N->getMemoryVT().getVectorElementType(),
|
||||
N->isVolatile(), N->getOriginalAlignment());
|
||||
N->isVolatile(), N->isNonTemporal(),
|
||||
N->getOriginalAlignment());
|
||||
|
||||
// Legalized the chain result - switch anything that used the old chain to
|
||||
// use the new one.
|
||||
|
@ -366,11 +367,13 @@ SDValue DAGTypeLegalizer::ScalarizeVecOp_STORE(StoreSDNode *N, unsigned OpNo){
|
|||
N->getBasePtr(),
|
||||
N->getSrcValue(), N->getSrcValueOffset(),
|
||||
N->getMemoryVT().getVectorElementType(),
|
||||
N->isVolatile(), N->getAlignment());
|
||||
N->isVolatile(), N->isNonTemporal(),
|
||||
N->getAlignment());
|
||||
|
||||
return DAG.getStore(N->getChain(), dl, GetScalarizedVector(N->getOperand(1)),
|
||||
N->getBasePtr(), N->getSrcValue(), N->getSrcValueOffset(),
|
||||
N->isVolatile(), N->getOriginalAlignment());
|
||||
N->isVolatile(), N->isNonTemporal(),
|
||||
N->getOriginalAlignment());
|
||||
}
|
||||
|
||||
|
||||
|
@ -696,17 +699,20 @@ void DAGTypeLegalizer::SplitVecRes_INSERT_VECTOR_ELT(SDNode *N, SDValue &Lo,
|
|||
EVT VecVT = Vec.getValueType();
|
||||
EVT EltVT = VecVT.getVectorElementType();
|
||||
SDValue StackPtr = DAG.CreateStackTemporary(VecVT);
|
||||
SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, Vec, StackPtr, NULL, 0);
|
||||
SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, Vec, StackPtr, NULL, 0,
|
||||
false, false, 0);
|
||||
|
||||
// Store the new element. This may be larger than the vector element type,
|
||||
// so use a truncating store.
|
||||
SDValue EltPtr = GetVectorElementPointer(StackPtr, EltVT, Idx);
|
||||
unsigned Alignment =
|
||||
TLI.getTargetData()->getPrefTypeAlignment(VecVT.getTypeForEVT(*DAG.getContext()));
|
||||
Store = DAG.getTruncStore(Store, dl, Elt, EltPtr, NULL, 0, EltVT);
|
||||
Store = DAG.getTruncStore(Store, dl, Elt, EltPtr, NULL, 0, EltVT,
|
||||
false, false, 0);
|
||||
|
||||
// Load the Lo part from the stack slot.
|
||||
Lo = DAG.getLoad(Lo.getValueType(), dl, Store, StackPtr, NULL, 0);
|
||||
Lo = DAG.getLoad(Lo.getValueType(), dl, Store, StackPtr, NULL, 0,
|
||||
false, false, 0);
|
||||
|
||||
// Increment the pointer to the other part.
|
||||
unsigned IncrementSize = Lo.getValueType().getSizeInBits() / 8;
|
||||
|
@ -715,7 +721,7 @@ void DAGTypeLegalizer::SplitVecRes_INSERT_VECTOR_ELT(SDNode *N, SDValue &Lo,
|
|||
|
||||
// Load the Hi part from the stack slot.
|
||||
Hi = DAG.getLoad(Hi.getValueType(), dl, Store, StackPtr, NULL, 0, false,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
false, MinAlign(Alignment, IncrementSize));
|
||||
}
|
||||
|
||||
void DAGTypeLegalizer::SplitVecRes_SCALAR_TO_VECTOR(SDNode *N, SDValue &Lo,
|
||||
|
@ -743,19 +749,20 @@ void DAGTypeLegalizer::SplitVecRes_LOAD(LoadSDNode *LD, SDValue &Lo,
|
|||
EVT MemoryVT = LD->getMemoryVT();
|
||||
unsigned Alignment = LD->getOriginalAlignment();
|
||||
bool isVolatile = LD->isVolatile();
|
||||
bool isNonTemporal = LD->isNonTemporal();
|
||||
|
||||
EVT LoMemVT, HiMemVT;
|
||||
GetSplitDestVTs(MemoryVT, LoMemVT, HiMemVT);
|
||||
|
||||
Lo = DAG.getLoad(ISD::UNINDEXED, dl, ExtType, LoVT, Ch, Ptr, Offset,
|
||||
SV, SVOffset, LoMemVT, isVolatile, Alignment);
|
||||
SV, SVOffset, LoMemVT, isVolatile, isNonTemporal, Alignment);
|
||||
|
||||
unsigned IncrementSize = LoMemVT.getSizeInBits()/8;
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getIntPtrConstant(IncrementSize));
|
||||
SVOffset += IncrementSize;
|
||||
Hi = DAG.getLoad(ISD::UNINDEXED, dl, ExtType, HiVT, Ch, Ptr, Offset,
|
||||
SV, SVOffset, HiMemVT, isVolatile, Alignment);
|
||||
SV, SVOffset, HiMemVT, isVolatile, isNonTemporal, Alignment);
|
||||
|
||||
// Build a factor node to remember that this load is independent of the
|
||||
// other one.
|
||||
|
@ -1086,12 +1093,13 @@ SDValue DAGTypeLegalizer::SplitVecOp_EXTRACT_VECTOR_ELT(SDNode *N) {
|
|||
SDValue StackPtr = DAG.CreateStackTemporary(VecVT);
|
||||
int SPFI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
|
||||
const Value *SV = PseudoSourceValue::getFixedStack(SPFI);
|
||||
SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, Vec, StackPtr, SV, 0);
|
||||
SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, Vec, StackPtr, SV, 0,
|
||||
false, false, 0);
|
||||
|
||||
// Load back the required element.
|
||||
StackPtr = GetVectorElementPointer(StackPtr, EltVT, Idx);
|
||||
return DAG.getExtLoad(ISD::EXTLOAD, dl, N->getValueType(0), Store, StackPtr,
|
||||
SV, 0, EltVT);
|
||||
SV, 0, EltVT, false, false, 0);
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SplitVecOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
||||
|
@ -1106,6 +1114,7 @@ SDValue DAGTypeLegalizer::SplitVecOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
|||
EVT MemoryVT = N->getMemoryVT();
|
||||
unsigned Alignment = N->getOriginalAlignment();
|
||||
bool isVol = N->isVolatile();
|
||||
bool isNT = N->isNonTemporal();
|
||||
SDValue Lo, Hi;
|
||||
GetSplitVector(N->getOperand(1), Lo, Hi);
|
||||
|
||||
|
@ -1116,10 +1125,10 @@ SDValue DAGTypeLegalizer::SplitVecOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
|||
|
||||
if (isTruncating)
|
||||
Lo = DAG.getTruncStore(Ch, dl, Lo, Ptr, N->getSrcValue(), SVOffset,
|
||||
LoMemVT, isVol, Alignment);
|
||||
LoMemVT, isVol, isNT, Alignment);
|
||||
else
|
||||
Lo = DAG.getStore(Ch, dl, Lo, Ptr, N->getSrcValue(), SVOffset,
|
||||
isVol, Alignment);
|
||||
isVol, isNT, Alignment);
|
||||
|
||||
// Increment the pointer to the other half.
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
|
@ -1128,10 +1137,10 @@ SDValue DAGTypeLegalizer::SplitVecOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
|||
|
||||
if (isTruncating)
|
||||
Hi = DAG.getTruncStore(Ch, dl, Hi, Ptr, N->getSrcValue(), SVOffset,
|
||||
HiMemVT, isVol, Alignment);
|
||||
HiMemVT, isVol, isNT, Alignment);
|
||||
else
|
||||
Hi = DAG.getStore(Ch, dl, Hi, Ptr, N->getSrcValue(), SVOffset,
|
||||
isVol, Alignment);
|
||||
isVol, isNT, Alignment);
|
||||
|
||||
return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
|
||||
}
|
||||
|
@ -2128,6 +2137,7 @@ SDValue DAGTypeLegalizer::GenWidenVectorLoads(SmallVector<SDValue, 16>& LdChain,
|
|||
int SVOffset = LD->getSrcValueOffset();
|
||||
unsigned Align = LD->getAlignment();
|
||||
bool isVolatile = LD->isVolatile();
|
||||
bool isNonTemporal = LD->isNonTemporal();
|
||||
const Value *SV = LD->getSrcValue();
|
||||
|
||||
int LdWidth = LdVT.getSizeInBits();
|
||||
|
@ -2138,7 +2148,7 @@ SDValue DAGTypeLegalizer::GenWidenVectorLoads(SmallVector<SDValue, 16>& LdChain,
|
|||
EVT NewVT = FindMemType(DAG, TLI, LdWidth, WidenVT, LdAlign, WidthDiff);
|
||||
int NewVTWidth = NewVT.getSizeInBits();
|
||||
SDValue LdOp = DAG.getLoad(NewVT, dl, Chain, BasePtr, SV, SVOffset,
|
||||
isVolatile, Align);
|
||||
isVolatile, isNonTemporal, Align);
|
||||
LdChain.push_back(LdOp.getValue(1));
|
||||
|
||||
// Check if we can load the element with one instruction
|
||||
|
@ -2185,7 +2195,7 @@ SDValue DAGTypeLegalizer::GenWidenVectorLoads(SmallVector<SDValue, 16>& LdChain,
|
|||
|
||||
SDValue LdOp = DAG.getLoad(NewVT, dl, Chain, BasePtr, SV,
|
||||
SVOffset+Offset, isVolatile,
|
||||
MinAlign(Align, Increment));
|
||||
isNonTemporal, MinAlign(Align, Increment));
|
||||
LdChain.push_back(LdOp.getValue(1));
|
||||
LdOps.push_back(LdOp);
|
||||
|
||||
|
@ -2259,6 +2269,7 @@ DAGTypeLegalizer::GenWidenVectorExtLoads(SmallVector<SDValue, 16>& LdChain,
|
|||
int SVOffset = LD->getSrcValueOffset();
|
||||
unsigned Align = LD->getAlignment();
|
||||
bool isVolatile = LD->isVolatile();
|
||||
bool isNonTemporal = LD->isNonTemporal();
|
||||
const Value *SV = LD->getSrcValue();
|
||||
|
||||
EVT EltVT = WidenVT.getVectorElementType();
|
||||
|
@ -2270,14 +2281,15 @@ DAGTypeLegalizer::GenWidenVectorExtLoads(SmallVector<SDValue, 16>& LdChain,
|
|||
SmallVector<SDValue, 16> Ops(WidenNumElts);
|
||||
unsigned Increment = LdEltVT.getSizeInBits() / 8;
|
||||
Ops[0] = DAG.getExtLoad(ExtType, dl, EltVT, Chain, BasePtr, SV, SVOffset,
|
||||
LdEltVT, isVolatile, Align);
|
||||
LdEltVT, isVolatile, isNonTemporal, Align);
|
||||
LdChain.push_back(Ops[0].getValue(1));
|
||||
unsigned i = 0, Offset = Increment;
|
||||
for (i=1; i < NumElts; ++i, Offset += Increment) {
|
||||
SDValue NewBasePtr = DAG.getNode(ISD::ADD, dl, BasePtr.getValueType(),
|
||||
BasePtr, DAG.getIntPtrConstant(Offset));
|
||||
Ops[i] = DAG.getExtLoad(ExtType, dl, EltVT, Chain, NewBasePtr, SV,
|
||||
SVOffset + Offset, LdEltVT, isVolatile, Align);
|
||||
SVOffset + Offset, LdEltVT, isVolatile,
|
||||
isNonTemporal, Align);
|
||||
LdChain.push_back(Ops[i].getValue(1));
|
||||
}
|
||||
|
||||
|
@ -2301,6 +2313,7 @@ void DAGTypeLegalizer::GenWidenVectorStores(SmallVector<SDValue, 16>& StChain,
|
|||
int SVOffset = ST->getSrcValueOffset();
|
||||
unsigned Align = ST->getAlignment();
|
||||
bool isVolatile = ST->isVolatile();
|
||||
bool isNonTemporal = ST->isNonTemporal();
|
||||
SDValue ValOp = GetWidenedVector(ST->getValue());
|
||||
DebugLoc dl = ST->getDebugLoc();
|
||||
|
||||
|
@ -2326,6 +2339,7 @@ void DAGTypeLegalizer::GenWidenVectorStores(SmallVector<SDValue, 16>& StChain,
|
|||
DAG.getIntPtrConstant(Idx));
|
||||
StChain.push_back(DAG.getStore(Chain, dl, EOp, BasePtr, SV,
|
||||
SVOffset + Offset, isVolatile,
|
||||
isNonTemporal,
|
||||
MinAlign(Align, Offset)));
|
||||
StWidth -= NewVTWidth;
|
||||
Offset += Increment;
|
||||
|
@ -2344,8 +2358,8 @@ void DAGTypeLegalizer::GenWidenVectorStores(SmallVector<SDValue, 16>& StChain,
|
|||
SDValue EOp = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, NewVT, VecOp,
|
||||
DAG.getIntPtrConstant(Idx++));
|
||||
StChain.push_back(DAG.getStore(Chain, dl, EOp, BasePtr, SV,
|
||||
SVOffset + Offset, isVolatile,
|
||||
MinAlign(Align, Offset)));
|
||||
SVOffset + Offset, isVolatile,
|
||||
isNonTemporal, MinAlign(Align, Offset)));
|
||||
StWidth -= NewVTWidth;
|
||||
Offset += Increment;
|
||||
BasePtr = DAG.getNode(ISD::ADD, dl, BasePtr.getValueType(), BasePtr,
|
||||
|
@ -2368,6 +2382,7 @@ DAGTypeLegalizer::GenWidenVectorTruncStores(SmallVector<SDValue, 16>& StChain,
|
|||
int SVOffset = ST->getSrcValueOffset();
|
||||
unsigned Align = ST->getAlignment();
|
||||
bool isVolatile = ST->isVolatile();
|
||||
bool isNonTemporal = ST->isNonTemporal();
|
||||
SDValue ValOp = GetWidenedVector(ST->getValue());
|
||||
DebugLoc dl = ST->getDebugLoc();
|
||||
|
||||
|
@ -2390,7 +2405,7 @@ DAGTypeLegalizer::GenWidenVectorTruncStores(SmallVector<SDValue, 16>& StChain,
|
|||
DAG.getIntPtrConstant(0));
|
||||
StChain.push_back(DAG.getTruncStore(Chain, dl, EOp, BasePtr, SV,
|
||||
SVOffset, StEltVT,
|
||||
isVolatile, Align));
|
||||
isVolatile, isNonTemporal, Align));
|
||||
unsigned Offset = Increment;
|
||||
for (unsigned i=1; i < NumElts; ++i, Offset += Increment) {
|
||||
SDValue NewBasePtr = DAG.getNode(ISD::ADD, dl, BasePtr.getValueType(),
|
||||
|
@ -2399,7 +2414,8 @@ DAGTypeLegalizer::GenWidenVectorTruncStores(SmallVector<SDValue, 16>& StChain,
|
|||
DAG.getIntPtrConstant(0));
|
||||
StChain.push_back(DAG.getTruncStore(Chain, dl, EOp, NewBasePtr, SV,
|
||||
SVOffset + Offset, StEltVT,
|
||||
isVolatile, MinAlign(Align, Offset)));
|
||||
isVolatile, isNonTemporal,
|
||||
MinAlign(Align, Offset)));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3299,7 +3299,7 @@ static SDValue getMemcpyLoadsAndStores(SelectionDAG &DAG, DebugLoc dl,
|
|||
Value = getMemsetStringVal(VT, dl, DAG, TLI, Str, SrcOff);
|
||||
Store = DAG.getStore(Chain, dl, Value,
|
||||
getMemBasePlusOffset(Dst, DstOff, DAG),
|
||||
DstSV, DstSVOff + DstOff, false, DstAlign);
|
||||
DstSV, DstSVOff + DstOff, false, false, DstAlign);
|
||||
} else {
|
||||
// The type might not be legal for the target. This should only happen
|
||||
// if the type is smaller than a legal type, as on PPC, so the right
|
||||
|
@ -3310,10 +3310,11 @@ static SDValue getMemcpyLoadsAndStores(SelectionDAG &DAG, DebugLoc dl,
|
|||
assert(NVT.bitsGE(VT));
|
||||
Value = DAG.getExtLoad(ISD::EXTLOAD, dl, NVT, Chain,
|
||||
getMemBasePlusOffset(Src, SrcOff, DAG),
|
||||
SrcSV, SrcSVOff + SrcOff, VT, false, Align);
|
||||
SrcSV, SrcSVOff + SrcOff, VT, false, false, Align);
|
||||
Store = DAG.getTruncStore(Chain, dl, Value,
|
||||
getMemBasePlusOffset(Dst, DstOff, DAG),
|
||||
DstSV, DstSVOff + DstOff, VT, false, DstAlign);
|
||||
getMemBasePlusOffset(Dst, DstOff, DAG),
|
||||
DstSV, DstSVOff + DstOff, VT, false, false,
|
||||
DstAlign);
|
||||
}
|
||||
OutChains.push_back(Store);
|
||||
SrcOff += VTSize;
|
||||
|
@ -3358,7 +3359,7 @@ static SDValue getMemmoveLoadsAndStores(SelectionDAG &DAG, DebugLoc dl,
|
|||
|
||||
Value = DAG.getLoad(VT, dl, Chain,
|
||||
getMemBasePlusOffset(Src, SrcOff, DAG),
|
||||
SrcSV, SrcSVOff + SrcOff, false, Align);
|
||||
SrcSV, SrcSVOff + SrcOff, false, false, Align);
|
||||
LoadValues.push_back(Value);
|
||||
LoadChains.push_back(Value.getValue(1));
|
||||
SrcOff += VTSize;
|
||||
|
@ -3373,7 +3374,7 @@ static SDValue getMemmoveLoadsAndStores(SelectionDAG &DAG, DebugLoc dl,
|
|||
|
||||
Store = DAG.getStore(Chain, dl, LoadValues[i],
|
||||
getMemBasePlusOffset(Dst, DstOff, DAG),
|
||||
DstSV, DstSVOff + DstOff, false, DstAlign);
|
||||
DstSV, DstSVOff + DstOff, false, false, DstAlign);
|
||||
OutChains.push_back(Store);
|
||||
DstOff += VTSize;
|
||||
}
|
||||
|
@ -3408,7 +3409,7 @@ static SDValue getMemsetStores(SelectionDAG &DAG, DebugLoc dl,
|
|||
SDValue Value = getMemsetValue(Src, VT, DAG, dl);
|
||||
SDValue Store = DAG.getStore(Chain, dl, Value,
|
||||
getMemBasePlusOffset(Dst, DstOff, DAG),
|
||||
DstSV, DstSVOff + DstOff);
|
||||
DstSV, DstSVOff + DstOff, false, false, 0);
|
||||
OutChains.push_back(Store);
|
||||
DstOff += VTSize;
|
||||
}
|
||||
|
@ -3788,7 +3789,8 @@ SelectionDAG::getLoad(ISD::MemIndexedMode AM, DebugLoc dl,
|
|||
ISD::LoadExtType ExtType, EVT VT, SDValue Chain,
|
||||
SDValue Ptr, SDValue Offset,
|
||||
const Value *SV, int SVOffset, EVT MemVT,
|
||||
bool isVolatile, unsigned Alignment) {
|
||||
bool isVolatile, bool isNonTemporal,
|
||||
unsigned Alignment) {
|
||||
if (Alignment == 0) // Ensure that codegen never sees alignment 0
|
||||
Alignment = getEVTAlignment(VT);
|
||||
|
||||
|
@ -3802,6 +3804,8 @@ SelectionDAG::getLoad(ISD::MemIndexedMode AM, DebugLoc dl,
|
|||
unsigned Flags = MachineMemOperand::MOLoad;
|
||||
if (isVolatile)
|
||||
Flags |= MachineMemOperand::MOVolatile;
|
||||
if (isNonTemporal)
|
||||
Flags |= MachineMemOperand::MONonTemporal;
|
||||
MachineMemOperand *MMO =
|
||||
MF.getMachineMemOperand(SV, Flags, SVOffset,
|
||||
MemVT.getStoreSize(), Alignment);
|
||||
|
@ -3856,20 +3860,22 @@ SelectionDAG::getLoad(ISD::MemIndexedMode AM, DebugLoc dl,
|
|||
SDValue SelectionDAG::getLoad(EVT VT, DebugLoc dl,
|
||||
SDValue Chain, SDValue Ptr,
|
||||
const Value *SV, int SVOffset,
|
||||
bool isVolatile, unsigned Alignment) {
|
||||
bool isVolatile, bool isNonTemporal,
|
||||
unsigned Alignment) {
|
||||
SDValue Undef = getUNDEF(Ptr.getValueType());
|
||||
return getLoad(ISD::UNINDEXED, dl, ISD::NON_EXTLOAD, VT, Chain, Ptr, Undef,
|
||||
SV, SVOffset, VT, isVolatile, Alignment);
|
||||
SV, SVOffset, VT, isVolatile, isNonTemporal, Alignment);
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getExtLoad(ISD::LoadExtType ExtType, DebugLoc dl, EVT VT,
|
||||
SDValue Chain, SDValue Ptr,
|
||||
const Value *SV,
|
||||
int SVOffset, EVT MemVT,
|
||||
bool isVolatile, unsigned Alignment) {
|
||||
bool isVolatile, bool isNonTemporal,
|
||||
unsigned Alignment) {
|
||||
SDValue Undef = getUNDEF(Ptr.getValueType());
|
||||
return getLoad(ISD::UNINDEXED, dl, ExtType, VT, Chain, Ptr, Undef,
|
||||
SV, SVOffset, MemVT, isVolatile, Alignment);
|
||||
SV, SVOffset, MemVT, isVolatile, isNonTemporal, Alignment);
|
||||
}
|
||||
|
||||
SDValue
|
||||
|
@ -3881,12 +3887,13 @@ SelectionDAG::getIndexedLoad(SDValue OrigLoad, DebugLoc dl, SDValue Base,
|
|||
return getLoad(AM, dl, LD->getExtensionType(), OrigLoad.getValueType(),
|
||||
LD->getChain(), Base, Offset, LD->getSrcValue(),
|
||||
LD->getSrcValueOffset(), LD->getMemoryVT(),
|
||||
LD->isVolatile(), LD->getAlignment());
|
||||
LD->isVolatile(), LD->isNonTemporal(), LD->getAlignment());
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getStore(SDValue Chain, DebugLoc dl, SDValue Val,
|
||||
SDValue Ptr, const Value *SV, int SVOffset,
|
||||
bool isVolatile, unsigned Alignment) {
|
||||
bool isVolatile, bool isNonTemporal,
|
||||
unsigned Alignment) {
|
||||
if (Alignment == 0) // Ensure that codegen never sees alignment 0
|
||||
Alignment = getEVTAlignment(Val.getValueType());
|
||||
|
||||
|
@ -3900,6 +3907,8 @@ SDValue SelectionDAG::getStore(SDValue Chain, DebugLoc dl, SDValue Val,
|
|||
unsigned Flags = MachineMemOperand::MOStore;
|
||||
if (isVolatile)
|
||||
Flags |= MachineMemOperand::MOVolatile;
|
||||
if (isNonTemporal)
|
||||
Flags |= MachineMemOperand::MONonTemporal;
|
||||
MachineMemOperand *MMO =
|
||||
MF.getMachineMemOperand(SV, Flags, SVOffset,
|
||||
Val.getValueType().getStoreSize(), Alignment);
|
||||
|
@ -3932,7 +3941,8 @@ SDValue SelectionDAG::getStore(SDValue Chain, DebugLoc dl, SDValue Val,
|
|||
SDValue SelectionDAG::getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val,
|
||||
SDValue Ptr, const Value *SV,
|
||||
int SVOffset, EVT SVT,
|
||||
bool isVolatile, unsigned Alignment) {
|
||||
bool isVolatile, bool isNonTemporal,
|
||||
unsigned Alignment) {
|
||||
if (Alignment == 0) // Ensure that codegen never sees alignment 0
|
||||
Alignment = getEVTAlignment(SVT);
|
||||
|
||||
|
@ -3946,6 +3956,8 @@ SDValue SelectionDAG::getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val,
|
|||
unsigned Flags = MachineMemOperand::MOStore;
|
||||
if (isVolatile)
|
||||
Flags |= MachineMemOperand::MOVolatile;
|
||||
if (isNonTemporal)
|
||||
Flags |= MachineMemOperand::MONonTemporal;
|
||||
MachineMemOperand *MMO =
|
||||
MF.getMachineMemOperand(SV, Flags, SVOffset, SVT.getStoreSize(), Alignment);
|
||||
|
||||
|
|
|
@ -844,7 +844,7 @@ void SelectionDAGBuilder::visitRet(ReturnInst &I) {
|
|||
Chains[i] =
|
||||
DAG.getStore(Chain, getCurDebugLoc(),
|
||||
SDValue(RetOp.getNode(), RetOp.getResNo() + i),
|
||||
Add, NULL, Offsets[i], false, 0);
|
||||
Add, NULL, Offsets[i], false, false, 0);
|
||||
}
|
||||
|
||||
Chain = DAG.getNode(ISD::TokenFactor, getCurDebugLoc(),
|
||||
|
@ -2705,7 +2705,9 @@ void SelectionDAGBuilder::visitLoad(LoadInst &I) {
|
|||
SDValue Ptr = getValue(SV);
|
||||
|
||||
const Type *Ty = I.getType();
|
||||
|
||||
bool isVolatile = I.isVolatile();
|
||||
bool isNonTemporal = I.getMetadata("nontemporal") != 0;
|
||||
unsigned Alignment = I.getAlignment();
|
||||
|
||||
SmallVector<EVT, 4> ValueVTs;
|
||||
|
@ -2737,7 +2739,8 @@ void SelectionDAGBuilder::visitLoad(LoadInst &I) {
|
|||
PtrVT, Ptr,
|
||||
DAG.getConstant(Offsets[i], PtrVT));
|
||||
SDValue L = DAG.getLoad(ValueVTs[i], getCurDebugLoc(), Root,
|
||||
A, SV, Offsets[i], isVolatile, Alignment);
|
||||
A, SV, Offsets[i], isVolatile,
|
||||
isNonTemporal, Alignment);
|
||||
|
||||
Values[i] = L;
|
||||
Chains[i] = L.getValue(1);
|
||||
|
@ -2778,6 +2781,7 @@ void SelectionDAGBuilder::visitStore(StoreInst &I) {
|
|||
SmallVector<SDValue, 4> Chains(NumValues);
|
||||
EVT PtrVT = Ptr.getValueType();
|
||||
bool isVolatile = I.isVolatile();
|
||||
bool isNonTemporal = I.getMetadata("nontemporal") != 0;
|
||||
unsigned Alignment = I.getAlignment();
|
||||
|
||||
for (unsigned i = 0; i != NumValues; ++i) {
|
||||
|
@ -2785,7 +2789,8 @@ void SelectionDAGBuilder::visitStore(StoreInst &I) {
|
|||
DAG.getConstant(Offsets[i], PtrVT));
|
||||
Chains[i] = DAG.getStore(Root, getCurDebugLoc(),
|
||||
SDValue(Src.getNode(), Src.getResNo() + i),
|
||||
Add, PtrV, Offsets[i], isVolatile, Alignment);
|
||||
Add, PtrV, Offsets[i], isVolatile,
|
||||
isNonTemporal, Alignment);
|
||||
}
|
||||
|
||||
DAG.setRoot(DAG.getNode(ISD::TokenFactor, getCurDebugLoc(),
|
||||
|
@ -4064,7 +4069,7 @@ SelectionDAGBuilder::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
|
|||
// Store the stack protector onto the stack.
|
||||
Res = DAG.getStore(getRoot(), getCurDebugLoc(), Src, FIN,
|
||||
PseudoSourceValue::getFixedStack(FI),
|
||||
0, true);
|
||||
0, true, false, 0);
|
||||
setValue(&I, Res);
|
||||
DAG.setRoot(Res);
|
||||
return 0;
|
||||
|
@ -4416,7 +4421,7 @@ void SelectionDAGBuilder::LowerCallTo(CallSite CS, SDValue Callee,
|
|||
DemoteStackSlot,
|
||||
DAG.getConstant(Offsets[i], PtrVT));
|
||||
SDValue L = DAG.getLoad(OutVTs[i], getCurDebugLoc(), Result.second,
|
||||
Add, NULL, Offsets[i], false, 1);
|
||||
Add, NULL, Offsets[i], false, false, 1);
|
||||
Values[i] = L;
|
||||
Chains[i] = L.getValue(1);
|
||||
}
|
||||
|
@ -4518,7 +4523,8 @@ static SDValue getMemCmpLoad(Value *PtrVal, MVT LoadVT, const Type *LoadTy,
|
|||
SDValue Ptr = Builder.getValue(PtrVal);
|
||||
SDValue LoadVal = Builder.DAG.getLoad(LoadVT, Builder.getCurDebugLoc(), Root,
|
||||
Ptr, PtrVal /*SrcValue*/, 0/*SVOffset*/,
|
||||
false /*volatile*/, 1 /* align=1 */);
|
||||
false /*volatile*/,
|
||||
false /*nontemporal*/, 1 /* align=1 */);
|
||||
|
||||
if (!ConstantMemory)
|
||||
Builder.PendingLoads.push_back(LoadVal.getValue(1));
|
||||
|
@ -5336,7 +5342,8 @@ void SelectionDAGBuilder::visitInlineAsm(CallSite CS) {
|
|||
int SSFI = MF.getFrameInfo()->CreateStackObject(TySize, Align, false);
|
||||
SDValue StackSlot = DAG.getFrameIndex(SSFI, TLI.getPointerTy());
|
||||
Chain = DAG.getStore(Chain, getCurDebugLoc(),
|
||||
OpInfo.CallOperand, StackSlot, NULL, 0);
|
||||
OpInfo.CallOperand, StackSlot, NULL, 0,
|
||||
false, false, 0);
|
||||
OpInfo.CallOperand = StackSlot;
|
||||
}
|
||||
|
||||
|
@ -5622,7 +5629,8 @@ void SelectionDAGBuilder::visitInlineAsm(CallSite CS) {
|
|||
SDValue Val = DAG.getStore(Chain, getCurDebugLoc(),
|
||||
StoresToEmit[i].first,
|
||||
getValue(StoresToEmit[i].second),
|
||||
StoresToEmit[i].second, 0);
|
||||
StoresToEmit[i].second, 0,
|
||||
false, false, 0);
|
||||
OutChains.push_back(Val);
|
||||
}
|
||||
|
||||
|
|
|
@ -1716,7 +1716,7 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
|
|||
SDValue NewLoad = DAG.getLoad(newVT, dl, Lod->getChain(), Ptr,
|
||||
Lod->getSrcValue(),
|
||||
Lod->getSrcValueOffset() + bestOffset,
|
||||
false, NewAlign);
|
||||
false, false, NewAlign);
|
||||
return DAG.getSetCC(dl, VT,
|
||||
DAG.getNode(ISD::AND, dl, newVT, NewLoad,
|
||||
DAG.getConstant(bestMask.trunc(bestWidth),
|
||||
|
|
Loading…
Reference in New Issue