From: Craig Topper Date: Sun, 24 Apr 2016 06:27:39 +0000 (+0000) Subject: [X86] Merge LowerCTLZ and LowerCTLZ_ZERO_UNDEF into a single function that branches... X-Git-Tag: llvmorg-3.9.0-rc1~8137 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=dbc981f71fa2f000c4c58b8be8e9aae9eeee0d9f;p=platform%2Fupstream%2Fllvm.git [X86] Merge LowerCTLZ and LowerCTLZ_ZERO_UNDEF into a single function that branches internally for the one difference, allowing the rest of the code to be common. NFC llvm-svn: 267331 --- diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index eb65a80..2ec27bd 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -18661,6 +18661,7 @@ SDValue X86TargetLowering::LowerFLT_ROUNDS_(SDValue Op, // split the vector, perform operation on it's Lo a Hi part and // concatenate the results. static SDValue LowerVectorCTLZ_AVX512(SDValue Op, SelectionDAG &DAG) { + assert(Op.getOpcode() == ISD::CTLZ); SDLoc dl(Op); MVT VT = Op.getSimpleValueType(); MVT EltVT = VT.getVectorElementType(); @@ -18691,8 +18692,8 @@ static SDValue LowerVectorCTLZ_AVX512(SDValue Op, SelectionDAG &DAG) { std::tie(Lo, Hi) = DAG.SplitVector(Op.getOperand(0), dl); MVT OutVT = MVT::getVectorVT(EltVT, NumElems/2); - Lo = DAG.getNode(Op.getOpcode(), dl, OutVT, Lo); - Hi = DAG.getNode(Op.getOpcode(), dl, OutVT, Hi); + Lo = DAG.getNode(ISD::CTLZ, dl, OutVT, Lo); + Hi = DAG.getNode(ISD::CTLZ, dl, OutVT, Hi); return DAG.getNode(ISD::CONCAT_VECTORS, dl, VT, Lo, Hi); } @@ -18716,6 +18717,7 @@ static SDValue LowerCTLZ(SDValue Op, SelectionDAG &DAG) { MVT OpVT = VT; unsigned NumBits = VT.getSizeInBits(); SDLoc dl(Op); + unsigned Opc = Op.getOpcode(); if (VT.isVector()) return LowerVectorCTLZ_AVX512(Op, DAG); @@ -18731,42 +18733,18 @@ static SDValue LowerCTLZ(SDValue Op, SelectionDAG &DAG) { SDVTList VTs = DAG.getVTList(OpVT, MVT::i32); Op = DAG.getNode(X86ISD::BSR, dl, VTs, Op); - // If src is zero (i.e. bsr sets ZF), returns NumBits. - SDValue Ops[] = { - Op, - DAG.getConstant(NumBits + NumBits - 1, dl, OpVT), - DAG.getConstant(X86::COND_E, dl, MVT::i8), - Op.getValue(1) - }; - Op = DAG.getNode(X86ISD::CMOV, dl, OpVT, Ops); - - // Finally xor with NumBits-1. - Op = DAG.getNode(ISD::XOR, dl, OpVT, Op, - DAG.getConstant(NumBits - 1, dl, OpVT)); - - if (VT == MVT::i8) - Op = DAG.getNode(ISD::TRUNCATE, dl, MVT::i8, Op); - return Op; -} - -static SDValue LowerCTLZ_ZERO_UNDEF(SDValue Op, SelectionDAG &DAG) { - MVT VT = Op.getSimpleValueType(); - EVT OpVT = VT; - unsigned NumBits = VT.getSizeInBits(); - SDLoc dl(Op); - - Op = Op.getOperand(0); - if (VT == MVT::i8) { - // Zero extend to i32 since there is not an i8 bsr. - OpVT = MVT::i32; - Op = DAG.getNode(ISD::ZERO_EXTEND, dl, OpVT, Op); + if (Opc == ISD::CTLZ) { + // If src is zero (i.e. bsr sets ZF), returns NumBits. + SDValue Ops[] = { + Op, + DAG.getConstant(NumBits + NumBits - 1, dl, OpVT), + DAG.getConstant(X86::COND_E, dl, MVT::i8), + Op.getValue(1) + }; + Op = DAG.getNode(X86ISD::CMOV, dl, OpVT, Ops); } - // Issue a bsr (scan bits in reverse). - SDVTList VTs = DAG.getVTList(OpVT, MVT::i32); - Op = DAG.getNode(X86ISD::BSR, dl, VTs, Op); - - // And xor with NumBits-1. + // Finally xor with NumBits-1. Op = DAG.getNode(ISD::XOR, dl, OpVT, Op, DAG.getConstant(NumBits - 1, dl, OpVT)); @@ -21270,8 +21248,8 @@ SDValue X86TargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const { case ISD::INIT_TRAMPOLINE: return LowerINIT_TRAMPOLINE(Op, DAG); case ISD::ADJUST_TRAMPOLINE: return LowerADJUST_TRAMPOLINE(Op, DAG); case ISD::FLT_ROUNDS_: return LowerFLT_ROUNDS_(Op, DAG); - case ISD::CTLZ: return LowerCTLZ(Op, DAG); - case ISD::CTLZ_ZERO_UNDEF: return LowerCTLZ_ZERO_UNDEF(Op, DAG); + case ISD::CTLZ: + case ISD::CTLZ_ZERO_UNDEF: return LowerCTLZ(Op, DAG); case ISD::CTTZ: case ISD::CTTZ_ZERO_UNDEF: return LowerCTTZ(Op, DAG); case ISD::MUL: return LowerMUL(Op, Subtarget, DAG);