diff options
| author | Chris Lattner <sabre@nondot.org> | 2005-09-01 23:44:32 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2005-09-01 23:44:32 +0000 | 
| commit | 9ee867b93b5fecf2fe68518920eb1f6aa00859ef (patch) | |
| tree | 089372d76c4433f6cab638aff05a9e2c7d2c3def /llvm | |
| parent | 907123b1ab68cb45ef68b7ea69961291f0d44d7f (diff) | |
| download | bcm5719-llvm-9ee867b93b5fecf2fe68518920eb1f6aa00859ef.tar.gz bcm5719-llvm-9ee867b93b5fecf2fe68518920eb1f6aa00859ef.zip  | |
Implement small-arguments.ll:test3 by teaching the DAG optimizer that
the results of calls to functions returning small values are properly
sign/zero extended.
llvm-svn: 23198
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCISelLowering.cpp | 18 | 
1 files changed, 16 insertions, 2 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp index 5b77784819f..8490adb3c33 100644 --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -613,8 +613,12 @@ PPC32TargetLowering::LowerCallTo(SDOperand Chain,    std::vector<MVT::ValueType> RetVals;    MVT::ValueType RetTyVT = getValueType(RetTy); +  MVT::ValueType ActualRetTyVT = RetTyVT; +  if (RetTyVT >= MVT::i1 && RetTyVT <= MVT::i16) +    ActualRetTyVT = MVT::i32;   // Promote result to i32. +        if (RetTyVT != MVT::isVoid) -    RetVals.push_back(RetTyVT); +    RetVals.push_back(ActualRetTyVT);    RetVals.push_back(MVT::Other);    SDOperand TheCall = SDOperand(DAG.getCall(RetVals, @@ -622,7 +626,17 @@ PPC32TargetLowering::LowerCallTo(SDOperand Chain,    Chain = TheCall.getValue(RetTyVT != MVT::isVoid);    Chain = DAG.getNode(ISD::CALLSEQ_END, MVT::Other, Chain,                        DAG.getConstant(NumBytes, getPointerTy())); -  return std::make_pair(TheCall, Chain); +  SDOperand RetVal = TheCall; +   +  // If the result is a small value, add a note so that we keep track of the +  // information about whether it is sign or zero extended. +  if (RetTyVT != ActualRetTyVT) { +    RetVal = DAG.getNode(RetTy->isSigned() ? ISD::AssertSext : ISD::AssertZext, +                         MVT::i32, RetVal, DAG.getValueType(RetTyVT)); +    RetVal = DAG.getNode(ISD::TRUNCATE, RetTyVT, RetVal); +  } +   +  return std::make_pair(RetVal, Chain);  }  SDOperand PPC32TargetLowering::LowerVAStart(SDOperand Chain, SDOperand VAListP,  | 

