Make sure custom lowering for LegalizeTypes
authorDuncan Sands <baldrick@free.fr>
Sat, 19 Jul 2008 16:26:02 +0000 (16:26 +0000)
committerDuncan Sands <baldrick@free.fr>
Sat, 19 Jul 2008 16:26:02 +0000 (16:26 +0000)
returns a node with the right number of
return values.  This fixes codegen of
Generic/cast-fp.ll, Generic/fp_to_int.ll
and PowerPC/multiple-return-values.ll
when using -march=ppc32 -mattr=+64bit.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53794 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PowerPC/PPCISelLowering.cpp

index 2537502bde293d2246e7fffad08c3aaa83d30ab3..ad16baa6c18505d424b0b9adacb7e240b57effb8 100644 (file)
@@ -2855,7 +2855,7 @@ SDOperand PPCTargetLowering::LowerFP_TO_SINT(SDOperand Op, SelectionDAG &DAG) {
   SDOperand Src = Op.getOperand(0);
   if (Src.getValueType() == MVT::f32)
     Src = DAG.getNode(ISD::FP_EXTEND, MVT::f64, Src);
-  
+
   SDOperand Tmp;
   switch (Op.getValueType().getSimpleVT()) {
   default: assert(0 && "Unhandled FP_TO_SINT type in custom expander!");
@@ -2866,10 +2866,10 @@ SDOperand PPCTargetLowering::LowerFP_TO_SINT(SDOperand Op, SelectionDAG &DAG) {
     Tmp = DAG.getNode(PPCISD::FCTIDZ, MVT::f64, Src);
     break;
   }
-  
+
   // Convert the FP value to an int value through memory.
   SDOperand FIPtr = DAG.CreateStackTemporary(MVT::f64);
-  
+
   // Emit a store to the stack slot.
   SDOperand Chain = DAG.getStore(DAG.getEntryNode(), Tmp, FIPtr, NULL, 0);
 
@@ -3907,7 +3907,13 @@ SDOperand PPCTargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
 SDNode *PPCTargetLowering::ReplaceNodeResults(SDNode *N, SelectionDAG &DAG) {
   switch (N->getOpcode()) {
   default: assert(0 && "Wasn't expecting to be able to lower this!");
-  case ISD::FP_TO_SINT: return LowerFP_TO_SINT(SDOperand(N, 0), DAG).Val;
+  case ISD::FP_TO_SINT: {
+    SDOperand Res = LowerFP_TO_SINT(SDOperand(N, 0), DAG);
+    // Use MERGE_VALUES to drop the chain result value and get a node with one
+    // result.  This requires turning off getMergeValues simplification, since
+    // otherwise it will give us Res back.
+    return DAG.getMergeValues(&Res, 1, false).Val;
+  }
   }
 }