[llvm-commits] SETCC InstructionCombining.cpp [3/3]

Reid Spencer rspencer at reidspencer.com
Fri Dec 22 18:45:41 PST 2006


On Fri, 2006-12-22 at 13:31 -0800, Chris Lattner wrote:

> 
> +    // We're performing a signed comparison.
> +    if (isSignedExt) {
> +      // Signed extend and signed comparison.
> +      if (cast<ConstantInt>(CI)->getSExtValue() < 0)// X < (small)
> --> false
> +        Result = ConstantBool::getFalse();
> +      else
> +        Result = ConstantBool::getTrue();           // X < (large)
> --> true
> +    } else {
> +      // Zero extend and signed comparison.
> +      if (cast<ConstantInt>(CI)->getSExtValue() < 0)
> +        Result = ConstantBool::getFalse();
> +      else
> +        Result = ConstantBool::getTrue();
>      }
> 
> 
> My reading of this code says that you can eliminate the 'if
> issignedext' test, as the if/then cases are the same.  Is this a bug
> or just code duplication?

I'm not Sure. The original (before any signless types changes, rev
1.525) looks like this:

      if (DestTy->isSigned()) {
        // We're performing a signed comparison.
        if (isSignSrc) {
          // Signed extend and signed comparison.
          if (cast<ConstantSInt>(CI)->getValue() < 0) // X < (small) -->
false
            Result = ConstantBool::getFalse();
          else
            Result = ConstantBool::getTrue();         // X < (large) -->
true
        } else {
          // Unsigned extend and signed comparison.
          if (cast<ConstantSInt>(CI)->getValue() < 0)
            Result = ConstantBool::getFalse();
          else
            Result = ConstantBool::getTrue();
        }

Clearly getting the ZExt value and comparing with < 0 is just silly
(unsigned is never less than zero).  I'm inclined to think this is
either a long-standing bug or just some code duplication.  I'll
eliminate the redundancy because it is clearly generating the same
results in either case. However, I'm not convinced this isn't a bug.

Reid.

> 




More information about the llvm-commits mailing list