[llvm-commits] [llvm] r119922 - in /llvm/trunk: lib/Target/README.txt lib/Transforms/InstCombine/InstCombineCompares.cpp test/Transforms/InstCombine/icmp.ll
Duncan Sands
baldrick at free.fr
Sun Nov 21 09:04:42 PST 2010
Hi Chris, actually I think now that the transform is correct in all cases.
Sorry for the noise,
Duncan.
>> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp (original)
>> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp Sun Nov 21 00:44:42 2010
>> @@ -1744,14 +1744,84 @@
>> // simplify this comparison. For example, (x&4)< 8 is always true.
>> switch (I.getPredicate()) {
>> default: llvm_unreachable("Unknown icmp opcode!");
>> - case ICmpInst::ICMP_EQ:
>> + case ICmpInst::ICMP_EQ: {
>> if (Op0Max.ult(Op1Min) || Op0Min.ugt(Op1Max))
>> return ReplaceInstUsesWith(I, ConstantInt::getFalse(I.getContext()));
>> +
>> + // If all bits are known zero except for one, then we know at most one
>> + // bit is set. If the comparison is against zero, then this is a check
>> + // to see if *that* bit is set.
>> + APInt Op0KnownZeroInverted = ~Op0KnownZero;
>
> If Op0KnownZeroInverted has only one bit set, then I don't think you know that
> that bit is actually set in the original value, you only know that you were
> unable to prove that the bit was zero. If the bit is zero rather than one, then
> isn't the second transform below potentially wrong (the first one looks ok):
>
>> + // If the LHS is 8>>u x, and we know the result is a power of 2 like 1,
>> + // then turn "((8>>u x)&1) == 0" into "x == 3".
>> + ConstantInt *CI = 0;
>> + if (Op0KnownZeroInverted == 1&&
>> + match(LHS, m_LShr(m_ConstantInt(CI), m_Value(X)))&&
>> + CI->getValue().isPowerOf2()) {
>> + unsigned CmpVal = CI->getValue().countTrailingZeros();
>> + return new ICmpInst(ICmpInst::ICMP_EQ, X,
>> + ConstantInt::get(X->getType(), CmpVal));
>> + }
>> + }
>
> ^ This one, if in fact all bits are zero but it was only possible to prove that
> all bits except bit 0 are zero.
>
> Ciao,
>
> Duncan.
> _______________________________________________
> 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