From: Ulrich Weigand Date: Tue, 31 Mar 2015 19:28:50 +0000 (+0000) Subject: [SystemZ] Address review comments for r233689 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a9204bb532cb1bce50532ba385e3655300124022;p=llvm [SystemZ] Address review comments for r233689 Change lowerCTPOP to: - Gracefully handle a known-zero input value - Simplify computation of significant bit size Thanks to Jay Foad for the review! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@233736 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/SystemZ/SystemZISelLowering.cpp b/lib/Target/SystemZ/SystemZISelLowering.cpp index e0cb376d11d..9e75306e0e5 100644 --- a/lib/Target/SystemZ/SystemZISelLowering.cpp +++ b/lib/Target/SystemZ/SystemZISelLowering.cpp @@ -2319,12 +2319,13 @@ SDValue SystemZTargetLowering::lowerCTPOP(SDValue Op, Op = Op.getOperand(0); APInt KnownZero, KnownOne; DAG.computeKnownBits(Op, KnownZero, KnownOne); - uint64_t Mask = ~KnownZero.getZExtValue(); + unsigned NumSignificantBits = (~KnownZero).getActiveBits(); + if (NumSignificantBits == 0) + return DAG.getConstant(0, VT); // Skip known-zero high parts of the operand. - int64_t BitSize = OrigBitSize; - while ((Mask & ((((uint64_t)1 << (BitSize / 2)) - 1) << (BitSize / 2))) == 0) - BitSize = BitSize / 2; + int64_t BitSize = (int64_t)1 << Log2_32_Ceil(NumSignificantBits); + BitSize = std::min(BitSize, OrigBitSize); // The POPCNT instruction counts the number of bits in each byte. Op = DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i64, Op);