diff options
author | Craig Topper <craig.topper@intel.com> | 2017-12-31 08:25:50 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@intel.com> | 2017-12-31 08:25:50 +0000 |
commit | 7f396235333ad1b0b4644a62cfad59d7ee101dfc (patch) | |
tree | 7cc11fe106d3b234fbaad90565524b2e25e77a68 /llvm/lib | |
parent | edb61167e5a5fe439d0f31801172f9ba8912a5b7 (diff) | |
download | llvm-7f396235333ad1b0b4644a62cfad59d7ee101dfc.zip llvm-7f396235333ad1b0b4644a62cfad59d7ee101dfc.tar.gz llvm-7f396235333ad1b0b4644a62cfad59d7ee101dfc.tar.bz2 |
[X86] Add a DAG combine to fix (v4i1 (bitcast (i4))) before type legalization sees the i4 and changes to load/store.
Same for i2 and v2i1.
llvm-svn: 321601
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 55912a2..f99bafd 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -30412,9 +30412,22 @@ static SDValue combineBitcast(SDNode *N, SelectionDAG &DAG, // (i16 movmsk (16i8 sext (v16i1 x))) // before the setcc result is scalarized on subtargets that don't have legal // vxi1 types. - if (DCI.isBeforeLegalize()) + if (DCI.isBeforeLegalize()) { if (SDValue V = combineBitcastvxi1(DAG, SDValue(N, 0), Subtarget)) return V; + + // If this is a bitcast between a MVT::v4i1/v2i1 and an illegal integer + // type, widen both sides to avoid a trip through memory. + if ((VT == MVT::v4i1 || VT == MVT::v2i1) && SrcVT.isScalarInteger() && + Subtarget.hasVLX()) { + SDLoc dl(N); + N0 = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i8, N0); + N0 = DAG.getBitcast(MVT::v8i1, N0); + return DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, VT, N0, + DAG.getIntPtrConstant(0, dl)); + } + } + // Since MMX types are special and don't usually play with other vector types, // it's better to handle them early to be sure we emit efficient code by // avoiding store-load conversions. |