diff options
| author | Craig Topper <craig.topper@intel.com> | 2018-10-12 22:00:04 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2018-10-12 22:00:04 +0000 |
| commit | 3e76b2d7364a7167562a58125c7646e882573032 (patch) | |
| tree | 45e6b13f6ef66278e59d2bc50b48882393a46731 /llvm/lib | |
| parent | c693a23025c1038f6896666e15df864998358ce2 (diff) | |
| download | bcm5719-llvm-3e76b2d7364a7167562a58125c7646e882573032.tar.gz bcm5719-llvm-3e76b2d7364a7167562a58125c7646e882573032.zip | |
[X86] Improve type legalization of (v2i32/v4i16/v8i16 (bitcast (v2f32))) to avoid a stack stack temporary.
llvm-svn: 344425
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index ffb5acf3386..86141965393 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -26296,7 +26296,7 @@ void X86TargetLowering::ReplaceNodeResults(SDNode *N, return; } - if (SrcVT != MVT::f64 || + if ((SrcVT != MVT::f64 && SrcVT != MVT::v2f32) || (DstVT != MVT::v2i32 && DstVT != MVT::v4i16 && DstVT != MVT::v8i8) || getTypeAction(*DAG.getContext(), DstVT) == TypeWidenVector) return; @@ -26304,12 +26304,18 @@ void X86TargetLowering::ReplaceNodeResults(SDNode *N, unsigned NumElts = DstVT.getVectorNumElements(); EVT SVT = DstVT.getVectorElementType(); EVT WiderVT = EVT::getVectorVT(*DAG.getContext(), SVT, NumElts * 2); - SDValue Expanded = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, - MVT::v2f64, N->getOperand(0)); - SDValue ToVecInt = DAG.getBitcast(WiderVT, Expanded); - SDValue Extract = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, DstVT, - ToVecInt, DAG.getIntPtrConstant(0, dl)); - Results.push_back(Extract); + SDValue Res; + if (SrcVT == MVT::f64) + Res = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, + MVT::v2f64, N->getOperand(0)); + else + Res = DAG.getNode(ISD::CONCAT_VECTORS, dl, MVT::v4f32, N->getOperand(0), + DAG.getUNDEF(MVT::v2f32)); + + Res = DAG.getBitcast(WiderVT, Res); + Res = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, DstVT, Res, + DAG.getIntPtrConstant(0, dl)); + Results.push_back(Res); return; } case ISD::MGATHER: { |

