mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-10 02:36:06 +00:00
Fixed generating incorrect aligned stores that I backout of r53031
that fixed problems in EmitStackConvert where the source and target type have different alignment by creating a stack slot with the max alignment of source and target type. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53150 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
225ca9cdd7
commit
364d73ddab
@ -589,8 +589,9 @@ public:
|
||||
void dump() const;
|
||||
|
||||
/// CreateStackTemporary - Create a stack temporary, suitable for holding the
|
||||
/// specified value type.
|
||||
SDOperand CreateStackTemporary(MVT VT);
|
||||
/// specified value type. If minAlign is specified, the slot size will have
|
||||
/// at least that alignment.
|
||||
SDOperand CreateStackTemporary(MVT VT, unsigned minAlign = 1);
|
||||
|
||||
/// FoldSetCC - Constant fold a setcc to true or false.
|
||||
SDOperand FoldSetCC(MVT VT, SDOperand N1,
|
||||
|
@ -4871,7 +4871,9 @@ SDOperand SelectionDAGLegalize::EmitStackConvert(SDOperand SrcOp,
|
||||
MVT SlotVT,
|
||||
MVT DestVT) {
|
||||
// Create the stack frame object.
|
||||
SDOperand FIPtr = DAG.CreateStackTemporary(SlotVT);
|
||||
unsigned SrcAlign = TLI.getTargetData()->getPrefTypeAlignment(
|
||||
SrcOp.getValueType().getTypeForMVT());
|
||||
SDOperand FIPtr = DAG.CreateStackTemporary(SlotVT, SrcAlign);
|
||||
|
||||
FrameIndexSDNode *StackPtrFI = cast<FrameIndexSDNode>(FIPtr);
|
||||
int SPFI = StackPtrFI->getIndex();
|
||||
@ -4879,27 +4881,31 @@ SDOperand SelectionDAGLegalize::EmitStackConvert(SDOperand SrcOp,
|
||||
unsigned SrcSize = SrcOp.getValueType().getSizeInBits();
|
||||
unsigned SlotSize = SlotVT.getSizeInBits();
|
||||
unsigned DestSize = DestVT.getSizeInBits();
|
||||
unsigned DestAlign = TLI.getTargetData()->getPrefTypeAlignment(
|
||||
DestVT.getTypeForMVT());
|
||||
|
||||
// Emit a store to the stack slot. Use a truncstore if the input value is
|
||||
// later than DestVT.
|
||||
SDOperand Store;
|
||||
|
||||
if (SrcSize > SlotSize)
|
||||
Store = DAG.getTruncStore(DAG.getEntryNode(), SrcOp, FIPtr,
|
||||
PseudoSourceValue::getFixedStack(),
|
||||
SPFI, SlotVT);
|
||||
PseudoSourceValue::getFixedStack(), SPFI, SlotVT,
|
||||
false, SrcAlign);
|
||||
else {
|
||||
assert(SrcSize == SlotSize && "Invalid store");
|
||||
Store = DAG.getStore(DAG.getEntryNode(), SrcOp, FIPtr,
|
||||
PseudoSourceValue::getFixedStack(),
|
||||
SPFI);
|
||||
PseudoSourceValue::getFixedStack(), SPFI,
|
||||
false, SrcAlign);
|
||||
}
|
||||
|
||||
// Result is a load from the stack slot.
|
||||
if (SlotSize == DestSize)
|
||||
return DAG.getLoad(DestVT, Store, FIPtr, NULL, 0);
|
||||
return DAG.getLoad(DestVT, Store, FIPtr, NULL, 0, false, DestAlign);
|
||||
|
||||
assert(SlotSize < DestSize && "Unknown extension!");
|
||||
return DAG.getExtLoad(ISD::EXTLOAD, DestVT, Store, FIPtr, NULL, 0, SlotVT);
|
||||
return DAG.getExtLoad(ISD::EXTLOAD, DestVT, Store, FIPtr, NULL, 0, SlotVT,
|
||||
false, DestAlign);
|
||||
}
|
||||
|
||||
SDOperand SelectionDAGLegalize::ExpandSCALAR_TO_VECTOR(SDNode *Node) {
|
||||
|
@ -1080,16 +1080,17 @@ SDOperand SelectionDAG::getMemOperand(const MachineMemOperand &MO) {
|
||||
|
||||
/// CreateStackTemporary - Create a stack temporary, suitable for holding the
|
||||
/// specified value type.
|
||||
SDOperand SelectionDAG::CreateStackTemporary(MVT VT) {
|
||||
SDOperand SelectionDAG::CreateStackTemporary(MVT VT, unsigned minAlign) {
|
||||
MachineFrameInfo *FrameInfo = getMachineFunction().getFrameInfo();
|
||||
unsigned ByteSize = VT.getSizeInBits()/8;
|
||||
const Type *Ty = VT.getTypeForMVT();
|
||||
unsigned StackAlign = (unsigned)TLI.getTargetData()->getPrefTypeAlignment(Ty);
|
||||
unsigned StackAlign =
|
||||
std::max((unsigned)TLI.getTargetData()->getPrefTypeAlignment(Ty), minAlign);
|
||||
|
||||
int FrameIdx = FrameInfo->CreateStackObject(ByteSize, StackAlign);
|
||||
return getFrameIndex(FrameIdx, TLI.getPointerTy());
|
||||
}
|
||||
|
||||
|
||||
SDOperand SelectionDAG::FoldSetCC(MVT VT, SDOperand N1,
|
||||
SDOperand N2, ISD::CondCode Cond) {
|
||||
// These setcc operations always fold.
|
||||
|
Loading…
x
Reference in New Issue
Block a user