diff options
| author | Craig Topper <craig.topper@intel.com> | 2018-12-02 05:46:48 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2018-12-02 05:46:48 +0000 |
| commit | ec096a1dae80ef3ea128095416f62b2caeaefd60 (patch) | |
| tree | 272e6f663e65d3ed61ba31ac9f000dc9c8b23a15 /llvm/lib | |
| parent | 0ff50d49d1f2611a1adbeaa502d9bf7b1237d31b (diff) | |
| download | bcm5719-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.cpp | 7 |
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)); } |

