Fix type mismatches when passing f32 values to calls
authorChris Lattner <sabre@nondot.org>
Tue, 30 Aug 2005 21:28:19 +0000 (21:28 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 30 Aug 2005 21:28:19 +0000 (21:28 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23159 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PowerPC/PPCISelDAGToDAG.cpp

index 2cbf6a2f8bb32e41891af16db6dc2ec9ad5ac4a7..2d797d7d1bbe103ae7de8bbebb9a99cc9905d9a5 100644 (file)
@@ -1520,8 +1520,13 @@ SDOperand PPC32DAGToDAGISel::Select(SDOperand Op) {
       }
 
       if (N->getOperand(i).getOpcode() != ISD::UNDEF) {
-        Chain = CurDAG->getCopyToReg(Chain, DestReg,
-                                     Select(N->getOperand(i)), InFlag);
+        SDOperand Val = Select(N->getOperand(i));
+        if (Val.getValueType() != RegTy) {
+          // Use a register-register copy to handle f32 values in f64 registers.
+          assert(Val.getValueType() == MVT::f32 && RegTy == MVT::f64);
+          Val = CurDAG->getTargetNode(PPC::FMR, MVT::f64, Val);
+        }
+        Chain = CurDAG->getCopyToReg(Chain, DestReg, Val, InFlag);
         InFlag = Chain.getValue(1);
         CallOperands.push_back(CurDAG->getRegister(DestReg, RegTy));
       }