summaryrefslogtreecommitdiff
path: root/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2010-06-26 18:22:20 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2010-06-26 18:22:20 +0000
commit72d13ff755fe8484c89468252f945ba23fe98f71 (patch)
tree053e915fdae2948c982c6009a8bf4fd0413dd164 /lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp
parentde4fe231392165c7566081fb3f86aee4f6a4e0d6 (diff)
downloadllvm-72d13ff755fe8484c89468252f945ba23fe98f71.tar.gz
llvm-72d13ff755fe8484c89468252f945ba23fe98f71.tar.bz2
llvm-72d13ff755fe8484c89468252f945ba23fe98f71.tar.xz
When splitting a VAARG, remember its alignment.
This produces terrible but correct code. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106952 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp')
-rw-r--r--lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp9
1 files changed, 7 insertions, 2 deletions
diff --git a/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp b/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp
index 88e1e624ae..71adb33617 100644
--- a/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp
+++ b/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp
@@ -238,12 +238,17 @@ void DAGTypeLegalizer::ExpandRes_NormalLoad(SDNode *N, SDValue &Lo,
}
void DAGTypeLegalizer::ExpandRes_VAARG(SDNode *N, SDValue &Lo, SDValue &Hi) {
- EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
+ EVT OVT = N->getValueType(0);
+ EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), OVT);
SDValue Chain = N->getOperand(0);
SDValue Ptr = N->getOperand(1);
DebugLoc dl = N->getDebugLoc();
+ const unsigned OldAlign = N->getConstantOperandVal(3);
+ const Type *Type = OVT.getTypeForEVT(*DAG.getContext());
+ const unsigned TypeAlign = TLI.getTargetData()->getABITypeAlignment(Type);
+ const unsigned Align = std::max(OldAlign, TypeAlign);
- Lo = DAG.getVAArg(NVT, dl, Chain, Ptr, N->getOperand(2));
+ Lo = DAG.getVAArg(NVT, dl, Chain, Ptr, N->getOperand(2), Align);
Hi = DAG.getVAArg(NVT, dl, Lo.getValue(1), Ptr, N->getOperand(2));
// Handle endianness of the load.