forked from OSchip/llvm-project
propagate MachinePointerInfo through various uses of the old
SelectionDAG::getExtLoad overload, and eliminate it. llvm-svn: 114446
This commit is contained in:
parent
cbac342e1a
commit
3d178ed4d4
|
@ -636,10 +636,10 @@ public:
|
|||
SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo,
|
||||
EVT MemVT, bool isVolatile,
|
||||
bool isNonTemporal, unsigned Alignment);
|
||||
SDValue getExtLoad(ISD::LoadExtType ExtType, EVT VT, DebugLoc dl,
|
||||
/* SDValue getExtLoad(ISD::LoadExtType ExtType, EVT VT, DebugLoc dl,
|
||||
SDValue Chain, SDValue Ptr, const Value *SV,
|
||||
int SVOffset, EVT MemVT, bool isVolatile,
|
||||
bool isNonTemporal, unsigned Alignment);
|
||||
bool isNonTemporal, unsigned Alignment);*/
|
||||
SDValue getIndexedLoad(SDValue OrigLoad, DebugLoc dl, SDValue Base,
|
||||
SDValue Offset, ISD::MemIndexedMode AM);
|
||||
SDValue getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
|
||||
|
|
|
@ -671,7 +671,7 @@ SDValue DAGCombiner::PromoteOperand(SDValue Op, EVT PVT, bool &Replace) {
|
|||
Replace = true;
|
||||
return DAG.getExtLoad(ExtType, PVT, dl,
|
||||
LD->getChain(), LD->getBasePtr(),
|
||||
LD->getSrcValue(), LD->getSrcValueOffset(),
|
||||
LD->getPointerInfo(),
|
||||
MemVT, LD->isVolatile(),
|
||||
LD->isNonTemporal(), LD->getAlignment());
|
||||
}
|
||||
|
@ -893,7 +893,7 @@ bool DAGCombiner::PromoteLoad(SDValue Op) {
|
|||
: LD->getExtensionType();
|
||||
SDValue NewLD = DAG.getExtLoad(ExtType, PVT, dl,
|
||||
LD->getChain(), LD->getBasePtr(),
|
||||
LD->getSrcValue(), LD->getSrcValueOffset(),
|
||||
LD->getPointerInfo(),
|
||||
MemVT, LD->isVolatile(),
|
||||
LD->isNonTemporal(), LD->getAlignment());
|
||||
SDValue Result = DAG.getNode(ISD::TRUNCATE, dl, VT, NewLD);
|
||||
|
@ -2200,8 +2200,7 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
|
|||
TLI.isLoadExtLegal(ISD::ZEXTLOAD, MemVT))) {
|
||||
SDValue ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, VT, N0.getDebugLoc(),
|
||||
LN0->getChain(), LN0->getBasePtr(),
|
||||
LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(), MemVT,
|
||||
LN0->getPointerInfo(), MemVT,
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
AddToWorkList(N);
|
||||
|
@ -2223,8 +2222,8 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
|
|||
TLI.isLoadExtLegal(ISD::ZEXTLOAD, MemVT))) {
|
||||
SDValue ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, VT, N0.getDebugLoc(),
|
||||
LN0->getChain(),
|
||||
LN0->getBasePtr(), LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(), MemVT,
|
||||
LN0->getBasePtr(), LN0->getPointerInfo(),
|
||||
MemVT,
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
AddToWorkList(N);
|
||||
|
@ -2257,7 +2256,7 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
|
|||
SDValue NewLoad =
|
||||
DAG.getExtLoad(ISD::ZEXTLOAD, LoadResultTy, LN0->getDebugLoc(),
|
||||
LN0->getChain(), LN0->getBasePtr(),
|
||||
LN0->getSrcValue(), LN0->getSrcValueOffset(),
|
||||
LN0->getPointerInfo(),
|
||||
ExtVT, LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
AddToWorkList(N);
|
||||
|
@ -2293,7 +2292,7 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
|
|||
SDValue Load =
|
||||
DAG.getExtLoad(ISD::ZEXTLOAD, LoadResultTy, LN0->getDebugLoc(),
|
||||
LN0->getChain(), NewPtr,
|
||||
LN0->getSrcValue(), LN0->getSrcValueOffset(),
|
||||
LN0->getPointerInfo(),
|
||||
ExtVT, LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
Alignment);
|
||||
AddToWorkList(N);
|
||||
|
@ -3505,8 +3504,7 @@ SDValue DAGCombiner::visitSIGN_EXTEND(SDNode *N) {
|
|||
LoadSDNode *LN0 = cast<LoadSDNode>(N0);
|
||||
SDValue ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, VT, N->getDebugLoc(),
|
||||
LN0->getChain(),
|
||||
LN0->getBasePtr(), LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(),
|
||||
LN0->getBasePtr(), LN0->getPointerInfo(),
|
||||
N0.getValueType(),
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
|
@ -3549,8 +3547,8 @@ SDValue DAGCombiner::visitSIGN_EXTEND(SDNode *N) {
|
|||
TLI.isLoadExtLegal(ISD::SEXTLOAD, MemVT)) {
|
||||
SDValue ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, VT, N->getDebugLoc(),
|
||||
LN0->getChain(),
|
||||
LN0->getBasePtr(), LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(), MemVT,
|
||||
LN0->getBasePtr(), LN0->getPointerInfo(),
|
||||
MemVT,
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
CombineTo(N, ExtLoad);
|
||||
|
@ -3694,8 +3692,7 @@ SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) {
|
|||
LoadSDNode *LN0 = cast<LoadSDNode>(N0);
|
||||
SDValue ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, VT, N->getDebugLoc(),
|
||||
LN0->getChain(),
|
||||
LN0->getBasePtr(), LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(),
|
||||
LN0->getBasePtr(), LN0->getPointerInfo(),
|
||||
N0.getValueType(),
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
|
@ -3738,8 +3735,8 @@ SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) {
|
|||
TLI.isLoadExtLegal(ISD::ZEXTLOAD, MemVT)) {
|
||||
SDValue ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, VT, N->getDebugLoc(),
|
||||
LN0->getChain(),
|
||||
LN0->getBasePtr(), LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(), MemVT,
|
||||
LN0->getBasePtr(), LN0->getPointerInfo(),
|
||||
MemVT,
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
CombineTo(N, ExtLoad);
|
||||
|
@ -3896,8 +3893,7 @@ SDValue DAGCombiner::visitANY_EXTEND(SDNode *N) {
|
|||
LoadSDNode *LN0 = cast<LoadSDNode>(N0);
|
||||
SDValue ExtLoad = DAG.getExtLoad(ISD::EXTLOAD, VT, N->getDebugLoc(),
|
||||
LN0->getChain(),
|
||||
LN0->getBasePtr(), LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(),
|
||||
LN0->getBasePtr(), LN0->getPointerInfo(),
|
||||
N0.getValueType(),
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
|
@ -3941,8 +3937,7 @@ SDValue DAGCombiner::visitANY_EXTEND(SDNode *N) {
|
|||
SDValue ExtLoad = DAG.getExtLoad(LN0->getExtensionType(), VT,
|
||||
N->getDebugLoc(),
|
||||
LN0->getChain(), LN0->getBasePtr(),
|
||||
LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(), MemVT,
|
||||
LN0->getPointerInfo(), MemVT,
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
CombineTo(N, ExtLoad);
|
||||
|
@ -4198,8 +4193,8 @@ SDValue DAGCombiner::visitSIGN_EXTEND_INREG(SDNode *N) {
|
|||
LoadSDNode *LN0 = cast<LoadSDNode>(N0);
|
||||
SDValue ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, VT, N->getDebugLoc(),
|
||||
LN0->getChain(),
|
||||
LN0->getBasePtr(), LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(), EVT,
|
||||
LN0->getBasePtr(), LN0->getPointerInfo(),
|
||||
EVT,
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
CombineTo(N, ExtLoad);
|
||||
|
@ -4215,8 +4210,8 @@ SDValue DAGCombiner::visitSIGN_EXTEND_INREG(SDNode *N) {
|
|||
LoadSDNode *LN0 = cast<LoadSDNode>(N0);
|
||||
SDValue ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, VT, N->getDebugLoc(),
|
||||
LN0->getChain(),
|
||||
LN0->getBasePtr(), LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(), EVT,
|
||||
LN0->getBasePtr(), LN0->getPointerInfo(),
|
||||
EVT,
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
CombineTo(N, ExtLoad);
|
||||
|
@ -4987,8 +4982,7 @@ SDValue DAGCombiner::visitFP_EXTEND(SDNode *N) {
|
|||
LoadSDNode *LN0 = cast<LoadSDNode>(N0);
|
||||
SDValue ExtLoad = DAG.getExtLoad(ISD::EXTLOAD, VT, N->getDebugLoc(),
|
||||
LN0->getChain(),
|
||||
LN0->getBasePtr(), LN0->getSrcValue(),
|
||||
LN0->getSrcValueOffset(),
|
||||
LN0->getBasePtr(), LN0->getPointerInfo(),
|
||||
N0.getValueType(),
|
||||
LN0->isVolatile(), LN0->isNonTemporal(),
|
||||
LN0->getAlignment());
|
||||
|
@ -5571,8 +5565,8 @@ SDValue DAGCombiner::visitLOAD(SDNode *N) {
|
|||
if (Align > LD->getAlignment())
|
||||
return DAG.getExtLoad(LD->getExtensionType(), LD->getValueType(0),
|
||||
N->getDebugLoc(),
|
||||
Chain, Ptr, LD->getSrcValue(),
|
||||
LD->getSrcValueOffset(), LD->getMemoryVT(),
|
||||
Chain, Ptr, LD->getPointerInfo(),
|
||||
LD->getMemoryVT(),
|
||||
LD->isVolatile(), LD->isNonTemporal(), Align);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -457,10 +457,12 @@ SDValue ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG,
|
|||
|
||||
// Load from the stack slot.
|
||||
SDValue Load = DAG.getExtLoad(ISD::EXTLOAD, RegVT, dl, Store, StackPtr,
|
||||
NULL, 0, MemVT, false, false, 0);
|
||||
MachinePointerInfo(),
|
||||
MemVT, false, false, 0);
|
||||
|
||||
Stores.push_back(DAG.getTruncStore(Load.getValue(1), dl, Load, Ptr,
|
||||
ST->getSrcValue(), SVOffset + Offset,
|
||||
ST->getPointerInfo()
|
||||
.getWithOffset(Offset),
|
||||
MemVT, ST->isVolatile(),
|
||||
ST->isNonTemporal(),
|
||||
MinAlign(ST->getAlignment(), Offset)));
|
||||
|
@ -1150,221 +1152,219 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||
AddLegalizedOperand(SDValue(Node, 0), Tmp3);
|
||||
AddLegalizedOperand(SDValue(Node, 1), Tmp4);
|
||||
return Op.getResNo() ? Tmp4 : Tmp3;
|
||||
} else {
|
||||
EVT SrcVT = LD->getMemoryVT();
|
||||
unsigned SrcWidth = SrcVT.getSizeInBits();
|
||||
int SVOffset = LD->getSrcValueOffset();
|
||||
unsigned Alignment = LD->getAlignment();
|
||||
bool isVolatile = LD->isVolatile();
|
||||
bool isNonTemporal = LD->isNonTemporal();
|
||||
}
|
||||
|
||||
EVT SrcVT = LD->getMemoryVT();
|
||||
unsigned SrcWidth = SrcVT.getSizeInBits();
|
||||
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
|
||||
// load an i8. This trick is correct for ZEXTLOAD because the top 7
|
||||
// bits are guaranteed to be zero; it helps the optimizers understand
|
||||
// that these bits are zero. It is also useful for EXTLOAD, since it
|
||||
// tells the optimizers that those bits are undefined. It would be
|
||||
// nice to have an effective generic way of getting these benefits...
|
||||
// Until such a way is found, don't insist on promoting i1 here.
|
||||
(SrcVT != MVT::i1 ||
|
||||
TLI.getLoadExtAction(ExtType, MVT::i1) == TargetLowering::Promote)) {
|
||||
// Promote to a byte-sized load if not loading an integral number of
|
||||
// bytes. For example, promote EXTLOAD:i20 -> EXTLOAD:i24.
|
||||
unsigned NewWidth = SrcVT.getStoreSizeInBits();
|
||||
EVT NVT = EVT::getIntegerVT(*DAG.getContext(), NewWidth);
|
||||
SDValue Ch;
|
||||
if (SrcWidth != SrcVT.getStoreSizeInBits() &&
|
||||
// Some targets pretend to have an i1 loading operation, and actually
|
||||
// load an i8. This trick is correct for ZEXTLOAD because the top 7
|
||||
// bits are guaranteed to be zero; it helps the optimizers understand
|
||||
// that these bits are zero. It is also useful for EXTLOAD, since it
|
||||
// tells the optimizers that those bits are undefined. It would be
|
||||
// nice to have an effective generic way of getting these benefits...
|
||||
// Until such a way is found, don't insist on promoting i1 here.
|
||||
(SrcVT != MVT::i1 ||
|
||||
TLI.getLoadExtAction(ExtType, MVT::i1) == TargetLowering::Promote)) {
|
||||
// Promote to a byte-sized load if not loading an integral number of
|
||||
// bytes. For example, promote EXTLOAD:i20 -> EXTLOAD:i24.
|
||||
unsigned NewWidth = SrcVT.getStoreSizeInBits();
|
||||
EVT NVT = EVT::getIntegerVT(*DAG.getContext(), NewWidth);
|
||||
SDValue Ch;
|
||||
|
||||
// The extra bits are guaranteed to be zero, since we stored them that
|
||||
// way. A zext load from NVT thus automatically gives zext from SrcVT.
|
||||
// The extra bits are guaranteed to be zero, since we stored them that
|
||||
// way. A zext load from NVT thus automatically gives zext from SrcVT.
|
||||
|
||||
ISD::LoadExtType NewExtType =
|
||||
ExtType == ISD::ZEXTLOAD ? ISD::ZEXTLOAD : ISD::EXTLOAD;
|
||||
ISD::LoadExtType NewExtType =
|
||||
ExtType == ISD::ZEXTLOAD ? ISD::ZEXTLOAD : ISD::EXTLOAD;
|
||||
|
||||
Result = DAG.getExtLoad(NewExtType, Node->getValueType(0), dl,
|
||||
Tmp1, Tmp2, LD->getSrcValue(), SVOffset,
|
||||
NVT, isVolatile, isNonTemporal, Alignment);
|
||||
Result = DAG.getExtLoad(NewExtType, Node->getValueType(0), dl,
|
||||
Tmp1, Tmp2, LD->getPointerInfo(),
|
||||
NVT, isVolatile, isNonTemporal, Alignment);
|
||||
|
||||
Ch = Result.getValue(1); // The chain.
|
||||
Ch = Result.getValue(1); // The chain.
|
||||
|
||||
if (ExtType == ISD::SEXTLOAD)
|
||||
// Having the top bits zero doesn't help when sign extending.
|
||||
Result = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl,
|
||||
Result.getValueType(),
|
||||
Result, DAG.getValueType(SrcVT));
|
||||
else if (ExtType == ISD::ZEXTLOAD || NVT == Result.getValueType())
|
||||
// All the top bits are guaranteed to be zero - inform the optimizers.
|
||||
Result = DAG.getNode(ISD::AssertZext, dl,
|
||||
Result.getValueType(), Result,
|
||||
DAG.getValueType(SrcVT));
|
||||
if (ExtType == ISD::SEXTLOAD)
|
||||
// Having the top bits zero doesn't help when sign extending.
|
||||
Result = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl,
|
||||
Result.getValueType(),
|
||||
Result, DAG.getValueType(SrcVT));
|
||||
else if (ExtType == ISD::ZEXTLOAD || NVT == Result.getValueType())
|
||||
// All the top bits are guaranteed to be zero - inform the optimizers.
|
||||
Result = DAG.getNode(ISD::AssertZext, dl,
|
||||
Result.getValueType(), Result,
|
||||
DAG.getValueType(SrcVT));
|
||||
|
||||
Tmp1 = LegalizeOp(Result);
|
||||
Tmp2 = LegalizeOp(Ch);
|
||||
} else if (SrcWidth & (SrcWidth - 1)) {
|
||||
// If not loading a power-of-2 number of bits, expand as two loads.
|
||||
assert(!SrcVT.isVector() && "Unsupported extload!");
|
||||
unsigned RoundWidth = 1 << Log2_32(SrcWidth);
|
||||
assert(RoundWidth < SrcWidth);
|
||||
unsigned ExtraWidth = SrcWidth - RoundWidth;
|
||||
assert(ExtraWidth < RoundWidth);
|
||||
assert(!(RoundWidth % 8) && !(ExtraWidth % 8) &&
|
||||
"Load size not an integral number of bytes!");
|
||||
EVT RoundVT = EVT::getIntegerVT(*DAG.getContext(), RoundWidth);
|
||||
EVT ExtraVT = EVT::getIntegerVT(*DAG.getContext(), ExtraWidth);
|
||||
SDValue Lo, Hi, Ch;
|
||||
unsigned IncrementSize;
|
||||
Tmp1 = LegalizeOp(Result);
|
||||
Tmp2 = LegalizeOp(Ch);
|
||||
} else if (SrcWidth & (SrcWidth - 1)) {
|
||||
// If not loading a power-of-2 number of bits, expand as two loads.
|
||||
assert(!SrcVT.isVector() && "Unsupported extload!");
|
||||
unsigned RoundWidth = 1 << Log2_32(SrcWidth);
|
||||
assert(RoundWidth < SrcWidth);
|
||||
unsigned ExtraWidth = SrcWidth - RoundWidth;
|
||||
assert(ExtraWidth < RoundWidth);
|
||||
assert(!(RoundWidth % 8) && !(ExtraWidth % 8) &&
|
||||
"Load size not an integral number of bytes!");
|
||||
EVT RoundVT = EVT::getIntegerVT(*DAG.getContext(), RoundWidth);
|
||||
EVT ExtraVT = EVT::getIntegerVT(*DAG.getContext(), ExtraWidth);
|
||||
SDValue Lo, Hi, Ch;
|
||||
unsigned IncrementSize;
|
||||
|
||||
if (TLI.isLittleEndian()) {
|
||||
// EXTLOAD:i24 -> ZEXTLOAD:i16 | (shl EXTLOAD@+2:i8, 16)
|
||||
// Load the bottom RoundWidth bits.
|
||||
Lo = DAG.getExtLoad(ISD::ZEXTLOAD, Node->getValueType(0), dl,
|
||||
Tmp1, Tmp2,
|
||||
LD->getSrcValue(), SVOffset, RoundVT, isVolatile,
|
||||
isNonTemporal, Alignment);
|
||||
if (TLI.isLittleEndian()) {
|
||||
// EXTLOAD:i24 -> ZEXTLOAD:i16 | (shl EXTLOAD@+2:i8, 16)
|
||||
// Load the bottom RoundWidth bits.
|
||||
Lo = DAG.getExtLoad(ISD::ZEXTLOAD, Node->getValueType(0), dl,
|
||||
Tmp1, Tmp2,
|
||||
LD->getPointerInfo(), RoundVT, isVolatile,
|
||||
isNonTemporal, Alignment);
|
||||
|
||||
// Load the remaining ExtraWidth bits.
|
||||
IncrementSize = RoundWidth / 8;
|
||||
Tmp2 = DAG.getNode(ISD::ADD, dl, Tmp2.getValueType(), Tmp2,
|
||||
DAG.getIntPtrConstant(IncrementSize));
|
||||
Hi = DAG.getExtLoad(ExtType, Node->getValueType(0), dl, Tmp1, Tmp2,
|
||||
LD->getSrcValue(), SVOffset + IncrementSize,
|
||||
ExtraVT, isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
// Load the remaining ExtraWidth bits.
|
||||
IncrementSize = RoundWidth / 8;
|
||||
Tmp2 = DAG.getNode(ISD::ADD, dl, Tmp2.getValueType(), Tmp2,
|
||||
DAG.getIntPtrConstant(IncrementSize));
|
||||
Hi = DAG.getExtLoad(ExtType, Node->getValueType(0), dl, Tmp1, Tmp2,
|
||||
LD->getPointerInfo().getWithOffset(IncrementSize),
|
||||
ExtraVT, isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
|
||||
// Build a factor node to remember that this load is independent of
|
||||
// the other one.
|
||||
Ch = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1),
|
||||
Hi.getValue(1));
|
||||
// Build a factor node to remember that this load is independent of
|
||||
// the other one.
|
||||
Ch = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1),
|
||||
Hi.getValue(1));
|
||||
|
||||
// Move the top bits to the right place.
|
||||
Hi = DAG.getNode(ISD::SHL, dl, Hi.getValueType(), Hi,
|
||||
DAG.getConstant(RoundWidth, TLI.getShiftAmountTy()));
|
||||
// Move the top bits to the right place.
|
||||
Hi = DAG.getNode(ISD::SHL, dl, Hi.getValueType(), Hi,
|
||||
DAG.getConstant(RoundWidth, TLI.getShiftAmountTy()));
|
||||
|
||||
// Join the hi and lo parts.
|
||||
Result = DAG.getNode(ISD::OR, dl, Node->getValueType(0), Lo, Hi);
|
||||
} else {
|
||||
// Big endian - avoid unaligned loads.
|
||||
// EXTLOAD:i24 -> (shl EXTLOAD:i16, 8) | ZEXTLOAD@+2:i8
|
||||
// Load the top RoundWidth bits.
|
||||
Hi = DAG.getExtLoad(ExtType, Node->getValueType(0), dl, Tmp1, Tmp2,
|
||||
LD->getSrcValue(), SVOffset, RoundVT, isVolatile,
|
||||
isNonTemporal, Alignment);
|
||||
|
||||
// Load the remaining ExtraWidth bits.
|
||||
IncrementSize = RoundWidth / 8;
|
||||
Tmp2 = DAG.getNode(ISD::ADD, dl, Tmp2.getValueType(), Tmp2,
|
||||
DAG.getIntPtrConstant(IncrementSize));
|
||||
Lo = DAG.getExtLoad(ISD::ZEXTLOAD,
|
||||
Node->getValueType(0), dl, Tmp1, Tmp2,
|
||||
LD->getSrcValue(), SVOffset + IncrementSize,
|
||||
ExtraVT, isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
|
||||
// Build a factor node to remember that this load is independent of
|
||||
// the other one.
|
||||
Ch = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1),
|
||||
Hi.getValue(1));
|
||||
|
||||
// Move the top bits to the right place.
|
||||
Hi = DAG.getNode(ISD::SHL, dl, Hi.getValueType(), Hi,
|
||||
DAG.getConstant(ExtraWidth, TLI.getShiftAmountTy()));
|
||||
|
||||
// Join the hi and lo parts.
|
||||
Result = DAG.getNode(ISD::OR, dl, Node->getValueType(0), Lo, Hi);
|
||||
}
|
||||
|
||||
Tmp1 = LegalizeOp(Result);
|
||||
Tmp2 = LegalizeOp(Ch);
|
||||
// Join the hi and lo parts.
|
||||
Result = DAG.getNode(ISD::OR, dl, Node->getValueType(0), Lo, Hi);
|
||||
} else {
|
||||
switch (TLI.getLoadExtAction(ExtType, SrcVT)) {
|
||||
default: assert(0 && "This action is not supported yet!");
|
||||
case TargetLowering::Custom:
|
||||
isCustom = true;
|
||||
// FALLTHROUGH
|
||||
case TargetLowering::Legal:
|
||||
Result = SDValue(DAG.UpdateNodeOperands(Result.getNode(),
|
||||
Tmp1, Tmp2, LD->getOffset()),
|
||||
Result.getResNo());
|
||||
Tmp1 = Result.getValue(0);
|
||||
Tmp2 = Result.getValue(1);
|
||||
// Big endian - avoid unaligned loads.
|
||||
// EXTLOAD:i24 -> (shl EXTLOAD:i16, 8) | ZEXTLOAD@+2:i8
|
||||
// Load the top RoundWidth bits.
|
||||
Hi = DAG.getExtLoad(ExtType, Node->getValueType(0), dl, Tmp1, Tmp2,
|
||||
LD->getPointerInfo(), RoundVT, isVolatile,
|
||||
isNonTemporal, Alignment);
|
||||
|
||||
if (isCustom) {
|
||||
Tmp3 = TLI.LowerOperation(Result, DAG);
|
||||
if (Tmp3.getNode()) {
|
||||
Tmp1 = LegalizeOp(Tmp3);
|
||||
Tmp2 = LegalizeOp(Tmp3.getValue(1));
|
||||
}
|
||||
} else {
|
||||
// If this is an unaligned load and the target doesn't support it,
|
||||
// expand it.
|
||||
if (!TLI.allowsUnalignedMemoryAccesses(LD->getMemoryVT())) {
|
||||
const Type *Ty =
|
||||
LD->getMemoryVT().getTypeForEVT(*DAG.getContext());
|
||||
unsigned ABIAlignment =
|
||||
TLI.getTargetData()->getABITypeAlignment(Ty);
|
||||
if (LD->getAlignment() < ABIAlignment){
|
||||
Result = ExpandUnalignedLoad(cast<LoadSDNode>(Result.getNode()),
|
||||
DAG, TLI);
|
||||
Tmp1 = Result.getOperand(0);
|
||||
Tmp2 = Result.getOperand(1);
|
||||
Tmp1 = LegalizeOp(Tmp1);
|
||||
Tmp2 = LegalizeOp(Tmp2);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case TargetLowering::Expand:
|
||||
if (!TLI.isLoadExtLegal(ISD::EXTLOAD, SrcVT) && isTypeLegal(SrcVT)) {
|
||||
SDValue Load = DAG.getLoad(SrcVT, dl, Tmp1, Tmp2,
|
||||
LD->getPointerInfo(),
|
||||
LD->isVolatile(), LD->isNonTemporal(),
|
||||
LD->getAlignment());
|
||||
unsigned ExtendOp;
|
||||
switch (ExtType) {
|
||||
case ISD::EXTLOAD:
|
||||
ExtendOp = (SrcVT.isFloatingPoint() ?
|
||||
ISD::FP_EXTEND : ISD::ANY_EXTEND);
|
||||
break;
|
||||
case ISD::SEXTLOAD: ExtendOp = ISD::SIGN_EXTEND; break;
|
||||
case ISD::ZEXTLOAD: ExtendOp = ISD::ZERO_EXTEND; break;
|
||||
default: llvm_unreachable("Unexpected extend load type!");
|
||||
}
|
||||
Result = DAG.getNode(ExtendOp, dl, Node->getValueType(0), Load);
|
||||
Tmp1 = LegalizeOp(Result); // Relegalize new nodes.
|
||||
Tmp2 = LegalizeOp(Load.getValue(1));
|
||||
break;
|
||||
}
|
||||
// FIXME: This does not work for vectors on most targets. Sign- and
|
||||
// zero-extend operations are currently folded into extending loads,
|
||||
// whether they are legal or not, and then we end up here without any
|
||||
// support for legalizing them.
|
||||
assert(ExtType != ISD::EXTLOAD &&
|
||||
"EXTLOAD should always be supported!");
|
||||
// Turn the unsupported load into an EXTLOAD followed by an explicit
|
||||
// zero/sign extend inreg.
|
||||
Result = DAG.getExtLoad(ISD::EXTLOAD, Node->getValueType(0), dl,
|
||||
Tmp1, Tmp2, LD->getSrcValue(),
|
||||
LD->getSrcValueOffset(), SrcVT,
|
||||
LD->isVolatile(), LD->isNonTemporal(),
|
||||
LD->getAlignment());
|
||||
SDValue ValRes;
|
||||
if (ExtType == ISD::SEXTLOAD)
|
||||
ValRes = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl,
|
||||
Result.getValueType(),
|
||||
Result, DAG.getValueType(SrcVT));
|
||||
else
|
||||
ValRes = DAG.getZeroExtendInReg(Result, dl, SrcVT);
|
||||
Tmp1 = LegalizeOp(ValRes); // Relegalize new nodes.
|
||||
Tmp2 = LegalizeOp(Result.getValue(1)); // Relegalize new nodes.
|
||||
break;
|
||||
}
|
||||
// Load the remaining ExtraWidth bits.
|
||||
IncrementSize = RoundWidth / 8;
|
||||
Tmp2 = DAG.getNode(ISD::ADD, dl, Tmp2.getValueType(), Tmp2,
|
||||
DAG.getIntPtrConstant(IncrementSize));
|
||||
Lo = DAG.getExtLoad(ISD::ZEXTLOAD,
|
||||
Node->getValueType(0), dl, Tmp1, Tmp2,
|
||||
LD->getPointerInfo().getWithOffset(IncrementSize),
|
||||
ExtraVT, isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
|
||||
// Build a factor node to remember that this load is independent of
|
||||
// the other one.
|
||||
Ch = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1),
|
||||
Hi.getValue(1));
|
||||
|
||||
// Move the top bits to the right place.
|
||||
Hi = DAG.getNode(ISD::SHL, dl, Hi.getValueType(), Hi,
|
||||
DAG.getConstant(ExtraWidth, TLI.getShiftAmountTy()));
|
||||
|
||||
// Join the hi and lo parts.
|
||||
Result = DAG.getNode(ISD::OR, dl, Node->getValueType(0), Lo, Hi);
|
||||
}
|
||||
|
||||
// Since loads produce two values, make sure to remember that we legalized
|
||||
// both of them.
|
||||
AddLegalizedOperand(SDValue(Node, 0), Tmp1);
|
||||
AddLegalizedOperand(SDValue(Node, 1), Tmp2);
|
||||
return Op.getResNo() ? Tmp2 : Tmp1;
|
||||
Tmp1 = LegalizeOp(Result);
|
||||
Tmp2 = LegalizeOp(Ch);
|
||||
} else {
|
||||
switch (TLI.getLoadExtAction(ExtType, SrcVT)) {
|
||||
default: assert(0 && "This action is not supported yet!");
|
||||
case TargetLowering::Custom:
|
||||
isCustom = true;
|
||||
// FALLTHROUGH
|
||||
case TargetLowering::Legal:
|
||||
Result = SDValue(DAG.UpdateNodeOperands(Result.getNode(),
|
||||
Tmp1, Tmp2, LD->getOffset()),
|
||||
Result.getResNo());
|
||||
Tmp1 = Result.getValue(0);
|
||||
Tmp2 = Result.getValue(1);
|
||||
|
||||
if (isCustom) {
|
||||
Tmp3 = TLI.LowerOperation(Result, DAG);
|
||||
if (Tmp3.getNode()) {
|
||||
Tmp1 = LegalizeOp(Tmp3);
|
||||
Tmp2 = LegalizeOp(Tmp3.getValue(1));
|
||||
}
|
||||
} else {
|
||||
// If this is an unaligned load and the target doesn't support it,
|
||||
// expand it.
|
||||
if (!TLI.allowsUnalignedMemoryAccesses(LD->getMemoryVT())) {
|
||||
const Type *Ty =
|
||||
LD->getMemoryVT().getTypeForEVT(*DAG.getContext());
|
||||
unsigned ABIAlignment =
|
||||
TLI.getTargetData()->getABITypeAlignment(Ty);
|
||||
if (LD->getAlignment() < ABIAlignment){
|
||||
Result = ExpandUnalignedLoad(cast<LoadSDNode>(Result.getNode()),
|
||||
DAG, TLI);
|
||||
Tmp1 = Result.getOperand(0);
|
||||
Tmp2 = Result.getOperand(1);
|
||||
Tmp1 = LegalizeOp(Tmp1);
|
||||
Tmp2 = LegalizeOp(Tmp2);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case TargetLowering::Expand:
|
||||
if (!TLI.isLoadExtLegal(ISD::EXTLOAD, SrcVT) && isTypeLegal(SrcVT)) {
|
||||
SDValue Load = DAG.getLoad(SrcVT, dl, Tmp1, Tmp2,
|
||||
LD->getPointerInfo(),
|
||||
LD->isVolatile(), LD->isNonTemporal(),
|
||||
LD->getAlignment());
|
||||
unsigned ExtendOp;
|
||||
switch (ExtType) {
|
||||
case ISD::EXTLOAD:
|
||||
ExtendOp = (SrcVT.isFloatingPoint() ?
|
||||
ISD::FP_EXTEND : ISD::ANY_EXTEND);
|
||||
break;
|
||||
case ISD::SEXTLOAD: ExtendOp = ISD::SIGN_EXTEND; break;
|
||||
case ISD::ZEXTLOAD: ExtendOp = ISD::ZERO_EXTEND; break;
|
||||
default: llvm_unreachable("Unexpected extend load type!");
|
||||
}
|
||||
Result = DAG.getNode(ExtendOp, dl, Node->getValueType(0), Load);
|
||||
Tmp1 = LegalizeOp(Result); // Relegalize new nodes.
|
||||
Tmp2 = LegalizeOp(Load.getValue(1));
|
||||
break;
|
||||
}
|
||||
// FIXME: This does not work for vectors on most targets. Sign- and
|
||||
// zero-extend operations are currently folded into extending loads,
|
||||
// whether they are legal or not, and then we end up here without any
|
||||
// support for legalizing them.
|
||||
assert(ExtType != ISD::EXTLOAD &&
|
||||
"EXTLOAD should always be supported!");
|
||||
// Turn the unsupported load into an EXTLOAD followed by an explicit
|
||||
// zero/sign extend inreg.
|
||||
Result = DAG.getExtLoad(ISD::EXTLOAD, Node->getValueType(0), dl,
|
||||
Tmp1, Tmp2, LD->getPointerInfo(), SrcVT,
|
||||
LD->isVolatile(), LD->isNonTemporal(),
|
||||
LD->getAlignment());
|
||||
SDValue ValRes;
|
||||
if (ExtType == ISD::SEXTLOAD)
|
||||
ValRes = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl,
|
||||
Result.getValueType(),
|
||||
Result, DAG.getValueType(SrcVT));
|
||||
else
|
||||
ValRes = DAG.getZeroExtendInReg(Result, dl, SrcVT);
|
||||
Tmp1 = LegalizeOp(ValRes); // Relegalize new nodes.
|
||||
Tmp2 = LegalizeOp(Result.getValue(1)); // Relegalize new nodes.
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Since loads produce two values, make sure to remember that we legalized
|
||||
// both of them.
|
||||
AddLegalizedOperand(SDValue(Node, 0), Tmp1);
|
||||
AddLegalizedOperand(SDValue(Node, 1), Tmp2);
|
||||
return Op.getResNo() ? Tmp2 : Tmp1;
|
||||
}
|
||||
case ISD::STORE: {
|
||||
StoreSDNode *ST = cast<StoreSDNode>(Node);
|
||||
|
@ -1562,11 +1562,10 @@ SDValue SelectionDAGLegalize::ExpandExtractFromVectorThroughStack(SDValue Op) {
|
|||
if (Op.getValueType().isVector())
|
||||
return DAG.getLoad(Op.getValueType(), dl, Ch, StackPtr,MachinePointerInfo(),
|
||||
false, false, 0);
|
||||
else
|
||||
return DAG.getExtLoad(ISD::EXTLOAD, Op.getValueType(), dl, Ch, StackPtr,
|
||||
MachinePointerInfo(),
|
||||
Vec.getValueType().getVectorElementType(),
|
||||
false, false, 0);
|
||||
return DAG.getExtLoad(ISD::EXTLOAD, Op.getValueType(), dl, Ch, StackPtr,
|
||||
MachinePointerInfo(),
|
||||
Vec.getValueType().getVectorElementType(),
|
||||
false, false, 0);
|
||||
}
|
||||
|
||||
SDValue SelectionDAGLegalize::ExpandVectorBuildThroughStack(SDNode* Node) {
|
||||
|
|
|
@ -1111,8 +1111,7 @@ void DAGTypeLegalizer::ExpandFloatRes_LOAD(SDNode *N, SDValue &Lo,
|
|||
assert(LD->getMemoryVT().bitsLE(NVT) && "Float type not round?");
|
||||
|
||||
Hi = DAG.getExtLoad(LD->getExtensionType(), NVT, dl, Chain, Ptr,
|
||||
LD->getSrcValue(), LD->getSrcValueOffset(),
|
||||
LD->getMemoryVT(), LD->isVolatile(),
|
||||
LD->getPointerInfo(), LD->getMemoryVT(), LD->isVolatile(),
|
||||
LD->isNonTemporal(), LD->getAlignment());
|
||||
|
||||
// Remember the chain.
|
||||
|
|
|
@ -372,7 +372,7 @@ SDValue DAGTypeLegalizer::PromoteIntRes_LOAD(LoadSDNode *N) {
|
|||
ISD::isNON_EXTLoad(N) ? ISD::EXTLOAD : N->getExtensionType();
|
||||
DebugLoc dl = N->getDebugLoc();
|
||||
SDValue Res = DAG.getExtLoad(ExtType, NVT, dl, N->getChain(), N->getBasePtr(),
|
||||
N->getSrcValue(), N->getSrcValueOffset(),
|
||||
N->getPointerInfo(),
|
||||
N->getMemoryVT(), N->isVolatile(),
|
||||
N->isNonTemporal(), N->getAlignment());
|
||||
|
||||
|
@ -2459,7 +2459,9 @@ SDValue DAGTypeLegalizer::ExpandIntOp_UINT_TO_FP(SDNode *N) {
|
|||
// Load the value out, extending it from f32 to the destination float type.
|
||||
// FIXME: Avoid the extend by constructing the right constant pool?
|
||||
SDValue Fudge = DAG.getExtLoad(ISD::EXTLOAD, DstVT, dl, DAG.getEntryNode(),
|
||||
FudgePtr, NULL, 0, MVT::f32,
|
||||
FudgePtr,
|
||||
MachinePointerInfo::getConstantPool(),
|
||||
MVT::f32,
|
||||
false, false, Alignment);
|
||||
return DAG.getNode(ISD::FADD, dl, DstVT, SignedConv, Fudge);
|
||||
}
|
||||
|
|
|
@ -1107,7 +1107,8 @@ SDValue DAGTypeLegalizer::SplitVecOp_EXTRACT_VECTOR_ELT(SDNode *N) {
|
|||
// Load back the required element.
|
||||
StackPtr = GetVectorElementPointer(StackPtr, EltVT, Idx);
|
||||
return DAG.getExtLoad(ISD::EXTLOAD, N->getValueType(0), dl, Store, StackPtr,
|
||||
SV, 0, EltVT, false, false, 0);
|
||||
MachinePointerInfo::getFixedStack(SPFI),
|
||||
EltVT, false, false, 0);
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SplitVecOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
||||
|
@ -2361,11 +2362,9 @@ DAGTypeLegalizer::GenWidenVectorExtLoads(SmallVector<SDValue, 16>& LdChain,
|
|||
// Load information
|
||||
SDValue Chain = LD->getChain();
|
||||
SDValue BasePtr = LD->getBasePtr();
|
||||
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();
|
||||
EVT LdEltVT = LdVT.getVectorElementType();
|
||||
|
@ -2375,16 +2374,17 @@ DAGTypeLegalizer::GenWidenVectorExtLoads(SmallVector<SDValue, 16>& LdChain,
|
|||
unsigned WidenNumElts = WidenVT.getVectorNumElements();
|
||||
SmallVector<SDValue, 16> Ops(WidenNumElts);
|
||||
unsigned Increment = LdEltVT.getSizeInBits() / 8;
|
||||
Ops[0] = DAG.getExtLoad(ExtType, EltVT, dl, Chain, BasePtr, SV, SVOffset,
|
||||
Ops[0] = DAG.getExtLoad(ExtType, EltVT, dl, Chain, BasePtr,
|
||||
LD->getPointerInfo(),
|
||||
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, EltVT, dl, Chain, NewBasePtr, SV,
|
||||
SVOffset + Offset, LdEltVT, isVolatile,
|
||||
isNonTemporal, Align);
|
||||
Ops[i] = DAG.getExtLoad(ExtType, EltVT, dl, Chain, NewBasePtr,
|
||||
LD->getPointerInfo().getWithOffset(Offset), LdEltVT,
|
||||
isVolatile, isNonTemporal, Align);
|
||||
LdChain.push_back(Ops[i].getValue(1));
|
||||
}
|
||||
|
||||
|
|
|
@ -3956,16 +3956,6 @@ SDValue SelectionDAG::getLoad(EVT VT, DebugLoc dl,
|
|||
return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
|
||||
PtrInfo, VT, isVolatile, isNonTemporal, Alignment);
|
||||
}
|
||||
SDValue SelectionDAG::getExtLoad(ISD::LoadExtType ExtType, EVT VT, DebugLoc dl,
|
||||
SDValue Chain, SDValue Ptr,
|
||||
const Value *SV,
|
||||
int SVOffset, EVT MemVT,
|
||||
bool isVolatile, bool isNonTemporal,
|
||||
unsigned Alignment) {
|
||||
SDValue Undef = getUNDEF(Ptr.getValueType());
|
||||
return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef,
|
||||
SV, SVOffset, MemVT, isVolatile, isNonTemporal, Alignment);
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getExtLoad(ISD::LoadExtType ExtType, EVT VT, DebugLoc dl,
|
||||
SDValue Chain, SDValue Ptr,
|
||||
|
|
|
@ -543,7 +543,8 @@ void AlphaTargetLowering::LowerVAARG(SDNode *N, SDValue &Chain,
|
|||
SDValue Tmp = DAG.getNode(ISD::ADD, dl, MVT::i64, VAListP,
|
||||
DAG.getConstant(8, MVT::i64));
|
||||
SDValue Offset = DAG.getExtLoad(ISD::SEXTLOAD, MVT::i64, dl, Base.getValue(1),
|
||||
Tmp, NULL, 0, MVT::i32, false, false, 0);
|
||||
Tmp, MachinePointerInfo(),
|
||||
MVT::i32, false, false, 0);
|
||||
DataPtr = DAG.getNode(ISD::ADD, dl, MVT::i64, Base, Offset);
|
||||
if (N->getValueType(0).isFloatingPoint())
|
||||
{
|
||||
|
@ -708,7 +709,7 @@ SDValue AlphaTargetLowering::LowerOperation(SDValue Op,
|
|||
SDValue Result;
|
||||
if (Op.getValueType() == MVT::i32)
|
||||
Result = DAG.getExtLoad(ISD::SEXTLOAD, MVT::i64, dl, Chain, DataPtr,
|
||||
NULL, 0, MVT::i32, false, false, 0);
|
||||
MachinePointerInfo(), MVT::i32, false, false, 0);
|
||||
else
|
||||
Result = DAG.getLoad(Op.getValueType(), dl, Chain, DataPtr,
|
||||
MachinePointerInfo(),
|
||||
|
@ -730,7 +731,7 @@ SDValue AlphaTargetLowering::LowerOperation(SDValue Op,
|
|||
SDValue NP = DAG.getNode(ISD::ADD, dl, MVT::i64, SrcP,
|
||||
DAG.getConstant(8, MVT::i64));
|
||||
Val = DAG.getExtLoad(ISD::SEXTLOAD, MVT::i64, dl, Result,
|
||||
NP, NULL,0, MVT::i32, false, false, 0);
|
||||
NP, MachinePointerInfo(), MVT::i32, false, false, 0);
|
||||
SDValue NPD = DAG.getNode(ISD::ADD, dl, MVT::i64, DestP,
|
||||
DAG.getConstant(8, MVT::i64));
|
||||
return DAG.getTruncStore(Val.getValue(1), dl, Val, NPD, NULL, 0, MVT::i32,
|
||||
|
|
|
@ -3069,7 +3069,8 @@ PPCTargetLowering::LowerCall_Darwin(SDValue Chain, SDValue Callee,
|
|||
EVT VT = (Size==1) ? MVT::i8 : MVT::i16;
|
||||
if (GPR_idx != NumGPRs) {
|
||||
SDValue Load = DAG.getExtLoad(ISD::EXTLOAD, PtrVT, dl, Chain, Arg,
|
||||
NULL, 0, VT, false, false, 0);
|
||||
MachinePointerInfo(), VT,
|
||||
false, false, 0);
|
||||
MemOpChains.push_back(Load.getValue(1));
|
||||
RegsToPass.push_back(std::make_pair(GPR[GPR_idx++], Load));
|
||||
|
||||
|
|
|
@ -148,7 +148,7 @@ SparcTargetLowering::LowerFormalArguments(SDValue Chain,
|
|||
FIPtr = DAG.getNode(ISD::ADD, dl, MVT::i32, FIPtr,
|
||||
DAG.getConstant(Offset, MVT::i32));
|
||||
Load = DAG.getExtLoad(LoadOp, MVT::i32, dl, Chain, FIPtr,
|
||||
NULL, 0, ObjectVT, false, false, 0);
|
||||
MachinePointerInfo(), ObjectVT, false, false,0);
|
||||
Load = DAG.getNode(ISD::TRUNCATE, dl, ObjectVT, Load);
|
||||
}
|
||||
InVals.push_back(Load);
|
||||
|
|
|
@ -511,10 +511,11 @@ void X86DAGToDAGISel::PreprocessISelDAG() {
|
|||
// FIXME: optimize the case where the src/dest is a load or store?
|
||||
SDValue Store = CurDAG->getTruncStore(CurDAG->getEntryNode(), dl,
|
||||
N->getOperand(0),
|
||||
MemTmp, NULL, 0, MemVT,
|
||||
MemTmp, MachinePointerInfo(), MemVT,
|
||||
false, false, 0);
|
||||
SDValue Result = CurDAG->getExtLoad(ISD::EXTLOAD, DstVT, dl, Store, MemTmp,
|
||||
NULL, 0, MemVT, false, false, 0);
|
||||
MachinePointerInfo(),
|
||||
MemVT, false, false, 0);
|
||||
|
||||
// We're about to replace all uses of the FP_ROUND/FP_EXTEND with the
|
||||
// extload we created. This will cause general havok on the dag because
|
||||
|
|
|
@ -392,24 +392,23 @@ IsWordAlignedBasePlusConstantOffset(SDValue Addr, SDValue &AlignedBase,
|
|||
}
|
||||
|
||||
SDValue XCoreTargetLowering::
|
||||
LowerLOAD(SDValue Op, SelectionDAG &DAG) const
|
||||
{
|
||||
LowerLOAD(SDValue Op, SelectionDAG &DAG) const {
|
||||
LoadSDNode *LD = cast<LoadSDNode>(Op);
|
||||
assert(LD->getExtensionType() == ISD::NON_EXTLOAD &&
|
||||
"Unexpected extension type");
|
||||
assert(LD->getMemoryVT() == MVT::i32 && "Unexpected load EVT");
|
||||
if (allowsUnalignedMemoryAccesses(LD->getMemoryVT())) {
|
||||
if (allowsUnalignedMemoryAccesses(LD->getMemoryVT()))
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
unsigned ABIAlignment = getTargetData()->
|
||||
getABITypeAlignment(LD->getMemoryVT().getTypeForEVT(*DAG.getContext()));
|
||||
// Leave aligned load alone.
|
||||
if (LD->getAlignment() >= ABIAlignment) {
|
||||
if (LD->getAlignment() >= ABIAlignment)
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
SDValue Chain = LD->getChain();
|
||||
SDValue BasePtr = LD->getBasePtr();
|
||||
DebugLoc dl = Op.getDebugLoc();
|
||||
DebugLoc DL = Op.getDebugLoc();
|
||||
|
||||
SDValue Base;
|
||||
int64_t Offset;
|
||||
|
@ -419,7 +418,7 @@ LowerLOAD(SDValue Op, SelectionDAG &DAG) const
|
|||
// We've managed to infer better alignment information than the load
|
||||
// already has. Use an aligned load.
|
||||
//
|
||||
return DAG.getLoad(getPointerTy(), dl, Chain, BasePtr,
|
||||
return DAG.getLoad(getPointerTy(), DL, Chain, BasePtr,
|
||||
MachinePointerInfo(),
|
||||
false, false, 0);
|
||||
}
|
||||
|
@ -434,40 +433,40 @@ LowerLOAD(SDValue Op, SelectionDAG &DAG) const
|
|||
SDValue LowShift = DAG.getConstant((Offset & 0x3) * 8, MVT::i32);
|
||||
SDValue HighShift = DAG.getConstant(32 - (Offset & 0x3) * 8, MVT::i32);
|
||||
|
||||
SDValue LowAddr = DAG.getNode(ISD::ADD, dl, MVT::i32, Base, LowOffset);
|
||||
SDValue HighAddr = DAG.getNode(ISD::ADD, dl, MVT::i32, Base, HighOffset);
|
||||
SDValue LowAddr = DAG.getNode(ISD::ADD, DL, MVT::i32, Base, LowOffset);
|
||||
SDValue HighAddr = DAG.getNode(ISD::ADD, DL, MVT::i32, Base, HighOffset);
|
||||
|
||||
SDValue Low = DAG.getLoad(getPointerTy(), dl, Chain,
|
||||
SDValue Low = DAG.getLoad(getPointerTy(), DL, Chain,
|
||||
LowAddr, MachinePointerInfo(), false, false, 0);
|
||||
SDValue High = DAG.getLoad(getPointerTy(), dl, Chain,
|
||||
SDValue High = DAG.getLoad(getPointerTy(), DL, Chain,
|
||||
HighAddr, MachinePointerInfo(), false, false, 0);
|
||||
SDValue LowShifted = DAG.getNode(ISD::SRL, dl, MVT::i32, Low, LowShift);
|
||||
SDValue HighShifted = DAG.getNode(ISD::SHL, dl, MVT::i32, High, HighShift);
|
||||
SDValue Result = DAG.getNode(ISD::OR, dl, MVT::i32, LowShifted, HighShifted);
|
||||
Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Low.getValue(1),
|
||||
SDValue LowShifted = DAG.getNode(ISD::SRL, DL, MVT::i32, Low, LowShift);
|
||||
SDValue HighShifted = DAG.getNode(ISD::SHL, DL, MVT::i32, High, HighShift);
|
||||
SDValue Result = DAG.getNode(ISD::OR, DL, MVT::i32, LowShifted, HighShifted);
|
||||
Chain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, Low.getValue(1),
|
||||
High.getValue(1));
|
||||
SDValue Ops[] = { Result, Chain };
|
||||
return DAG.getMergeValues(Ops, 2, dl);
|
||||
return DAG.getMergeValues(Ops, 2, DL);
|
||||
}
|
||||
|
||||
if (LD->getAlignment() == 2) {
|
||||
int SVOffset = LD->getSrcValueOffset();
|
||||
SDValue Low = DAG.getExtLoad(ISD::ZEXTLOAD, MVT::i32, dl, Chain,
|
||||
BasePtr, LD->getSrcValue(), SVOffset, MVT::i16,
|
||||
SDValue Low = DAG.getExtLoad(ISD::ZEXTLOAD, MVT::i32, DL, Chain,
|
||||
BasePtr, LD->getPointerInfo(), MVT::i16,
|
||||
LD->isVolatile(), LD->isNonTemporal(), 2);
|
||||
SDValue HighAddr = DAG.getNode(ISD::ADD, dl, MVT::i32, BasePtr,
|
||||
SDValue HighAddr = DAG.getNode(ISD::ADD, DL, MVT::i32, BasePtr,
|
||||
DAG.getConstant(2, MVT::i32));
|
||||
SDValue High = DAG.getExtLoad(ISD::EXTLOAD, MVT::i32, dl, Chain,
|
||||
HighAddr, LD->getSrcValue(), SVOffset + 2,
|
||||
SDValue High = DAG.getExtLoad(ISD::EXTLOAD, MVT::i32, DL, Chain,
|
||||
HighAddr,
|
||||
LD->getPointerInfo().getWithOffset(2),
|
||||
MVT::i16, LD->isVolatile(),
|
||||
LD->isNonTemporal(), 2);
|
||||
SDValue HighShifted = DAG.getNode(ISD::SHL, dl, MVT::i32, High,
|
||||
SDValue HighShifted = DAG.getNode(ISD::SHL, DL, MVT::i32, High,
|
||||
DAG.getConstant(16, MVT::i32));
|
||||
SDValue Result = DAG.getNode(ISD::OR, dl, MVT::i32, Low, HighShifted);
|
||||
Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Low.getValue(1),
|
||||
SDValue Result = DAG.getNode(ISD::OR, DL, MVT::i32, Low, HighShifted);
|
||||
Chain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, Low.getValue(1),
|
||||
High.getValue(1));
|
||||
SDValue Ops[] = { Result, Chain };
|
||||
return DAG.getMergeValues(Ops, 2, dl);
|
||||
return DAG.getMergeValues(Ops, 2, DL);
|
||||
}
|
||||
|
||||
// Lower to a call to __misaligned_load(BasePtr).
|
||||
|
@ -484,12 +483,12 @@ LowerLOAD(SDValue Op, SelectionDAG &DAG) const
|
|||
false, false, 0, CallingConv::C, false,
|
||||
/*isReturnValueUsed=*/true,
|
||||
DAG.getExternalSymbol("__misaligned_load", getPointerTy()),
|
||||
Args, DAG, dl);
|
||||
Args, DAG, DL);
|
||||
|
||||
SDValue Ops[] =
|
||||
{ CallResult.first, CallResult.second };
|
||||
|
||||
return DAG.getMergeValues(Ops, 2, dl);
|
||||
return DAG.getMergeValues(Ops, 2, DL);
|
||||
}
|
||||
|
||||
SDValue XCoreTargetLowering::
|
||||
|
|
Loading…
Reference in New Issue