From ee1e71e576384d0481ba05e90453ba8209bdd6f5 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Sun, 17 Dec 2017 01:35:48 +0000 Subject: [PATCH] [X86] Use extract_vector_elt instead of X86ISD::VEXTRACT for isel of vXi1 extractions. llvm-svn: 320937 --- llvm/lib/Target/X86/X86ISelLowering.cpp | 17 ++++++++++------- llvm/lib/Target/X86/X86ISelLowering.h | 3 --- llvm/lib/Target/X86/X86InstrAVX512.td | 2 +- llvm/lib/Target/X86/X86InstrFragmentsSIMD.td | 7 ++++--- llvm/test/CodeGen/X86/pr33349.ll | 8 ++++---- 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 7135be3..64121cb 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -14575,6 +14575,12 @@ static SDValue ExtractBitFromMaskVector(SDValue Op, SelectionDAG &DAG, return DAG.getAnyExtOrTrunc(Extract, dl, EltVT); } + unsigned IdxVal = cast(Idx)->getZExtValue(); + + // Extracts from element 0 are always allowed. + if (IdxVal == 0) + return Op; + // If the kshift instructions of the correct width aren't natively supported // then we need to promote the vector to the native size to get the correct // zeroing behavior. @@ -14587,12 +14593,10 @@ static SDValue ExtractBitFromMaskVector(SDValue Op, SelectionDAG &DAG, DAG.getIntPtrConstant(0, dl)); } - // Use kshiftlw/rw instruction. - unsigned IdxVal = cast(Idx)->getZExtValue(); - if (IdxVal != 0) - Vec = DAG.getNode(X86ISD::KSHIFTR, dl, VecVT, Vec, - DAG.getConstant(IdxVal, dl, MVT::i8)); - return DAG.getNode(X86ISD::VEXTRACT, dl, Op.getSimpleValueType(), Vec, + // Use kshiftr instruction to move to the lower element. + Vec = DAG.getNode(X86ISD::KSHIFTR, dl, VecVT, Vec, + DAG.getConstant(IdxVal, dl, MVT::i8)); + return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i32, Vec, DAG.getIntPtrConstant(0, dl)); } @@ -25217,7 +25221,6 @@ const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const { case X86ISD::VBROADCAST: return "X86ISD::VBROADCAST"; case X86ISD::VBROADCASTM: return "X86ISD::VBROADCASTM"; case X86ISD::SUBV_BROADCAST: return "X86ISD::SUBV_BROADCAST"; - case X86ISD::VEXTRACT: return "X86ISD::VEXTRACT"; case X86ISD::VPERMILPV: return "X86ISD::VPERMILPV"; case X86ISD::VPERMILPI: return "X86ISD::VPERMILPI"; case X86ISD::VPERM2X128: return "X86ISD::VPERM2X128"; diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h index 4db969b..8464081 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.h +++ b/llvm/lib/Target/X86/X86ISelLowering.h @@ -453,9 +453,6 @@ namespace llvm { // Broadcast subvector to vector. SUBV_BROADCAST, - // Extract vector element. - VEXTRACT, - /// SSE4A Extraction and Insertion. EXTRQI, INSERTQI, diff --git a/llvm/lib/Target/X86/X86InstrAVX512.td b/llvm/lib/Target/X86/X86InstrAVX512.td index 97c05a5..2a2286e 100644 --- a/llvm/lib/Target/X86/X86InstrAVX512.td +++ b/llvm/lib/Target/X86/X86InstrAVX512.td @@ -2768,7 +2768,7 @@ let Predicates = [HasAVX512] in { def : Pat<(maskVT (scalar_to_vector GR32:$src)), (COPY_TO_REGCLASS GR32:$src, maskRC)>; - def : Pat<(i32 (X86Vextract maskRC:$src, (iPTR 0))), + def : Pat<(i32 (X86kextract maskRC:$src, (iPTR 0))), (COPY_TO_REGCLASS maskRC:$src, GR32)>; def : Pat<(maskVT (scalar_to_vector GR8:$src)), diff --git a/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td b/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td index cb27fcc..ebbef00 100644 --- a/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td +++ b/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td @@ -465,9 +465,10 @@ def X86SubVBroadcast : SDNode<"X86ISD::SUBV_BROADCAST", def X86VBroadcast : SDNode<"X86ISD::VBROADCAST", SDTVBroadcast>; def X86VBroadcastm : SDNode<"X86ISD::VBROADCASTM", SDTVBroadcastm>; -def X86Vextract : SDNode<"X86ISD::VEXTRACT", SDTypeProfile<1, 2, - [SDTCisVec<1>, - SDTCisPtrTy<2>]>, []>; +def X86kextract : SDNode<"ISD::EXTRACT_VECTOR_ELT", + SDTypeProfile<1, 2, [SDTCisVT<0, i32>, + SDTCVecEltisVT<1, i1>, + SDTCisPtrTy<2>]>>; def X86Blendi : SDNode<"X86ISD::BLENDI", SDTBlend>; diff --git a/llvm/test/CodeGen/X86/pr33349.ll b/llvm/test/CodeGen/X86/pr33349.ll index f6d5e0e..b1428ba 100644 --- a/llvm/test/CodeGen/X86/pr33349.ll +++ b/llvm/test/CodeGen/X86/pr33349.ll @@ -48,11 +48,11 @@ target triple = "x86_64-unknown-linux-gnu" ; SKX-NEXT: fldz ; SKX-NEXT: fld %st(0) ; SKX-NEXT: fcmovne %st(2), %st(0) -; SKX-NEXT: kmovd %k1, %eax +; SKX-NEXT: kshiftrw $1, %k0, %k2 +; SKX-NEXT: kmovd %k2, %eax ; SKX-NEXT: testb $1, %al ; SKX-NEXT: fld %st(1) ; SKX-NEXT: fcmovne %st(3), %st(0) -; SKX-NEXT: kshiftrw $1, %k0, %k1 ; SKX-NEXT: kmovd %k1, %eax ; SKX-NEXT: testb $1, %al ; SKX-NEXT: fld %st(2) @@ -65,9 +65,9 @@ target triple = "x86_64-unknown-linux-gnu" ; SKX-NEXT: fxch %st(3) ; SKX-NEXT: fstpt (%rdi) ; SKX-NEXT: fxch %st(1) -; SKX-NEXT: fstpt 10(%rdi) -; SKX-NEXT: fxch %st(1) ; SKX-NEXT: fstpt 20(%rdi) +; SKX-NEXT: fxch %st(1) +; SKX-NEXT: fstpt 10(%rdi) ; SKX-NEXT: fstpt 30(%rdi) ; SKX-NEXT: retq bb: -- 2.7.4