mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
eliminate an old SelectionDAG::getTruncStore method, propagating
MachinePointerInfo around more. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114452 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5cd9391a08
commit
da2d8e1032
@ -662,10 +662,6 @@ public:
|
||||
MachinePointerInfo PtrInfo, EVT TVT,
|
||||
bool isNonTemporal, bool isVolatile,
|
||||
unsigned Alignment);
|
||||
SDValue getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
|
||||
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,
|
||||
|
@ -5969,8 +5969,7 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
|
||||
if (unsigned Align = DAG.InferPtrAlignment(Ptr)) {
|
||||
if (Align > ST->getAlignment())
|
||||
return DAG.getTruncStore(Chain, N->getDebugLoc(), Value,
|
||||
Ptr, ST->getSrcValue(),
|
||||
ST->getSrcValueOffset(), ST->getMemoryVT(),
|
||||
Ptr, ST->getPointerInfo(), ST->getMemoryVT(),
|
||||
ST->isVolatile(), ST->isNonTemporal(), Align);
|
||||
}
|
||||
}
|
||||
@ -5986,7 +5985,7 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
|
||||
// Replace the chain to avoid dependency.
|
||||
if (ST->isTruncatingStore()) {
|
||||
ReplStore = DAG.getTruncStore(BetterChain, N->getDebugLoc(), Value, Ptr,
|
||||
ST->getSrcValue(),ST->getSrcValueOffset(),
|
||||
ST->getPointerInfo(),
|
||||
ST->getMemoryVT(), ST->isVolatile(),
|
||||
ST->isNonTemporal(), ST->getAlignment());
|
||||
} else {
|
||||
@ -6025,8 +6024,7 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
|
||||
AddToWorkList(Value.getNode());
|
||||
if (Shorter.getNode())
|
||||
return DAG.getTruncStore(Chain, N->getDebugLoc(), Shorter,
|
||||
Ptr, ST->getSrcValue(),
|
||||
ST->getSrcValueOffset(), ST->getMemoryVT(),
|
||||
Ptr, ST->getPointerInfo(), ST->getMemoryVT(),
|
||||
ST->isVolatile(), ST->isNonTemporal(),
|
||||
ST->getAlignment());
|
||||
|
||||
@ -6059,8 +6057,7 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
|
||||
TLI.isTruncStoreLegal(Value.getOperand(0).getValueType(),
|
||||
ST->getMemoryVT())) {
|
||||
return DAG.getTruncStore(Chain, N->getDebugLoc(), Value.getOperand(0),
|
||||
Ptr, ST->getSrcValue(),
|
||||
ST->getSrcValueOffset(), ST->getMemoryVT(),
|
||||
Ptr, ST->getPointerInfo(), ST->getMemoryVT(),
|
||||
ST->isVolatile(), ST->isNonTemporal(),
|
||||
ST->getAlignment());
|
||||
}
|
||||
|
@ -395,7 +395,6 @@ SDValue ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG,
|
||||
SDValue Val = ST->getValue();
|
||||
EVT VT = Val.getValueType();
|
||||
int Alignment = ST->getAlignment();
|
||||
int SVOffset = ST->getSrcValueOffset();
|
||||
DebugLoc dl = ST->getDebugLoc();
|
||||
if (ST->getMemoryVT().isFloatingPoint() ||
|
||||
ST->getMemoryVT().isVector()) {
|
||||
@ -405,9 +404,8 @@ SDValue ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG,
|
||||
// same size, then a (misaligned) int store.
|
||||
// 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(), ST->isNonTemporal(),
|
||||
Alignment);
|
||||
return DAG.getStore(Chain, dl, Result, Ptr, ST->getPointerInfo(),
|
||||
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.
|
||||
@ -487,13 +485,13 @@ SDValue ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG,
|
||||
// Store the two parts
|
||||
SDValue Store1, Store2;
|
||||
Store1 = DAG.getTruncStore(Chain, dl, TLI.isLittleEndian()?Lo:Hi, Ptr,
|
||||
ST->getSrcValue(), SVOffset, NewStoredVT,
|
||||
ST->getPointerInfo(), NewStoredVT,
|
||||
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,
|
||||
ST->getPointerInfo().getWithOffset(IncrementSize),
|
||||
NewStoredVT, ST->isVolatile(), ST->isNonTemporal(),
|
||||
Alignment);
|
||||
|
||||
@ -722,7 +720,6 @@ SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) {
|
||||
SDValue Tmp1 = ST->getChain();
|
||||
SDValue Tmp2 = ST->getBasePtr();
|
||||
SDValue Tmp3;
|
||||
int SVOffset = ST->getSrcValueOffset();
|
||||
unsigned Alignment = ST->getAlignment();
|
||||
bool isVolatile = ST->isVolatile();
|
||||
bool isNonTemporal = ST->isNonTemporal();
|
||||
@ -733,16 +730,20 @@ SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) {
|
||||
Tmp3 = DAG.getConstant(CFP->getValueAPF().
|
||||
bitcastToAPInt().zextOrTrunc(32),
|
||||
MVT::i32);
|
||||
return DAG.getStore(Tmp1, dl, Tmp3, Tmp2, ST->getSrcValue(),
|
||||
SVOffset, isVolatile, isNonTemporal, Alignment);
|
||||
} else if (CFP->getValueType(0) == MVT::f64) {
|
||||
return DAG.getStore(Tmp1, dl, Tmp3, Tmp2, ST->getPointerInfo(),
|
||||
isVolatile, isNonTemporal, Alignment);
|
||||
}
|
||||
|
||||
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, isNonTemporal, Alignment);
|
||||
} else if (getTypeAction(MVT::i32) == Legal && !ST->isVolatile()) {
|
||||
return DAG.getStore(Tmp1, dl, Tmp3, Tmp2, ST->getPointerInfo(),
|
||||
isVolatile, isNonTemporal, Alignment);
|
||||
}
|
||||
|
||||
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
|
||||
// xform is certainly not worth it.
|
||||
@ -751,11 +752,12 @@ SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) {
|
||||
SDValue Hi = DAG.getConstant(IntVal.lshr(32).trunc(32), MVT::i32);
|
||||
if (TLI.isBigEndian()) std::swap(Lo, Hi);
|
||||
|
||||
Lo = DAG.getStore(Tmp1, dl, Lo, Tmp2, ST->getSrcValue(),
|
||||
SVOffset, isVolatile, isNonTemporal, Alignment);
|
||||
Lo = DAG.getStore(Tmp1, dl, Lo, Tmp2, ST->getPointerInfo(), 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,
|
||||
Hi = DAG.getStore(Tmp1, dl, Hi, Tmp2,
|
||||
ST->getPointerInfo().getWithOffset(4),
|
||||
isVolatile, isNonTemporal, MinAlign(Alignment, 4U));
|
||||
|
||||
return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
|
||||
@ -1370,7 +1372,6 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
||||
StoreSDNode *ST = cast<StoreSDNode>(Node);
|
||||
Tmp1 = LegalizeOp(ST->getChain()); // Legalize the chain.
|
||||
Tmp2 = LegalizeOp(ST->getBasePtr()); // Legalize the pointer.
|
||||
int SVOffset = ST->getSrcValueOffset();
|
||||
unsigned Alignment = ST->getAlignment();
|
||||
bool isVolatile = ST->isVolatile();
|
||||
bool isNonTemporal = ST->isNonTemporal();
|
||||
@ -1411,7 +1412,7 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
||||
Tmp3 = DAG.getNode(ISD::BIT_CONVERT, dl,
|
||||
TLI.getTypeToPromoteTo(ISD::STORE, VT), Tmp3);
|
||||
Result = DAG.getStore(Tmp1, dl, Tmp3, Tmp2,
|
||||
ST->getSrcValue(), SVOffset, isVolatile,
|
||||
ST->getPointerInfo(), isVolatile,
|
||||
isNonTemporal, Alignment);
|
||||
break;
|
||||
}
|
||||
@ -1430,9 +1431,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, isNonTemporal,
|
||||
Alignment);
|
||||
Result = DAG.getTruncStore(Tmp1, dl, Tmp3, Tmp2, ST->getPointerInfo(),
|
||||
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!");
|
||||
@ -1450,8 +1450,8 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
||||
if (TLI.isLittleEndian()) {
|
||||
// TRUNCSTORE:i24 X -> TRUNCSTORE:i16 X, TRUNCSTORE@+2:i8 (srl X, 16)
|
||||
// Store the bottom RoundWidth bits.
|
||||
Lo = DAG.getTruncStore(Tmp1, dl, Tmp3, Tmp2, ST->getSrcValue(),
|
||||
SVOffset, RoundVT,
|
||||
Lo = DAG.getTruncStore(Tmp1, dl, Tmp3, Tmp2, ST->getPointerInfo(),
|
||||
RoundVT,
|
||||
isVolatile, isNonTemporal, Alignment);
|
||||
|
||||
// Store the remaining ExtraWidth bits.
|
||||
@ -1460,9 +1460,9 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
||||
DAG.getIntPtrConstant(IncrementSize));
|
||||
Hi = DAG.getNode(ISD::SRL, dl, Tmp3.getValueType(), Tmp3,
|
||||
DAG.getConstant(RoundWidth, TLI.getShiftAmountTy()));
|
||||
Hi = DAG.getTruncStore(Tmp1, dl, Hi, Tmp2, ST->getSrcValue(),
|
||||
SVOffset + IncrementSize, ExtraVT, isVolatile,
|
||||
isNonTemporal,
|
||||
Hi = DAG.getTruncStore(Tmp1, dl, Hi, Tmp2,
|
||||
ST->getPointerInfo().getWithOffset(IncrementSize),
|
||||
ExtraVT, isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
} else {
|
||||
// Big endian - avoid unaligned stores.
|
||||
@ -1470,17 +1470,16 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
||||
// Store the top RoundWidth bits.
|
||||
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, isNonTemporal,
|
||||
Alignment);
|
||||
Hi = DAG.getTruncStore(Tmp1, dl, Hi, Tmp2, ST->getPointerInfo(),
|
||||
RoundVT, isVolatile, isNonTemporal, Alignment);
|
||||
|
||||
// Store the remaining ExtraWidth bits.
|
||||
IncrementSize = RoundWidth / 8;
|
||||
Tmp2 = DAG.getNode(ISD::ADD, dl, Tmp2.getValueType(), Tmp2,
|
||||
DAG.getIntPtrConstant(IncrementSize));
|
||||
Lo = DAG.getTruncStore(Tmp1, dl, Tmp3, Tmp2, ST->getSrcValue(),
|
||||
SVOffset + IncrementSize, ExtraVT, isVolatile,
|
||||
isNonTemporal,
|
||||
Lo = DAG.getTruncStore(Tmp1, dl, Tmp3, Tmp2,
|
||||
ST->getPointerInfo().getWithOffset(IncrementSize),
|
||||
ExtraVT, isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
}
|
||||
|
||||
@ -1514,9 +1513,8 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
||||
// TRUNCSTORE:i16 i32 -> STORE i16
|
||||
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, isNonTemporal,
|
||||
Alignment);
|
||||
Result = DAG.getStore(Tmp1, dl, Tmp3, Tmp2, ST->getPointerInfo(),
|
||||
isVolatile, isNonTemporal, Alignment);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1772,7 +1770,7 @@ SDValue SelectionDAGLegalize::EmitStackConvert(SDValue SrcOp,
|
||||
|
||||
FrameIndexSDNode *StackPtrFI = cast<FrameIndexSDNode>(FIPtr);
|
||||
int SPFI = StackPtrFI->getIndex();
|
||||
const Value *SV = PseudoSourceValue::getFixedStack(SPFI);
|
||||
MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(SPFI);
|
||||
|
||||
unsigned SrcSize = SrcOp.getValueType().getSizeInBits();
|
||||
unsigned SlotSize = SlotVT.getSizeInBits();
|
||||
@ -1786,22 +1784,21 @@ SDValue SelectionDAGLegalize::EmitStackConvert(SDValue SrcOp,
|
||||
|
||||
if (SrcSize > SlotSize)
|
||||
Store = DAG.getTruncStore(DAG.getEntryNode(), dl, SrcOp, FIPtr,
|
||||
SV, 0, SlotVT, false, false, SrcAlign);
|
||||
PtrInfo, SlotVT, false, false, SrcAlign);
|
||||
else {
|
||||
assert(SrcSize == SlotSize && "Invalid store");
|
||||
Store = DAG.getStore(DAG.getEntryNode(), dl, SrcOp, FIPtr,
|
||||
SV, 0, false, false, SrcAlign);
|
||||
PtrInfo, false, false, SrcAlign);
|
||||
}
|
||||
|
||||
// Result is a load from the stack slot.
|
||||
if (SlotSize == DestSize)
|
||||
return DAG.getLoad(DestVT, dl, Store, FIPtr, MachinePointerInfo(SV),
|
||||
return DAG.getLoad(DestVT, dl, Store, FIPtr, PtrInfo,
|
||||
false, false, DestAlign);
|
||||
|
||||
assert(SlotSize < DestSize && "Unknown extension!");
|
||||
return DAG.getExtLoad(ISD::EXTLOAD, DestVT, dl, Store, FIPtr,
|
||||
MachinePointerInfo(SV), SlotVT,
|
||||
false, false, DestAlign);
|
||||
PtrInfo, SlotVT, false, false, DestAlign);
|
||||
}
|
||||
|
||||
SDValue SelectionDAGLegalize::ExpandSCALAR_TO_VECTOR(SDNode *Node) {
|
||||
|
@ -1419,7 +1419,7 @@ SDValue DAGTypeLegalizer::ExpandFloatOp_STORE(SDNode *N, unsigned OpNo) {
|
||||
GetExpandedOp(ST->getValue(), Lo, Hi);
|
||||
|
||||
return DAG.getTruncStore(Chain, N->getDebugLoc(), Hi, Ptr,
|
||||
ST->getSrcValue(), ST->getSrcValueOffset(),
|
||||
ST->getPointerInfo(),
|
||||
ST->getMemoryVT(), ST->isVolatile(),
|
||||
ST->isNonTemporal(), ST->getAlignment());
|
||||
}
|
||||
|
@ -365,14 +365,13 @@ SDValue DAGTypeLegalizer::ScalarizeVecOp_STORE(StoreSDNode *N, unsigned OpNo){
|
||||
if (N->isTruncatingStore())
|
||||
return DAG.getTruncStore(N->getChain(), dl,
|
||||
GetScalarizedVector(N->getOperand(1)),
|
||||
N->getBasePtr(),
|
||||
N->getSrcValue(), N->getSrcValueOffset(),
|
||||
N->getBasePtr(), N->getPointerInfo(),
|
||||
N->getMemoryVT().getVectorElementType(),
|
||||
N->isVolatile(), N->isNonTemporal(),
|
||||
N->getAlignment());
|
||||
|
||||
return DAG.getStore(N->getChain(), dl, GetScalarizedVector(N->getOperand(1)),
|
||||
N->getBasePtr(), N->getSrcValue(), N->getSrcValueOffset(),
|
||||
N->getBasePtr(), N->getPointerInfo(),
|
||||
N->isVolatile(), N->isNonTemporal(),
|
||||
N->getOriginalAlignment());
|
||||
}
|
||||
@ -1118,7 +1117,6 @@ SDValue DAGTypeLegalizer::SplitVecOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
||||
bool isTruncating = N->isTruncatingStore();
|
||||
SDValue Ch = N->getChain();
|
||||
SDValue Ptr = N->getBasePtr();
|
||||
int SVOffset = N->getSrcValueOffset();
|
||||
EVT MemoryVT = N->getMemoryVT();
|
||||
unsigned Alignment = N->getOriginalAlignment();
|
||||
bool isVol = N->isVolatile();
|
||||
@ -1132,22 +1130,23 @@ SDValue DAGTypeLegalizer::SplitVecOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
||||
unsigned IncrementSize = LoMemVT.getSizeInBits()/8;
|
||||
|
||||
if (isTruncating)
|
||||
Lo = DAG.getTruncStore(Ch, DL, Lo, Ptr, N->getSrcValue(), SVOffset,
|
||||
Lo = DAG.getTruncStore(Ch, DL, Lo, Ptr, N->getPointerInfo(),
|
||||
LoMemVT, isVol, isNT, Alignment);
|
||||
else
|
||||
Lo = DAG.getStore(Ch, DL, Lo, Ptr, N->getSrcValue(), SVOffset,
|
||||
Lo = DAG.getStore(Ch, DL, Lo, Ptr, N->getPointerInfo(),
|
||||
isVol, isNT, Alignment);
|
||||
|
||||
// Increment the pointer to the other half.
|
||||
Ptr = DAG.getNode(ISD::ADD, DL, Ptr.getValueType(), Ptr,
|
||||
DAG.getIntPtrConstant(IncrementSize));
|
||||
SVOffset += IncrementSize;
|
||||
|
||||
if (isTruncating)
|
||||
Hi = DAG.getTruncStore(Ch, DL, Hi, Ptr, N->getSrcValue(), SVOffset,
|
||||
Hi = DAG.getTruncStore(Ch, DL, Hi, Ptr,
|
||||
N->getPointerInfo().getWithOffset(IncrementSize),
|
||||
HiMemVT, isVol, isNT, Alignment);
|
||||
else
|
||||
Hi = DAG.getStore(Ch, DL, Hi, Ptr, N->getSrcValue(), SVOffset,
|
||||
Hi = DAG.getStore(Ch, DL, Hi, Ptr,
|
||||
N->getPointerInfo().getWithOffset(IncrementSize),
|
||||
isVol, isNT, Alignment);
|
||||
|
||||
return DAG.getNode(ISD::TokenFactor, DL, MVT::Other, Lo, Hi);
|
||||
@ -2403,8 +2402,6 @@ void DAGTypeLegalizer::GenWidenVectorStores(SmallVector<SDValue, 16>& StChain,
|
||||
// element type or scalar stores.
|
||||
SDValue Chain = ST->getChain();
|
||||
SDValue BasePtr = ST->getBasePtr();
|
||||
const Value *SV = ST->getSrcValue();
|
||||
int SVOffset = ST->getSrcValueOffset();
|
||||
unsigned Align = ST->getAlignment();
|
||||
bool isVolatile = ST->isVolatile();
|
||||
bool isNonTemporal = ST->isNonTemporal();
|
||||
@ -2431,9 +2428,9 @@ void DAGTypeLegalizer::GenWidenVectorStores(SmallVector<SDValue, 16>& StChain,
|
||||
do {
|
||||
SDValue EOp = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, NewVT, ValOp,
|
||||
DAG.getIntPtrConstant(Idx));
|
||||
StChain.push_back(DAG.getStore(Chain, dl, EOp, BasePtr, SV,
|
||||
SVOffset + Offset, isVolatile,
|
||||
isNonTemporal,
|
||||
StChain.push_back(DAG.getStore(Chain, dl, EOp, BasePtr,
|
||||
ST->getPointerInfo().getWithOffset(Offset),
|
||||
isVolatile, isNonTemporal,
|
||||
MinAlign(Align, Offset)));
|
||||
StWidth -= NewVTWidth;
|
||||
Offset += Increment;
|
||||
@ -2451,9 +2448,10 @@ void DAGTypeLegalizer::GenWidenVectorStores(SmallVector<SDValue, 16>& StChain,
|
||||
do {
|
||||
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,
|
||||
isNonTemporal, MinAlign(Align, Offset)));
|
||||
StChain.push_back(DAG.getStore(Chain, dl, EOp, BasePtr,
|
||||
ST->getPointerInfo().getWithOffset(Offset),
|
||||
isVolatile, isNonTemporal,
|
||||
MinAlign(Align, Offset)));
|
||||
StWidth -= NewVTWidth;
|
||||
Offset += Increment;
|
||||
BasePtr = DAG.getNode(ISD::ADD, dl, BasePtr.getValueType(), BasePtr,
|
||||
@ -2472,8 +2470,6 @@ DAGTypeLegalizer::GenWidenVectorTruncStores(SmallVector<SDValue, 16>& StChain,
|
||||
// and then store it. Instead, we extract each element and then store it.
|
||||
SDValue Chain = ST->getChain();
|
||||
SDValue BasePtr = ST->getBasePtr();
|
||||
const Value *SV = ST->getSrcValue();
|
||||
int SVOffset = ST->getSrcValueOffset();
|
||||
unsigned Align = ST->getAlignment();
|
||||
bool isVolatile = ST->isVolatile();
|
||||
bool isNonTemporal = ST->isNonTemporal();
|
||||
@ -2497,8 +2493,8 @@ DAGTypeLegalizer::GenWidenVectorTruncStores(SmallVector<SDValue, 16>& StChain,
|
||||
unsigned NumElts = StVT.getVectorNumElements();
|
||||
SDValue EOp = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, ValEltVT, ValOp,
|
||||
DAG.getIntPtrConstant(0));
|
||||
StChain.push_back(DAG.getTruncStore(Chain, dl, EOp, BasePtr, SV,
|
||||
SVOffset, StEltVT,
|
||||
StChain.push_back(DAG.getTruncStore(Chain, dl, EOp, BasePtr,
|
||||
ST->getPointerInfo(), StEltVT,
|
||||
isVolatile, isNonTemporal, Align));
|
||||
unsigned Offset = Increment;
|
||||
for (unsigned i=1; i < NumElts; ++i, Offset += Increment) {
|
||||
@ -2506,9 +2502,9 @@ DAGTypeLegalizer::GenWidenVectorTruncStores(SmallVector<SDValue, 16>& StChain,
|
||||
BasePtr, DAG.getIntPtrConstant(Offset));
|
||||
SDValue EOp = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, ValEltVT, ValOp,
|
||||
DAG.getIntPtrConstant(0));
|
||||
StChain.push_back(DAG.getTruncStore(Chain, dl, EOp, NewBasePtr, SV,
|
||||
SVOffset + Offset, StEltVT,
|
||||
isVolatile, isNonTemporal,
|
||||
StChain.push_back(DAG.getTruncStore(Chain, dl, EOp, NewBasePtr,
|
||||
ST->getPointerInfo().getWithOffset(Offset),
|
||||
StEltVT, isVolatile, isNonTemporal,
|
||||
MinAlign(Align, Offset)));
|
||||
}
|
||||
}
|
||||
|
@ -4052,16 +4052,6 @@ SDValue SelectionDAG::getStore(SDValue Chain, DebugLoc dl, SDValue Val,
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val,
|
||||
SDValue Ptr, const Value *SV,
|
||||
int SVOffset, EVT SVT,
|
||||
bool isVolatile, bool isNonTemporal,
|
||||
unsigned Alignment) {
|
||||
|
||||
return getTruncStore(Chain, dl, Val, Ptr, MachinePointerInfo(SV, SVOffset),
|
||||
SVT, isVolatile, isNonTemporal, Alignment);
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val,
|
||||
SDValue Ptr, MachinePointerInfo PtrInfo,
|
||||
EVT SVT,bool isVolatile, bool isNonTemporal,
|
||||
|
@ -558,7 +558,8 @@ void AlphaTargetLowering::LowerVAARG(SDNode *N, SDValue &Chain,
|
||||
|
||||
SDValue NewOffset = DAG.getNode(ISD::ADD, dl, MVT::i64, Offset,
|
||||
DAG.getConstant(8, MVT::i64));
|
||||
Chain = DAG.getTruncStore(Offset.getValue(1), dl, NewOffset, Tmp, NULL, 0,
|
||||
Chain = DAG.getTruncStore(Offset.getValue(1), dl, NewOffset, Tmp,
|
||||
MachinePointerInfo(),
|
||||
MVT::i32, false, false, 0);
|
||||
}
|
||||
|
||||
@ -734,7 +735,8 @@ SDValue AlphaTargetLowering::LowerOperation(SDValue Op,
|
||||
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,
|
||||
return DAG.getTruncStore(Val.getValue(1), dl, Val, NPD,
|
||||
MachinePointerInfo(), MVT::i32,
|
||||
false, false, 0);
|
||||
}
|
||||
case ISD::VASTART: {
|
||||
@ -754,7 +756,8 @@ SDValue AlphaTargetLowering::LowerOperation(SDValue Op,
|
||||
return DAG.getTruncStore(S1, dl,
|
||||
DAG.getConstant(FuncInfo->getVarArgsOffset(),
|
||||
MVT::i64),
|
||||
SA2, NULL, 0, MVT::i32, false, false, 0);
|
||||
SA2, MachinePointerInfo(),
|
||||
MVT::i32, false, false, 0);
|
||||
}
|
||||
case ISD::RETURNADDR:
|
||||
return DAG.getNode(AlphaISD::GlobalRetAddr, DebugLoc(), MVT::i64);
|
||||
|
@ -1406,15 +1406,17 @@ SDValue PPCTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG,
|
||||
|
||||
// Store first byte : number of int regs
|
||||
SDValue firstStore = DAG.getTruncStore(Op.getOperand(0), dl, ArgGPR,
|
||||
Op.getOperand(1), SV, 0, MVT::i8,
|
||||
false, false, 0);
|
||||
Op.getOperand(1),
|
||||
MachinePointerInfo(SV),
|
||||
MVT::i8, false, false, 0);
|
||||
uint64_t nextOffset = FPROffset;
|
||||
SDValue nextPtr = DAG.getNode(ISD::ADD, dl, PtrVT, Op.getOperand(1),
|
||||
ConstFPROffset);
|
||||
|
||||
// Store second byte : number of float regs
|
||||
SDValue secondStore =
|
||||
DAG.getTruncStore(firstStore, dl, ArgFPR, nextPtr, SV, nextOffset, MVT::i8,
|
||||
DAG.getTruncStore(firstStore, dl, ArgFPR, nextPtr,
|
||||
MachinePointerInfo(SV, nextOffset), MVT::i8,
|
||||
false, false, 0);
|
||||
nextOffset += StackOffset;
|
||||
nextPtr = DAG.getNode(ISD::ADD, dl, PtrVT, nextPtr, ConstStackOffset);
|
||||
@ -1919,7 +1921,7 @@ PPCTargetLowering::LowerFormalArguments_Darwin(
|
||||
unsigned VReg = MF.addLiveIn(GPR[GPR_idx], &PPC::GPRCRegClass);
|
||||
SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, PtrVT);
|
||||
SDValue Store = DAG.getTruncStore(Val.getValue(1), dl, Val, FIN,
|
||||
NULL, 0,
|
||||
MachinePointerInfo(),
|
||||
ObjSize==1 ? MVT::i8 : MVT::i16,
|
||||
false, false, 0);
|
||||
MemOps.push_back(Store);
|
||||
|
@ -512,18 +512,17 @@ LowerSTORE(SDValue Op, SelectionDAG &DAG) const
|
||||
DebugLoc dl = Op.getDebugLoc();
|
||||
|
||||
if (ST->getAlignment() == 2) {
|
||||
int SVOffset = ST->getSrcValueOffset();
|
||||
SDValue Low = Value;
|
||||
SDValue High = DAG.getNode(ISD::SRL, dl, MVT::i32, Value,
|
||||
DAG.getConstant(16, MVT::i32));
|
||||
SDValue StoreLow = DAG.getTruncStore(Chain, dl, Low, BasePtr,
|
||||
ST->getSrcValue(), SVOffset, MVT::i16,
|
||||
ST->getPointerInfo(), MVT::i16,
|
||||
ST->isVolatile(), ST->isNonTemporal(),
|
||||
2);
|
||||
SDValue HighAddr = DAG.getNode(ISD::ADD, dl, MVT::i32, BasePtr,
|
||||
DAG.getConstant(2, MVT::i32));
|
||||
SDValue StoreHigh = DAG.getTruncStore(Chain, dl, High, HighAddr,
|
||||
ST->getSrcValue(), SVOffset + 2,
|
||||
ST->getPointerInfo().getWithOffset(2),
|
||||
MVT::i16, ST->isVolatile(),
|
||||
ST->isNonTemporal(), 2);
|
||||
return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, StoreLow, StoreHigh);
|
||||
|
Loading…
Reference in New Issue
Block a user