[llvm-commits] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp

Reid Spencer rspencer at reidspencer.com
Mon Mar 19 14:21:27 PDT 2007


On Mon, 2007-03-19 at 14:16 -0700, Chris Lattner wrote:
> > Implement isOneBitSet in terms of APInt::countPopulation.
> 
> > @@ -3474,8 +3474,7 @@
> >  // isOneBitSet - Return true if there is exactly one bit set in  
> > the specified
> >  // constant.
> >  static bool isOneBitSet(const ConstantInt *CI) {
> > -  uint64_t V = CI->getZExtValue();
> > -  return V && (V & (V-1)) == 0;
> > +  return CI->getValue().countPopulation() == 1;
> >  }
> 
> Are you sure this is a good idea?  countPopulation is *much* slower  
> than a couple of and's and a subtract.

Its the temporary construction of APInts that makes the performance of
the existing algorithm poor. This will construct 3 temporaries, each
potentially with a malloc. Using countPopulation is constant time (I
agree, not super fast, but consistent) and much easier to read in the
code.  

> 
> -Chris
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list