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

Chris Lattner clattner at apple.com
Mon Mar 19 19:39:16 PDT 2007


> APIntify the isHighOnes utility function.

> Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
> diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.667  
> llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.668
> --- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.667	Mon  
> Mar 19 16:10:28 2007
> +++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp	Mon Mar 19  
> 16:29:50 2007
> @@ -3491,14 +3491,15 @@
>  // isHighOnes - Return true if the constant is of the form 1+0+.
>  // This is the same as lowones(~X).
>  static bool isHighOnes(const ConstantInt *CI) {
> -  uint64_t V = ~CI->getZExtValue();
> -  if (~V == 0) return false;  // 0's does not match "1+"
> +  if (CI->getValue() == 0) return false;  // 0's does not match "1+"

Why not call isZero() ?

> +
> +  APInt V(~CI->getValue());
>
>    // There won't be bits set in parts that the type doesn't contain.
> -  V &= ConstantInt::getAllOnesValue(CI->getType())->getZExtValue();
> +  V &= APInt::getAllOnesValue(CI->getType()->getBitWidth());

This is an obvious no-op, please remove it.

> -  uint64_t U = V+1;  // If it is low ones, this should be a power  
> of two.
> -  return U && V && (U & V) == 0;
> +  APInt U(V+1);  // If it is low ones, this should be a power of two.
> +  return (U!=0) && (V!=0) && (U & V) == 0;
>  }

Please change this to ispoweroftwo(V+1), at which point you can drop  
the isZero check above.

-Chris

>
>  /// getICmpCode - Encode a icmp predicate into a three bit mask.   
> These bits
>
>
>
> _______________________________________________
> 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