mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-28 06:32:09 +00:00
continue MachinePointerInfo'izing, eliminating use of one of the old
getLoad overloads. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114443 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
fa45901eaa
commit
ecf42c4720
@ -632,9 +632,6 @@ public:
|
||||
SDValue getLoad(EVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
|
||||
MachinePointerInfo PtrInfo, bool isVolatile,
|
||||
bool isNonTemporal, unsigned Alignment);
|
||||
SDValue getLoad(EVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
|
||||
const Value *SV, int SVOffset, bool isVolatile,
|
||||
bool isNonTemporal, unsigned Alignment);
|
||||
SDValue getExtLoad(ISD::LoadExtType ExtType, EVT VT, DebugLoc dl,
|
||||
SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo,
|
||||
EVT MemVT, bool isVolatile,
|
||||
|
@ -425,8 +425,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,
|
||||
false, false, 0);
|
||||
Val, StackPtr, MachinePointerInfo(),
|
||||
StoredVT, false, false, 0);
|
||||
SDValue Increment = DAG.getConstant(RegBytes, TLI.getPointerTy());
|
||||
SmallVector<SDValue, 8> Stores;
|
||||
unsigned Offset = 0;
|
||||
@ -434,11 +434,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,
|
||||
MachinePointerInfo(),
|
||||
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->getPointerInfo().getWithOffset(Offset),
|
||||
ST->isVolatile(), ST->isNonTemporal(),
|
||||
MinAlign(ST->getAlignment(), Offset)));
|
||||
// Increment the pointers.
|
||||
@ -501,7 +502,6 @@ SDValue ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG,
|
||||
static
|
||||
SDValue ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG,
|
||||
const TargetLowering &TLI) {
|
||||
int SVOffset = LD->getSrcValueOffset();
|
||||
SDValue Chain = LD->getChain();
|
||||
SDValue Ptr = LD->getBasePtr();
|
||||
EVT VT = LD->getValueType(0);
|
||||
@ -512,8 +512,8 @@ SDValue ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG,
|
||||
if (TLI.isTypeLegal(intVT)) {
|
||||
// Expand to a (misaligned) integer load of the same size,
|
||||
// then bitconvert to floating point or vector.
|
||||
SDValue newLoad = DAG.getLoad(intVT, dl, Chain, Ptr, LD->getSrcValue(),
|
||||
SVOffset, LD->isVolatile(),
|
||||
SDValue newLoad = DAG.getLoad(intVT, dl, Chain, Ptr, LD->getPointerInfo(),
|
||||
LD->isVolatile(),
|
||||
LD->isNonTemporal(), LD->getAlignment());
|
||||
SDValue Result = DAG.getNode(ISD::BIT_CONVERT, dl, LoadedVT, newLoad);
|
||||
if (VT.isFloatingPoint() && LoadedVT != VT)
|
||||
@ -521,65 +521,66 @@ SDValue ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG,
|
||||
|
||||
SDValue Ops[] = { Result, Chain };
|
||||
return DAG.getMergeValues(Ops, 2, dl);
|
||||
} else {
|
||||
// Copy the value to a (aligned) stack slot using (unaligned) integer
|
||||
// loads and stores, then do a (aligned) load from the stack slot.
|
||||
EVT RegVT = TLI.getRegisterType(*DAG.getContext(), intVT);
|
||||
unsigned LoadedBytes = LoadedVT.getSizeInBits() / 8;
|
||||
unsigned RegBytes = RegVT.getSizeInBits() / 8;
|
||||
unsigned NumRegs = (LoadedBytes + RegBytes - 1) / RegBytes;
|
||||
|
||||
// Make sure the stack slot is also aligned for the register type.
|
||||
SDValue StackBase = DAG.CreateStackTemporary(LoadedVT, RegVT);
|
||||
|
||||
SDValue Increment = DAG.getConstant(RegBytes, TLI.getPointerTy());
|
||||
SmallVector<SDValue, 8> Stores;
|
||||
SDValue StackPtr = StackBase;
|
||||
unsigned Offset = 0;
|
||||
|
||||
// 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 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, false, false, 0));
|
||||
// Increment the pointers.
|
||||
Offset += RegBytes;
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, Increment);
|
||||
StackPtr = DAG.getNode(ISD::ADD, dl, StackPtr.getValueType(), StackPtr,
|
||||
Increment);
|
||||
}
|
||||
|
||||
// The last copy may be partial. Do an extending load.
|
||||
EVT MemVT = EVT::getIntegerVT(*DAG.getContext(),
|
||||
8 * (LoadedBytes - Offset));
|
||||
SDValue Load = DAG.getExtLoad(ISD::EXTLOAD, RegVT, dl, 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, 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],
|
||||
Stores.size());
|
||||
|
||||
// Finally, perform the original load only redirected to the stack slot.
|
||||
Load = DAG.getExtLoad(LD->getExtensionType(), VT, dl, TF, StackBase,
|
||||
NULL, 0, LoadedVT, false, false, 0);
|
||||
|
||||
// Callers expect a MERGE_VALUES node.
|
||||
SDValue Ops[] = { Load, TF };
|
||||
return DAG.getMergeValues(Ops, 2, dl);
|
||||
}
|
||||
|
||||
// Copy the value to a (aligned) stack slot using (unaligned) integer
|
||||
// loads and stores, then do a (aligned) load from the stack slot.
|
||||
EVT RegVT = TLI.getRegisterType(*DAG.getContext(), intVT);
|
||||
unsigned LoadedBytes = LoadedVT.getSizeInBits() / 8;
|
||||
unsigned RegBytes = RegVT.getSizeInBits() / 8;
|
||||
unsigned NumRegs = (LoadedBytes + RegBytes - 1) / RegBytes;
|
||||
|
||||
// Make sure the stack slot is also aligned for the register type.
|
||||
SDValue StackBase = DAG.CreateStackTemporary(LoadedVT, RegVT);
|
||||
|
||||
SDValue Increment = DAG.getConstant(RegBytes, TLI.getPointerTy());
|
||||
SmallVector<SDValue, 8> Stores;
|
||||
SDValue StackPtr = StackBase;
|
||||
unsigned Offset = 0;
|
||||
|
||||
// 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 original location.
|
||||
SDValue Load = DAG.getLoad(RegVT, dl, Chain, Ptr,
|
||||
LD->getPointerInfo().getWithOffset(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, false, false, 0));
|
||||
// Increment the pointers.
|
||||
Offset += RegBytes;
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, Increment);
|
||||
StackPtr = DAG.getNode(ISD::ADD, dl, StackPtr.getValueType(), StackPtr,
|
||||
Increment);
|
||||
}
|
||||
|
||||
// The last copy may be partial. Do an extending load.
|
||||
EVT MemVT = EVT::getIntegerVT(*DAG.getContext(),
|
||||
8 * (LoadedBytes - Offset));
|
||||
SDValue Load = DAG.getExtLoad(ISD::EXTLOAD, RegVT, dl, Chain, Ptr,
|
||||
LD->getPointerInfo().getWithOffset(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,
|
||||
MachinePointerInfo(), 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],
|
||||
Stores.size());
|
||||
|
||||
// Finally, perform the original load only redirected to the stack slot.
|
||||
Load = DAG.getExtLoad(LD->getExtensionType(), VT, dl, TF, StackBase,
|
||||
MachinePointerInfo(), LoadedVT, false, false, 0);
|
||||
|
||||
// Callers expect a MERGE_VALUES node.
|
||||
SDValue Ops[] = { Load, TF };
|
||||
return DAG.getMergeValues(Ops, 2, dl);
|
||||
}
|
||||
assert(LoadedVT.isInteger() && !LoadedVT.isVector() &&
|
||||
"Unaligned load of unsupported type.");
|
||||
@ -602,22 +603,24 @@ SDValue ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG,
|
||||
// Load the value in two parts
|
||||
SDValue Lo, Hi;
|
||||
if (TLI.isLittleEndian()) {
|
||||
Lo = DAG.getExtLoad(ISD::ZEXTLOAD, VT, dl, Chain, Ptr, LD->getSrcValue(),
|
||||
SVOffset, NewLoadedVT, LD->isVolatile(),
|
||||
Lo = DAG.getExtLoad(ISD::ZEXTLOAD, VT, dl, Chain, Ptr, LD->getPointerInfo(),
|
||||
NewLoadedVT, LD->isVolatile(),
|
||||
LD->isNonTemporal(), Alignment);
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(IncrementSize, TLI.getPointerTy()));
|
||||
Hi = DAG.getExtLoad(HiExtType, VT, dl, Chain, Ptr, LD->getSrcValue(),
|
||||
SVOffset + IncrementSize, NewLoadedVT, LD->isVolatile(),
|
||||
Hi = DAG.getExtLoad(HiExtType, VT, dl, Chain, Ptr,
|
||||
LD->getPointerInfo().getWithOffset(IncrementSize),
|
||||
NewLoadedVT, LD->isVolatile(),
|
||||
LD->isNonTemporal(), MinAlign(Alignment,IncrementSize));
|
||||
} else {
|
||||
Hi = DAG.getExtLoad(HiExtType, VT, dl, Chain, Ptr, LD->getSrcValue(),
|
||||
SVOffset, NewLoadedVT, LD->isVolatile(),
|
||||
Hi = DAG.getExtLoad(HiExtType, VT, dl, Chain, Ptr, LD->getPointerInfo(),
|
||||
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, VT, dl, Chain, Ptr, LD->getSrcValue(),
|
||||
SVOffset + IncrementSize, NewLoadedVT, LD->isVolatile(),
|
||||
Lo = DAG.getExtLoad(ISD::ZEXTLOAD, VT, dl, Chain, Ptr,
|
||||
LD->getPointerInfo().getWithOffset(IncrementSize),
|
||||
NewLoadedVT, LD->isVolatile(),
|
||||
LD->isNonTemporal(), MinAlign(Alignment,IncrementSize));
|
||||
}
|
||||
|
||||
@ -1134,8 +1137,7 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
||||
// Change base type to a different vector type.
|
||||
EVT NVT = TLI.getTypeToPromoteTo(Node->getOpcode(), VT);
|
||||
|
||||
Tmp1 = DAG.getLoad(NVT, dl, Tmp1, Tmp2, LD->getSrcValue(),
|
||||
LD->getSrcValueOffset(),
|
||||
Tmp1 = DAG.getLoad(NVT, dl, Tmp1, Tmp2, LD->getPointerInfo(),
|
||||
LD->isVolatile(), LD->isNonTemporal(),
|
||||
LD->getAlignment());
|
||||
Tmp3 = LegalizeOp(DAG.getNode(ISD::BIT_CONVERT, dl, VT, Tmp1));
|
||||
@ -1312,8 +1314,8 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
||||
break;
|
||||
case TargetLowering::Expand:
|
||||
if (!TLI.isLoadExtLegal(ISD::EXTLOAD, SrcVT) && isTypeLegal(SrcVT)) {
|
||||
SDValue Load = DAG.getLoad(SrcVT, dl, Tmp1, Tmp2, LD->getSrcValue(),
|
||||
LD->getSrcValueOffset(),
|
||||
SDValue Load = DAG.getLoad(SrcVT, dl, Tmp1, Tmp2,
|
||||
LD->getPointerInfo(),
|
||||
LD->isVolatile(), LD->isNonTemporal(),
|
||||
LD->getAlignment());
|
||||
unsigned ExtendOp;
|
||||
@ -1558,11 +1560,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,MachinePointerInfo(),
|
||||
false, false, 0);
|
||||
else
|
||||
return DAG.getExtLoad(ISD::EXTLOAD, Op.getValueType(), dl, Ch, StackPtr,
|
||||
NULL, 0, Vec.getValueType().getVectorElementType(),
|
||||
MachinePointerInfo(),
|
||||
Vec.getValueType().getVectorElementType(),
|
||||
false, false, 0);
|
||||
}
|
||||
|
||||
@ -1576,7 +1579,7 @@ SDValue SelectionDAGLegalize::ExpandVectorBuildThroughStack(SDNode* Node) {
|
||||
DebugLoc dl = Node->getDebugLoc();
|
||||
SDValue FIPtr = DAG.CreateStackTemporary(VT);
|
||||
int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
|
||||
const Value *SV = PseudoSourceValue::getFixedStack(FI);
|
||||
MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(FI);
|
||||
|
||||
// Emit a store of each element to the stack slot.
|
||||
SmallVector<SDValue, 8> Stores;
|
||||
@ -1595,11 +1598,13 @@ SDValue SelectionDAGLegalize::ExpandVectorBuildThroughStack(SDNode* Node) {
|
||||
// element type, only store the bits necessary.
|
||||
if (EltVT.bitsLT(Node->getOperand(i).getValueType().getScalarType())) {
|
||||
Stores.push_back(DAG.getTruncStore(DAG.getEntryNode(), dl,
|
||||
Node->getOperand(i), Idx, SV, Offset,
|
||||
Node->getOperand(i), Idx,
|
||||
PtrInfo.getWithOffset(Offset),
|
||||
EltVT, false, false, 0));
|
||||
} else
|
||||
Stores.push_back(DAG.getStore(DAG.getEntryNode(), dl,
|
||||
Node->getOperand(i), Idx, SV, Offset,
|
||||
Node->getOperand(i), Idx,
|
||||
PtrInfo.getWithOffset(Offset),
|
||||
false, false, 0));
|
||||
}
|
||||
|
||||
@ -1611,7 +1616,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, false, false, 0);
|
||||
return DAG.getLoad(VT, dl, StoreChain, FIPtr, PtrInfo, false, false, 0);
|
||||
}
|
||||
|
||||
SDValue SelectionDAGLegalize::ExpandFCOPYSIGN(SDNode* Node) {
|
||||
@ -1639,7 +1644,8 @@ SDValue SelectionDAGLegalize::ExpandFCOPYSIGN(SDNode* Node) {
|
||||
if (TLI.isBigEndian()) {
|
||||
assert(FloatVT.isByteSized() && "Unsupported floating point type!");
|
||||
// Load out a legal integer with the same sign bit as the float.
|
||||
SignBit = DAG.getLoad(LoadTy, dl, Ch, StackPtr, NULL, 0, false, false, 0);
|
||||
SignBit = DAG.getLoad(LoadTy, dl, Ch, StackPtr, MachinePointerInfo(),
|
||||
false, false, 0);
|
||||
} else { // Little endian
|
||||
SDValue LoadPtr = StackPtr;
|
||||
// The float may be wider than the integer we are going to load. Advance
|
||||
@ -1649,7 +1655,8 @@ SDValue SelectionDAGLegalize::ExpandFCOPYSIGN(SDNode* Node) {
|
||||
LoadPtr = DAG.getNode(ISD::ADD, dl, LoadPtr.getValueType(),
|
||||
LoadPtr, DAG.getIntPtrConstant(ByteOffset));
|
||||
// Load a legal integer containing the sign bit.
|
||||
SignBit = DAG.getLoad(LoadTy, dl, Ch, LoadPtr, NULL, 0, false, false, 0);
|
||||
SignBit = DAG.getLoad(LoadTy, dl, Ch, LoadPtr, MachinePointerInfo(),
|
||||
false, false, 0);
|
||||
// Move the sign bit to the top bit of the loaded integer.
|
||||
unsigned BitShift = LoadTy.getSizeInBits() -
|
||||
(FloatVT.getSizeInBits() - 8 * ByteOffset);
|
||||
@ -1789,11 +1796,12 @@ SDValue SelectionDAGLegalize::EmitStackConvert(SDValue SrcOp,
|
||||
|
||||
// Result is a load from the stack slot.
|
||||
if (SlotSize == DestSize)
|
||||
return DAG.getLoad(DestVT, dl, Store, FIPtr, SV, 0, false, false,
|
||||
DestAlign);
|
||||
return DAG.getLoad(DestVT, dl, Store, FIPtr, MachinePointerInfo(SV),
|
||||
false, false, DestAlign);
|
||||
|
||||
assert(SlotSize < DestSize && "Unknown extension!");
|
||||
return DAG.getExtLoad(ISD::EXTLOAD, DestVT, dl, Store, FIPtr, SV, 0, SlotVT,
|
||||
return DAG.getExtLoad(ISD::EXTLOAD, DestVT, dl, Store, FIPtr,
|
||||
MachinePointerInfo(SV), SlotVT,
|
||||
false, false, DestAlign);
|
||||
}
|
||||
|
||||
@ -2070,8 +2078,8 @@ SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned,
|
||||
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,
|
||||
false, false, 0);
|
||||
SDValue Load = DAG.getLoad(MVT::f64, dl, Store2, StackSlot,
|
||||
MachinePointerInfo(), false, false, 0);
|
||||
// FP constant to bias correct the final result
|
||||
SDValue Bias = DAG.getConstantFP(isSigned ?
|
||||
BitsToDouble(0x4330000080000000ULL) :
|
||||
@ -2660,8 +2668,8 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node,
|
||||
Tmp2 = Node->getOperand(1);
|
||||
unsigned Align = Node->getConstantOperandVal(3);
|
||||
|
||||
SDValue VAListLoad = DAG.getLoad(TLI.getPointerTy(), dl, Tmp1, Tmp2, V, 0,
|
||||
false, false, 0);
|
||||
SDValue VAListLoad = DAG.getLoad(TLI.getPointerTy(), dl, Tmp1, Tmp2,
|
||||
MachinePointerInfo(V), false, false, 0);
|
||||
SDValue VAList = VAListLoad;
|
||||
|
||||
if (Align > TLI.getMinStackArgumentAlignment()) {
|
||||
@ -2685,7 +2693,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node,
|
||||
Tmp3 = DAG.getStore(VAListLoad.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, MachinePointerInfo(),
|
||||
false, false, 0));
|
||||
Results.push_back(Results[0].getValue(1));
|
||||
break;
|
||||
@ -2696,9 +2704,10 @@ 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, false, false, 0);
|
||||
Tmp1 = DAG.getStore(Tmp1.getValue(1), dl, Tmp1, Node->getOperand(1), VD, 0,
|
||||
false, false, 0);
|
||||
Node->getOperand(2), MachinePointerInfo(VS),
|
||||
false, false, 0);
|
||||
Tmp1 = DAG.getStore(Tmp1.getValue(1), dl, Tmp1, Node->getOperand(1),
|
||||
MachinePointerInfo(VD), false, false, 0);
|
||||
Results.push_back(Tmp1);
|
||||
break;
|
||||
}
|
||||
|
@ -889,7 +889,6 @@ SDValue DAGTypeLegalizer::PromoteIntOp_SINT_TO_FP(SDNode *N) {
|
||||
SDValue DAGTypeLegalizer::PromoteIntOp_STORE(StoreSDNode *N, unsigned OpNo){
|
||||
assert(ISD::isUNINDEXEDStore(N) && "Indexed store during type legalization!");
|
||||
SDValue Ch = N->getChain(), Ptr = N->getBasePtr();
|
||||
int SVOffset = N->getSrcValueOffset();
|
||||
unsigned Alignment = N->getAlignment();
|
||||
bool isVolatile = N->isVolatile();
|
||||
bool isNonTemporal = N->isNonTemporal();
|
||||
@ -898,8 +897,8 @@ SDValue DAGTypeLegalizer::PromoteIntOp_STORE(StoreSDNode *N, unsigned OpNo){
|
||||
SDValue Val = GetPromotedInteger(N->getValue()); // Get promoted value.
|
||||
|
||||
// Truncate the value and store the result.
|
||||
return DAG.getTruncStore(Ch, dl, Val, Ptr, N->getSrcValue(),
|
||||
SVOffset, N->getMemoryVT(),
|
||||
return DAG.getTruncStore(Ch, dl, Val, Ptr, N->getPointerInfo(),
|
||||
N->getMemoryVT(),
|
||||
isVolatile, isNonTemporal, Alignment);
|
||||
}
|
||||
|
||||
@ -1524,7 +1523,6 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
|
||||
SDValue Ch = N->getChain();
|
||||
SDValue Ptr = N->getBasePtr();
|
||||
ISD::LoadExtType ExtType = N->getExtensionType();
|
||||
int SVOffset = N->getSrcValueOffset();
|
||||
unsigned Alignment = N->getAlignment();
|
||||
bool isVolatile = N->isVolatile();
|
||||
bool isNonTemporal = N->isNonTemporal();
|
||||
@ -1535,7 +1533,7 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
|
||||
if (N->getMemoryVT().bitsLE(NVT)) {
|
||||
EVT MemVT = N->getMemoryVT();
|
||||
|
||||
Lo = DAG.getExtLoad(ExtType, NVT, dl, Ch, Ptr, N->getSrcValue(), SVOffset,
|
||||
Lo = DAG.getExtLoad(ExtType, NVT, dl, Ch, Ptr, N->getPointerInfo(),
|
||||
MemVT, isVolatile, isNonTemporal, Alignment);
|
||||
|
||||
// Remember the chain.
|
||||
@ -1557,7 +1555,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,
|
||||
Lo = DAG.getLoad(NVT, dl, Ch, Ptr, N->getPointerInfo(),
|
||||
isVolatile, isNonTemporal, Alignment);
|
||||
|
||||
unsigned ExcessBits =
|
||||
@ -1568,8 +1566,8 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
|
||||
unsigned IncrementSize = NVT.getSizeInBits()/8;
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getIntPtrConstant(IncrementSize));
|
||||
Hi = DAG.getExtLoad(ExtType, NVT, dl, Ch, Ptr, N->getSrcValue(),
|
||||
SVOffset+IncrementSize, NEVT,
|
||||
Hi = DAG.getExtLoad(ExtType, NVT, dl, Ch, Ptr,
|
||||
N->getPointerInfo().getWithOffset(IncrementSize), NEVT,
|
||||
isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
|
||||
@ -1586,7 +1584,7 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
|
||||
unsigned ExcessBits = (EBytes - IncrementSize)*8;
|
||||
|
||||
// Load both the high bits and maybe some of the low bits.
|
||||
Hi = DAG.getExtLoad(ExtType, NVT, dl, Ch, Ptr, N->getSrcValue(), SVOffset,
|
||||
Hi = DAG.getExtLoad(ExtType, NVT, dl, Ch, Ptr, N->getPointerInfo(),
|
||||
EVT::getIntegerVT(*DAG.getContext(),
|
||||
MemVT.getSizeInBits() - ExcessBits),
|
||||
isVolatile, isNonTemporal, Alignment);
|
||||
@ -1595,8 +1593,8 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getIntPtrConstant(IncrementSize));
|
||||
// Load the rest of the low bits.
|
||||
Lo = DAG.getExtLoad(ISD::ZEXTLOAD, NVT, dl, Ch, Ptr, N->getSrcValue(),
|
||||
SVOffset+IncrementSize,
|
||||
Lo = DAG.getExtLoad(ISD::ZEXTLOAD, NVT, dl, Ch, Ptr,
|
||||
N->getPointerInfo().getWithOffset(IncrementSize),
|
||||
EVT::getIntegerVT(*DAG.getContext(), ExcessBits),
|
||||
isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
@ -2308,7 +2306,6 @@ SDValue DAGTypeLegalizer::ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
||||
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
|
||||
SDValue Ch = N->getChain();
|
||||
SDValue Ptr = N->getBasePtr();
|
||||
int SVOffset = N->getSrcValueOffset();
|
||||
unsigned Alignment = N->getAlignment();
|
||||
bool isVolatile = N->isVolatile();
|
||||
bool isNonTemporal = N->isNonTemporal();
|
||||
@ -2319,14 +2316,16 @@ 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,
|
||||
return DAG.getTruncStore(Ch, dl, Lo, Ptr, N->getPointerInfo(),
|
||||
N->getMemoryVT(), isVolatile, isNonTemporal,
|
||||
Alignment);
|
||||
} else if (TLI.isLittleEndian()) {
|
||||
}
|
||||
|
||||
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,
|
||||
Lo = DAG.getStore(Ch, dl, Lo, Ptr, N->getPointerInfo(),
|
||||
isVolatile, isNonTemporal, Alignment);
|
||||
|
||||
unsigned ExcessBits =
|
||||
@ -2337,50 +2336,49 @@ SDValue DAGTypeLegalizer::ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo) {
|
||||
unsigned IncrementSize = NVT.getSizeInBits()/8;
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getIntPtrConstant(IncrementSize));
|
||||
Hi = DAG.getTruncStore(Ch, dl, Hi, Ptr, N->getSrcValue(),
|
||||
SVOffset+IncrementSize, NEVT,
|
||||
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
|
||||
// the cost of some bit-fiddling.
|
||||
GetExpandedInteger(N->getValue(), Lo, Hi);
|
||||
|
||||
EVT ExtVT = N->getMemoryVT();
|
||||
unsigned EBytes = ExtVT.getStoreSize();
|
||||
unsigned IncrementSize = NVT.getSizeInBits()/8;
|
||||
unsigned ExcessBits = (EBytes - IncrementSize)*8;
|
||||
EVT HiVT = EVT::getIntegerVT(*DAG.getContext(),
|
||||
ExtVT.getSizeInBits() - ExcessBits);
|
||||
|
||||
if (ExcessBits < NVT.getSizeInBits()) {
|
||||
// Transfer high bits from the top of Lo to the bottom of Hi.
|
||||
Hi = DAG.getNode(ISD::SHL, dl, NVT, Hi,
|
||||
DAG.getConstant(NVT.getSizeInBits() - ExcessBits,
|
||||
TLI.getPointerTy()));
|
||||
Hi = DAG.getNode(ISD::OR, dl, NVT, Hi,
|
||||
DAG.getNode(ISD::SRL, dl, NVT, Lo,
|
||||
DAG.getConstant(ExcessBits,
|
||||
TLI.getPointerTy())));
|
||||
}
|
||||
|
||||
// Store both the high bits and maybe some of the low bits.
|
||||
Hi = DAG.getTruncStore(Ch, dl, Hi, Ptr, N->getSrcValue(),
|
||||
SVOffset, HiVT, isVolatile, isNonTemporal,
|
||||
Alignment);
|
||||
|
||||
// Increment the pointer to the other half.
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getIntPtrConstant(IncrementSize));
|
||||
// Store the lowest ExcessBits bits in the second half.
|
||||
Lo = DAG.getTruncStore(Ch, dl, Lo, Ptr, N->getSrcValue(),
|
||||
SVOffset+IncrementSize,
|
||||
EVT::getIntegerVT(*DAG.getContext(), ExcessBits),
|
||||
isVolatile, isNonTemporal,
|
||||
Hi = DAG.getTruncStore(Ch, dl, Hi, Ptr,
|
||||
N->getPointerInfo().getWithOffset(IncrementSize),
|
||||
NEVT, isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
|
||||
}
|
||||
|
||||
// Big-endian - high bits are at low addresses. Favor aligned stores at
|
||||
// the cost of some bit-fiddling.
|
||||
GetExpandedInteger(N->getValue(), Lo, Hi);
|
||||
|
||||
EVT ExtVT = N->getMemoryVT();
|
||||
unsigned EBytes = ExtVT.getStoreSize();
|
||||
unsigned IncrementSize = NVT.getSizeInBits()/8;
|
||||
unsigned ExcessBits = (EBytes - IncrementSize)*8;
|
||||
EVT HiVT = EVT::getIntegerVT(*DAG.getContext(),
|
||||
ExtVT.getSizeInBits() - ExcessBits);
|
||||
|
||||
if (ExcessBits < NVT.getSizeInBits()) {
|
||||
// Transfer high bits from the top of Lo to the bottom of Hi.
|
||||
Hi = DAG.getNode(ISD::SHL, dl, NVT, Hi,
|
||||
DAG.getConstant(NVT.getSizeInBits() - ExcessBits,
|
||||
TLI.getPointerTy()));
|
||||
Hi = DAG.getNode(ISD::OR, dl, NVT, Hi,
|
||||
DAG.getNode(ISD::SRL, dl, NVT, Lo,
|
||||
DAG.getConstant(ExcessBits,
|
||||
TLI.getPointerTy())));
|
||||
}
|
||||
|
||||
// Store both the high bits and maybe some of the low bits.
|
||||
Hi = DAG.getTruncStore(Ch, dl, Hi, Ptr, N->getPointerInfo(),
|
||||
HiVT, isVolatile, isNonTemporal, Alignment);
|
||||
|
||||
// Increment the pointer to the other half.
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getIntPtrConstant(IncrementSize));
|
||||
// Store the lowest ExcessBits bits in the second half.
|
||||
Lo = DAG.getTruncStore(Ch, dl, Lo, Ptr,
|
||||
N->getPointerInfo().getWithOffset(IncrementSize),
|
||||
EVT::getIntegerVT(*DAG.getContext(), ExcessBits),
|
||||
isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::ExpandIntOp_TRUNCATE(SDNode *N) {
|
||||
|
@ -880,10 +880,11 @@ 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,
|
||||
false, false, 0);
|
||||
SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, Op, StackPtr,
|
||||
MachinePointerInfo(), false, false, 0);
|
||||
// Result is a load from the stack slot.
|
||||
return DAG.getLoad(DestVT, dl, Store, StackPtr, NULL, 0, false, false, 0);
|
||||
return DAG.getLoad(DestVT, dl, Store, StackPtr, MachinePointerInfo(),
|
||||
false, false, 0);
|
||||
}
|
||||
|
||||
/// CustomLowerNode - Replace the node's results with custom code provided
|
||||
|
@ -119,14 +119,14 @@ void DAGTypeLegalizer::ExpandRes_BIT_CONVERT(SDNode *N, SDValue &Lo,
|
||||
getTypeForEVT(*DAG.getContext()));
|
||||
SDValue StackPtr = DAG.CreateStackTemporary(InVT, Alignment);
|
||||
int SPFI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
|
||||
const Value *SV = PseudoSourceValue::getFixedStack(SPFI);
|
||||
MachinePointerInfo PtrInfo = MachinePointerInfo::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, PtrInfo,
|
||||
false, false, 0);
|
||||
|
||||
// Load the first half from the stack slot.
|
||||
Lo = DAG.getLoad(NOutVT, dl, Store, StackPtr, SV, 0, false, false, 0);
|
||||
Lo = DAG.getLoad(NOutVT, dl, Store, StackPtr, PtrInfo, false, false, 0);
|
||||
|
||||
// Increment the pointer to the other half.
|
||||
unsigned IncrementSize = NOutVT.getSizeInBits() / 8;
|
||||
@ -134,7 +134,8 @@ void DAGTypeLegalizer::ExpandRes_BIT_CONVERT(SDNode *N, SDValue &Lo,
|
||||
DAG.getIntPtrConstant(IncrementSize));
|
||||
|
||||
// Load the second half from the stack slot.
|
||||
Hi = DAG.getLoad(NOutVT, dl, Store, StackPtr, SV, IncrementSize, false,
|
||||
Hi = DAG.getLoad(NOutVT, dl, Store, StackPtr,
|
||||
PtrInfo.getWithOffset(IncrementSize), false,
|
||||
false, MinAlign(Alignment, IncrementSize));
|
||||
|
||||
// Handle endianness of the load.
|
||||
@ -204,22 +205,21 @@ void DAGTypeLegalizer::ExpandRes_NormalLoad(SDNode *N, SDValue &Lo,
|
||||
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), LD->getValueType(0));
|
||||
SDValue Chain = LD->getChain();
|
||||
SDValue Ptr = LD->getBasePtr();
|
||||
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,
|
||||
Lo = DAG.getLoad(NVT, dl, Chain, Ptr, LD->getPointerInfo(),
|
||||
isVolatile, isNonTemporal, Alignment);
|
||||
|
||||
// Increment the pointer to the other half.
|
||||
unsigned IncrementSize = NVT.getSizeInBits() / 8;
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getIntPtrConstant(IncrementSize));
|
||||
Hi = DAG.getLoad(NVT, dl, Chain, Ptr, LD->getSrcValue(),
|
||||
SVOffset+IncrementSize,
|
||||
Hi = DAG.getLoad(NVT, dl, Chain, Ptr,
|
||||
LD->getPointerInfo().getWithOffset(IncrementSize),
|
||||
isVolatile, isNonTemporal,
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
|
||||
|
@ -705,8 +705,8 @@ 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,
|
||||
false, false, 0);
|
||||
SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, Vec, StackPtr,
|
||||
MachinePointerInfo(), false, false, 0);
|
||||
|
||||
// Store the new element. This may be larger than the vector element type,
|
||||
// so use a truncating store.
|
||||
@ -714,11 +714,11 @@ void DAGTypeLegalizer::SplitVecRes_INSERT_VECTOR_ELT(SDNode *N, SDValue &Lo,
|
||||
const Type *VecType = VecVT.getTypeForEVT(*DAG.getContext());
|
||||
unsigned Alignment =
|
||||
TLI.getTargetData()->getPrefTypeAlignment(VecType);
|
||||
Store = DAG.getTruncStore(Store, dl, Elt, EltPtr, NULL, 0, EltVT,
|
||||
Store = DAG.getTruncStore(Store, dl, Elt, EltPtr, MachinePointerInfo(), 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, MachinePointerInfo(),
|
||||
false, false, 0);
|
||||
|
||||
// Increment the pointer to the other part.
|
||||
@ -727,8 +727,8 @@ void DAGTypeLegalizer::SplitVecRes_INSERT_VECTOR_ELT(SDNode *N, SDValue &Lo,
|
||||
DAG.getIntPtrConstant(IncrementSize));
|
||||
|
||||
// Load the Hi part from the stack slot.
|
||||
Hi = DAG.getLoad(Hi.getValueType(), dl, Store, StackPtr, NULL, 0, false,
|
||||
false, MinAlign(Alignment, IncrementSize));
|
||||
Hi = DAG.getLoad(Hi.getValueType(), dl, Store, StackPtr, MachinePointerInfo(),
|
||||
false, false, MinAlign(Alignment, IncrementSize));
|
||||
}
|
||||
|
||||
void DAGTypeLegalizer::SplitVecRes_SCALAR_TO_VECTOR(SDNode *N, SDValue &Lo,
|
||||
@ -2212,8 +2212,8 @@ static SDValue BuildVectorFromScalar(SelectionDAG& DAG, EVT VecTy,
|
||||
return DAG.getNode(ISD::BIT_CONVERT, dl, VecTy, VecOp);
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::GenWidenVectorLoads(SmallVector<SDValue, 16>& LdChain,
|
||||
LoadSDNode * LD) {
|
||||
SDValue DAGTypeLegalizer::GenWidenVectorLoads(SmallVector<SDValue, 16> &LdChain,
|
||||
LoadSDNode *LD) {
|
||||
// The strategy assumes that we can efficiently load powers of two widths.
|
||||
// The routines chops the vector into the largest vector loads with the same
|
||||
// element type or scalar loads and then recombines it to the widen vector
|
||||
@ -2228,11 +2228,9 @@ SDValue DAGTypeLegalizer::GenWidenVectorLoads(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();
|
||||
|
||||
int LdWidth = LdVT.getSizeInBits();
|
||||
int WidthDiff = WidenWidth - LdWidth; // Difference
|
||||
@ -2241,7 +2239,7 @@ SDValue DAGTypeLegalizer::GenWidenVectorLoads(SmallVector<SDValue, 16>& LdChain,
|
||||
// Find the vector type that can load from.
|
||||
EVT NewVT = FindMemType(DAG, TLI, LdWidth, WidenVT, LdAlign, WidthDiff);
|
||||
int NewVTWidth = NewVT.getSizeInBits();
|
||||
SDValue LdOp = DAG.getLoad(NewVT, dl, Chain, BasePtr, SV, SVOffset,
|
||||
SDValue LdOp = DAG.getLoad(NewVT, dl, Chain, BasePtr, LD->getPointerInfo(),
|
||||
isVolatile, isNonTemporal, Align);
|
||||
LdChain.push_back(LdOp.getValue(1));
|
||||
|
||||
@ -2286,8 +2284,9 @@ SDValue DAGTypeLegalizer::GenWidenVectorLoads(SmallVector<SDValue, 16>& LdChain,
|
||||
NewVTWidth = NewVT.getSizeInBits();
|
||||
}
|
||||
|
||||
SDValue LdOp = DAG.getLoad(NewVT, dl, Chain, BasePtr, SV,
|
||||
SVOffset+Offset, isVolatile,
|
||||
SDValue LdOp = DAG.getLoad(NewVT, dl, Chain, BasePtr,
|
||||
LD->getPointerInfo().getWithOffset(Offset),
|
||||
isVolatile,
|
||||
isNonTemporal, MinAlign(Align, Increment));
|
||||
LdChain.push_back(LdOp.getValue(1));
|
||||
LdOps.push_back(LdOp);
|
||||
|
@ -3947,16 +3947,6 @@ SelectionDAG::getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getLoad(EVT VT, DebugLoc dl,
|
||||
SDValue Chain, SDValue Ptr,
|
||||
const Value *SV, int SVOffset,
|
||||
bool isVolatile, bool isNonTemporal,
|
||||
unsigned Alignment) {
|
||||
SDValue Undef = getUNDEF(Ptr.getValueType());
|
||||
return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
|
||||
SV, SVOffset, VT, isVolatile, isNonTemporal, Alignment);
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getLoad(EVT VT, DebugLoc dl,
|
||||
SDValue Chain, SDValue Ptr,
|
||||
MachinePointerInfo PtrInfo,
|
||||
|
@ -2950,7 +2950,7 @@ void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
|
||||
PtrVT, Ptr,
|
||||
DAG.getConstant(Offsets[i], PtrVT));
|
||||
SDValue L = DAG.getLoad(ValueVTs[i], getCurDebugLoc(), Root,
|
||||
A, SV, Offsets[i], isVolatile,
|
||||
A, MachinePointerInfo(SV, Offsets[i]), isVolatile,
|
||||
isNonTemporal, Alignment);
|
||||
|
||||
Values[i] = L;
|
||||
@ -4616,6 +4616,7 @@ void SelectionDAGBuilder::LowerCallTo(ImmutableCallSite CS, SDValue Callee,
|
||||
FTy->isVarArg(), Outs, FTy->getContext());
|
||||
|
||||
SDValue DemoteStackSlot;
|
||||
int DemoteStackIdx = -100;
|
||||
|
||||
if (!CanLowerReturn) {
|
||||
uint64_t TySize = TLI.getTargetData()->getTypeAllocSize(
|
||||
@ -4623,10 +4624,10 @@ void SelectionDAGBuilder::LowerCallTo(ImmutableCallSite CS, SDValue Callee,
|
||||
unsigned Align = TLI.getTargetData()->getPrefTypeAlignment(
|
||||
FTy->getReturnType());
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
int SSFI = MF.getFrameInfo()->CreateStackObject(TySize, Align, false);
|
||||
DemoteStackIdx = MF.getFrameInfo()->CreateStackObject(TySize, Align, false);
|
||||
const Type *StackSlotPtrType = PointerType::getUnqual(FTy->getReturnType());
|
||||
|
||||
DemoteStackSlot = DAG.getFrameIndex(SSFI, TLI.getPointerTy());
|
||||
DemoteStackSlot = DAG.getFrameIndex(DemoteStackIdx, TLI.getPointerTy());
|
||||
Entry.Node = DemoteStackSlot;
|
||||
Entry.Ty = StackSlotPtrType;
|
||||
Entry.isSExt = false;
|
||||
@ -4720,7 +4721,9 @@ void SelectionDAGBuilder::LowerCallTo(ImmutableCallSite CS, SDValue Callee,
|
||||
DemoteStackSlot,
|
||||
DAG.getConstant(Offsets[i], PtrVT));
|
||||
SDValue L = DAG.getLoad(Outs[i].VT, getCurDebugLoc(), Result.second,
|
||||
Add, NULL, Offsets[i], false, false, 1);
|
||||
Add,
|
||||
MachinePointerInfo::getFixedStack(DemoteStackIdx, Offsets[i]),
|
||||
false, false, 1);
|
||||
Values[i] = L;
|
||||
Chains[i] = L.getValue(1);
|
||||
}
|
||||
@ -4823,7 +4826,7 @@ static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT,
|
||||
|
||||
SDValue Ptr = Builder.getValue(PtrVal);
|
||||
SDValue LoadVal = Builder.DAG.getLoad(LoadVT, Builder.getCurDebugLoc(), Root,
|
||||
Ptr, PtrVal /*SrcValue*/, 0/*SVOffset*/,
|
||||
Ptr, MachinePointerInfo(PtrVal),
|
||||
false /*volatile*/,
|
||||
false /*nontemporal*/, 1 /* align=1 */);
|
||||
|
||||
@ -5457,7 +5460,8 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite 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,
|
||||
MachinePointerInfo::getFixedStack(SSFI),
|
||||
false, false, 0);
|
||||
OpInfo.CallOperand = StackSlot;
|
||||
}
|
||||
|
@ -1916,8 +1916,7 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
|
||||
DAG.getConstant(bestOffset, PtrType));
|
||||
unsigned NewAlign = MinAlign(Lod->getAlignment(), bestOffset);
|
||||
SDValue NewLoad = DAG.getLoad(newVT, dl, Lod->getChain(), Ptr,
|
||||
Lod->getSrcValue(),
|
||||
Lod->getSrcValueOffset() + bestOffset,
|
||||
Lod->getPointerInfo().getWithOffset(bestOffset),
|
||||
false, false, NewAlign);
|
||||
return DAG.getSetCC(dl, VT,
|
||||
DAG.getNode(ISD::AND, dl, newVT, NewLoad,
|
||||
|
Loading…
x
Reference in New Issue
Block a user