forked from OSchip/llvm-project
Make sure custom lowering for LegalizeTypes
returns a node with the right number of return values. This fixes codegen of Generic/cast-fp.ll, Generic/fp_to_int.ll and PowerPC/multiple-return-values.ll when using -march=ppc32 -mattr=+64bit. llvm-svn: 53794
This commit is contained in:
parent
82510bf0e3
commit
2a28791789
|
@ -2855,7 +2855,7 @@ SDOperand PPCTargetLowering::LowerFP_TO_SINT(SDOperand Op, SelectionDAG &DAG) {
|
||||||
SDOperand Src = Op.getOperand(0);
|
SDOperand Src = Op.getOperand(0);
|
||||||
if (Src.getValueType() == MVT::f32)
|
if (Src.getValueType() == MVT::f32)
|
||||||
Src = DAG.getNode(ISD::FP_EXTEND, MVT::f64, Src);
|
Src = DAG.getNode(ISD::FP_EXTEND, MVT::f64, Src);
|
||||||
|
|
||||||
SDOperand Tmp;
|
SDOperand Tmp;
|
||||||
switch (Op.getValueType().getSimpleVT()) {
|
switch (Op.getValueType().getSimpleVT()) {
|
||||||
default: assert(0 && "Unhandled FP_TO_SINT type in custom expander!");
|
default: assert(0 && "Unhandled FP_TO_SINT type in custom expander!");
|
||||||
|
@ -2866,10 +2866,10 @@ SDOperand PPCTargetLowering::LowerFP_TO_SINT(SDOperand Op, SelectionDAG &DAG) {
|
||||||
Tmp = DAG.getNode(PPCISD::FCTIDZ, MVT::f64, Src);
|
Tmp = DAG.getNode(PPCISD::FCTIDZ, MVT::f64, Src);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert the FP value to an int value through memory.
|
// Convert the FP value to an int value through memory.
|
||||||
SDOperand FIPtr = DAG.CreateStackTemporary(MVT::f64);
|
SDOperand FIPtr = DAG.CreateStackTemporary(MVT::f64);
|
||||||
|
|
||||||
// Emit a store to the stack slot.
|
// Emit a store to the stack slot.
|
||||||
SDOperand Chain = DAG.getStore(DAG.getEntryNode(), Tmp, FIPtr, NULL, 0);
|
SDOperand Chain = DAG.getStore(DAG.getEntryNode(), Tmp, FIPtr, NULL, 0);
|
||||||
|
|
||||||
|
@ -3907,7 +3907,13 @@ SDOperand PPCTargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
|
||||||
SDNode *PPCTargetLowering::ReplaceNodeResults(SDNode *N, SelectionDAG &DAG) {
|
SDNode *PPCTargetLowering::ReplaceNodeResults(SDNode *N, SelectionDAG &DAG) {
|
||||||
switch (N->getOpcode()) {
|
switch (N->getOpcode()) {
|
||||||
default: assert(0 && "Wasn't expecting to be able to lower this!");
|
default: assert(0 && "Wasn't expecting to be able to lower this!");
|
||||||
case ISD::FP_TO_SINT: return LowerFP_TO_SINT(SDOperand(N, 0), DAG).Val;
|
case ISD::FP_TO_SINT: {
|
||||||
|
SDOperand Res = LowerFP_TO_SINT(SDOperand(N, 0), DAG);
|
||||||
|
// Use MERGE_VALUES to drop the chain result value and get a node with one
|
||||||
|
// result. This requires turning off getMergeValues simplification, since
|
||||||
|
// otherwise it will give us Res back.
|
||||||
|
return DAG.getMergeValues(&Res, 1, false).Val;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue