summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2018-12-02 05:46:48 +0000
committerCraig Topper <craig.topper@intel.com>2018-12-02 05:46:48 +0000
commitec096a1dae80ef3ea128095416f62b2caeaefd60 (patch)
tree272e6f663e65d3ed61ba31ac9f000dc9c8b23a15 /llvm/lib
parent0ff50d49d1f2611a1adbeaa502d9bf7b1237d31b (diff)
downloadbcm5719-llvm-ec096a1dae80ef3ea128095416f62b2caeaefd60.tar.gz
bcm5719-llvm-ec096a1dae80ef3ea128095416f62b2caeaefd60.zip
[X86] Custom type legalize v2i32/v4i16/v8i8->i64 bitcasts in 64-bit mode similar to what's done when the destination is f64.
The generic legalizer will fall back to a stack spill that uses a truncating store. That store will get expanded into a shuffle and non-truncating store on pre-avx512 targets. Once that happens the stack store/load pair will be combined away leaving behind the shuffle and bitcasts. On avx512 targets the truncating store is legal so doesn't get folded away. By custom legalizing it we can avoid this churn and maybe produce better code. llvm-svn: 348085
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp7
1 files changed, 4 insertions, 3 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 951856b046a..f1feed63064 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -25221,7 +25221,7 @@ static SDValue LowerBITCAST(SDValue Op, const X86Subtarget &Subtarget,
if (SrcVT == MVT::v2i32 || SrcVT == MVT::v4i16 || SrcVT == MVT::v8i8 ||
SrcVT == MVT::i64) {
assert(Subtarget.hasSSE2() && "Requires at least SSE2!");
- if (DstVT != MVT::f64)
+ if (DstVT != MVT::f64 && DstVT != MVT::i64)
// This conversion needs to be expanded.
return SDValue();
@@ -25253,8 +25253,9 @@ static SDValue LowerBITCAST(SDValue Op, const X86Subtarget &Subtarget,
EVT NewVT = EVT::getVectorVT(*DAG.getContext(), SVT, NumElts * 2);
SDValue BV = DAG.getBuildVector(NewVT, dl, Elts);
- SDValue ToV2F64 = DAG.getBitcast(MVT::v2f64, BV);
- return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::f64, ToV2F64,
+ MVT V2X64VT = MVT::getVectorVT(DstVT, 2);
+ SDValue ToV2X64 = DAG.getBitcast(V2X64VT, BV);
+ return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, DstVT, ToV2X64,
DAG.getIntPtrConstant(0, dl));
}
OpenPOWER on IntegriCloud