From 7107c10501e62d2e3ed34b349585e616b8f6da3e Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 29 Aug 2005 22:22:57 +0000 Subject: [PATCH] Fix a dumb bug of mine where we were mishandling the PPC ABI (undef handling). This fixes voronoi and bh in Olden, allowing all of olden to pass! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23133 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/PowerPC/PPCISelDAGToDAG.cpp | 31 +++++++++++++------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/lib/Target/PowerPC/PPCISelDAGToDAG.cpp b/lib/Target/PowerPC/PPCISelDAGToDAG.cpp index e7e1c9ed874..78d1cb42b87 100644 --- a/lib/Target/PowerPC/PPCISelDAGToDAG.cpp +++ b/lib/Target/PowerPC/PPCISelDAGToDAG.cpp @@ -1479,27 +1479,28 @@ SDOperand PPC32DAGToDAGISel::Select(SDOperand Op) { PPC::F8, PPC::F9, PPC::F10, PPC::F11, PPC::F12, PPC::F13 }; - for (unsigned i = 2, e = N->getNumOperands(); i != e; ++i) + for (unsigned i = 2, e = N->getNumOperands(); i != e; ++i) { + unsigned DestReg = 0; + MVT::ValueType RegTy; + if (N->getOperand(i).getValueType() == MVT::i32) { + assert(GPR_idx < 8 && "Too many int args"); + DestReg = GPR[GPR_idx++]; + RegTy = MVT::i32; + } else { + assert(MVT::isFloatingPoint(N->getOperand(i).getValueType()) && + "Unpromoted integer arg?"); + assert(FPR_idx < 13 && "Too many fp args"); + DestReg = FPR[FPR_idx++]; + RegTy = MVT::f64; // Even if this is really f32! + } + if (N->getOperand(i).getOpcode() != ISD::UNDEF) { - unsigned DestReg = 0; - MVT::ValueType RegTy; - if (N->getOperand(i).getValueType() == MVT::i32) { - assert(GPR_idx < 8 && "Too many int args"); - DestReg = GPR[GPR_idx++]; - RegTy = MVT::i32; - } else { - assert(MVT::isFloatingPoint(N->getOperand(i).getValueType()) && - "Unpromoted integer arg?"); - assert(FPR_idx < 13 && "Too many fp args"); - DestReg = FPR[FPR_idx++]; - RegTy = MVT::f64; // Even if this is really f32! - } - SDOperand Reg = CurDAG->getRegister(DestReg, RegTy); Chain = CurDAG->getNode(ISD::CopyToReg, MVT::Other, Chain, Reg, Select(N->getOperand(i))); CallOperands.push_back(Reg); } + } // Finally, once everything is in registers to pass to the call, emit the // call itself.