Fixup PPC Darwin i1 argument handling
authorHal Finkel <hfinkel@anl.gov>
Thu, 6 Mar 2014 00:45:19 +0000 (00:45 +0000)
committerHal Finkel <hfinkel@anl.gov>
Thu, 6 Mar 2014 00:45:19 +0000 (00:45 +0000)
Like on other targets, we need to zero_extend/truncate i1 args before copying
them to GPRs.

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

lib/Target/PowerPC/PPCISelLowering.cpp
test/CodeGen/PowerPC/ppc32-i1-vaarg.ll

index dce6051b182d1e98d46416d910328830ef758cdd..680112da9a8a6a79fd442ac1b71855200f20e29a 100644 (file)
@@ -2777,6 +2777,10 @@ PPCTargetLowering::LowerFormalArguments_Darwin(
         if (GPR_idx != Num_GPR_Regs) {
           unsigned VReg = MF.addLiveIn(GPR[GPR_idx], &PPC::GPRCRegClass);
           ArgVal = DAG.getCopyFromReg(Chain, dl, VReg, MVT::i32);
+
+          if (ObjectVT == MVT::i1)
+            ArgVal = DAG.getNode(ISD::TRUNCATE, dl, MVT::i1, ArgVal);
+
           ++GPR_idx;
         } else {
           needsLoad = true;
@@ -4414,6 +4418,9 @@ PPCTargetLowering::LowerCall_Darwin(SDValue Chain, SDValue Callee,
     case MVT::i32:
     case MVT::i64:
       if (GPR_idx != NumGPRs) {
+        if (Arg.getValueType() == MVT::i1)
+          Arg = DAG.getNode(ISD::ZERO_EXTEND, dl, PtrVT, Arg);
+
         RegsToPass.push_back(std::make_pair(GPR[GPR_idx++], Arg));
       } else {
         LowerMemOpCallTo(DAG, MF, Chain, Arg, PtrOff, SPDiff, ArgOffset,
index 096ea384f0527f12ddecb6844a5380e8a5ffa92f..6e0aec27b7c1bc5a0d3ed81c0b9eb2f7264ca22e 100644 (file)
@@ -1,4 +1,5 @@
 ; RUN: llc < %s -march=ppc32 -mcpu=ppc32 | FileCheck %s
+; RUN: llc < %s -march=ppc32 -mcpu=ppc32 -mtriple=powerpc-darwin | FileCheck %s -check-prefix=CHECK-D
 target triple = "powerpc-unknown-linux-gnu"
 
 declare void @printf(i8*, ...)
@@ -13,3 +14,7 @@ define void @main() {
 ; CHECK-DAG: crxor 6, 6, 6
 ; CHECK: bl printf
 
+; CHECK-D-LABEL: @main
+; CHECK-D: li r4, 0
+; CHECK-D: bl L_printf$stub
+