mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-13 04:38:24 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23198 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -613,8 +613,12 @@ PPC32TargetLowering::LowerCallTo(SDOperand Chain,
|
|||||||
|
|
||||||
std::vector<MVT::ValueType> RetVals;
|
std::vector<MVT::ValueType> RetVals;
|
||||||
MVT::ValueType RetTyVT = getValueType(RetTy);
|
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)
|
if (RetTyVT != MVT::isVoid)
|
||||||
RetVals.push_back(RetTyVT);
|
RetVals.push_back(ActualRetTyVT);
|
||||||
RetVals.push_back(MVT::Other);
|
RetVals.push_back(MVT::Other);
|
||||||
|
|
||||||
SDOperand TheCall = SDOperand(DAG.getCall(RetVals,
|
SDOperand TheCall = SDOperand(DAG.getCall(RetVals,
|
||||||
@ -622,7 +626,17 @@ PPC32TargetLowering::LowerCallTo(SDOperand Chain,
|
|||||||
Chain = TheCall.getValue(RetTyVT != MVT::isVoid);
|
Chain = TheCall.getValue(RetTyVT != MVT::isVoid);
|
||||||
Chain = DAG.getNode(ISD::CALLSEQ_END, MVT::Other, Chain,
|
Chain = DAG.getNode(ISD::CALLSEQ_END, MVT::Other, Chain,
|
||||||
DAG.getConstant(NumBytes, getPointerTy()));
|
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,
|
SDOperand PPC32TargetLowering::LowerVAStart(SDOperand Chain, SDOperand VAListP,
|
||||||
|
Reference in New Issue
Block a user