summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2018-10-12 22:00:04 +0000
committerCraig Topper <craig.topper@intel.com>2018-10-12 22:00:04 +0000
commit3e76b2d7364a7167562a58125c7646e882573032 (patch)
tree45e6b13f6ef66278e59d2bc50b48882393a46731 /llvm/lib/Target/X86
parentc693a23025c1038f6896666e15df864998358ce2 (diff)
downloadbcm5719-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/Target/X86')
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp20
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: {
OpenPOWER on IntegriCloud