Perform correct codegen for eh_dwarf_cfa intrinsic.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41316 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index 78539d4..1dde705 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
@@ -2751,11 +2751,19 @@
    case Intrinsic::eh_dwarf_cfa: {
      if (ExceptionHandling) {
        MVT::ValueType VT = getValue(I.getOperand(1)).getValueType();
+       SDOperand CfaArg;
+       if (MVT::getSizeInBits(VT) > MVT::getSizeInBits(TLI.getPointerTy()))
+         CfaArg = DAG.getNode(ISD::TRUNCATE,
+                              TLI.getPointerTy(), getValue(I.getOperand(1)));
+       else
+         CfaArg = DAG.getNode(ISD::SIGN_EXTEND,
+                              TLI.getPointerTy(), getValue(I.getOperand(1)));
+       
        SDOperand Offset = DAG.getNode(ISD::ADD,
                                       TLI.getPointerTy(),
                                       DAG.getNode(ISD::FRAME_TO_ARGS_OFFSET,
-                                                  VT),
-                                      getValue(I.getOperand(1)));
+                                                  TLI.getPointerTy()),
+                                      CfaArg);
        setValue(&I, DAG.getNode(ISD::ADD,
                                 TLI.getPointerTy(),
                                 DAG.getNode(ISD::FRAMEADDR,