Fix a problem where early legalization can cause token chain problems.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21885 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
index 8c26c58..fa50d4a 100644
--- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
@@ -130,6 +130,8 @@
   void ExpandByParts(unsigned NodeOp, SDOperand LHS, SDOperand RHS,
                      SDOperand &Lo, SDOperand &Hi);
 
+  void SpliceCallInto(const SDOperand &CallResult, SDNode *OutChain);
+
   SDOperand getIntPtrConstant(uint64_t Val) {
     return DAG.getConstant(Val, TLI.getPointerTy());
   }
@@ -1271,7 +1273,6 @@
           Node->getOpcode() == ISD::UINT_TO_FP) {
         Result = ExpandIntToFP(Node->getOpcode() == ISD::SINT_TO_FP,
                                Node->getValueType(0), Node->getOperand(0));
-        Result = LegalizeOp(Result);
         break;
       } else if (Node->getOpcode() == ISD::TRUNCATE) {
         // In the expand case, we must be dealing with a truncate, because
@@ -1530,8 +1531,6 @@
     case Expand:
       Result = ExpandIntToFP(Node->getOpcode() == ISD::SINT_TO_FP, NVT,
                              Node->getOperand(0));
-      Result = LegalizeOp(Result);
-
       // Round if we cannot tolerate excess precision.
       if (NoExcessFPPrecision)
         Result = DAG.getNode(ISD::FP_ROUND_INREG, NVT, Result, VT);
@@ -2047,8 +2046,8 @@
 }
 
 /// SpliceCallInto - Given the result chain of a libcall (CallResult), and a 
-static void SpliceCallInto(const SDOperand &CallResult, SDNode *OutChain,
-                           SelectionDAG &DAG) {
+void SelectionDAGLegalize::SpliceCallInto(const SDOperand &CallResult,
+                                          SDNode *OutChain) {
   // Nothing to splice it into?
   if (OutChain == 0) return;
 
@@ -2087,7 +2086,9 @@
   const Type *RetTy = MVT::getTypeForValueType(Node->getValueType(0));
   std::pair<SDOperand,SDOperand> CallInfo =
     TLI.LowerCallTo(InChain, RetTy, false, Callee, Args, DAG);
-  SpliceCallInto(CallInfo.second, OutChain, DAG);
+  SpliceCallInto(CallInfo.second, OutChain);
+
+  NeedsAnotherIteration = true;
 
   switch (getTypeAction(CallInfo.first.getValueType())) {
   default: assert(0 && "Unknown thing");
@@ -2176,7 +2177,7 @@
   std::pair<SDOperand,SDOperand> CallResult =
     TLI.LowerCallTo(InChain, RetTy, false, Callee, Args, DAG);
 
-  SpliceCallInto(CallResult.second, OutChain, DAG);
+  SpliceCallInto(CallResult.second, OutChain);
   return CallResult.first;
 }