[ValueTracking] Calculate the KnownZeros for Intrinsic::ctpop without using a tempora...
authorCraig Topper <craig.topper@gmail.com>
Fri, 14 Apr 2017 06:43:34 +0000 (06:43 +0000)
committerCraig Topper <craig.topper@gmail.com>
Fri, 14 Apr 2017 06:43:34 +0000 (06:43 +0000)
The APInt was created from an 'unsigned' and we just wanted to know how many bits the value needed to represent it. We can just use Log2_32 from MathExtras.h to get the info.

llvm-svn: 300309

llvm/lib/Analysis/ValueTracking.cpp

index 8479bc7..d871e83 100644 (file)
@@ -1428,11 +1428,8 @@ static void computeKnownBitsFromOperator(const Operator *I, APInt &KnownZero,
         // We can bound the space the count needs.  Also, bits known to be zero
         // can't contribute to the population.
         unsigned BitsPossiblySet = BitWidth - KnownZero2.countPopulation();
-        unsigned LeadingZeros =
-          APInt(BitWidth, BitsPossiblySet).countLeadingZeros();
-        assert(LeadingZeros <= BitWidth);
-        KnownZero.setHighBits(LeadingZeros);
-        KnownOne &= ~KnownZero;
+        unsigned LowBits = Log2_32(BitsPossiblySet)+1;
+        KnownZero.setBitsFrom(LowBits);
         // TODO: we could bound KnownOne using the lower bound on the number
         // of bits which might be set provided by popcnt KnownOne2.
         break;