[llvm-commits] [llvm] r171270 - in /llvm/trunk: lib/Transforms/InstCombine/InstCombineAndOrXor.cpp test/Transforms/InstCombine/icmp.ll

Nuno Lopes nunoplopes at sapo.pt
Mon Dec 31 04:38:24 PST 2012


This patch almost confused me.. It is correct because we have the invariant 
that C1 <= C2.
BTW, you should add a 'CHECK: ret i1 %2' line to the test, otherwise it 
won't check that the 'or' instruction was replaced as intended.

Nuno

----- Original Message -----
> Author: kuba
> Date: Sun Dec 30 18:34:55 2012
> New Revision: 171270
>
> URL: http://llvm.org/viewvc/llvm-project?rev=171270&view=rev
> Log:
> Transform (A == C1 || A == C2) into (A & ~(C1 ^ C2)) == C1
> if C1 and C2 differ only with one bit.
> Fixes PR14708.
>
> Modified:
>    llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
>    llvm/trunk/test/Transforms/InstCombine/icmp.ll
>
> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp?rev=171270&r1=171269&r2=171270&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp 
> (original)
> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp Sun Dec 
> 30 18:34:55 2012
> @@ -1524,6 +1524,18 @@
>         AddCST = ConstantExpr::getSub(AddOne(RHSCst), LHSCst);
>         return Builder->CreateICmpULT(Add, AddCST);
>       }
> +
> +      if (LHS->getOperand(0) == RHS->getOperand(0)) {
> +        // if LHSCst and RHSCst differ with only one bit:
> +        // (A == C1 || A == C2) -> (A & ~(C1 ^ C2)) == C1
> +        APInt Xor = LHSCst->getValue() ^ RHSCst->getValue();
> +        if (Xor.isPowerOf2()) {
> +          Value *NegCst = Builder->getInt(~Xor);
> +          Value *And = Builder->CreateAnd(LHS->getOperand(0), NegCst);
> +          return Builder->CreateICmp(ICmpInst::ICMP_EQ, And, LHSCst);
> +        }
> +      }
> +
>       break;                         // (X == 13 | X == 15) -> no change
>     case ICmpInst::ICMP_UGT:         // (X == 13 | X u> 14) -> no change
>     case ICmpInst::ICMP_SGT:         // (X == 13 | X s> 14) -> no change
>
> Modified: llvm/trunk/test/Transforms/InstCombine/icmp.ll
> URL: 
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/icmp.ll?rev=171270&r1=171269&r2=171270&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstCombine/icmp.ll (original)
> +++ llvm/trunk/test/Transforms/InstCombine/icmp.ll Sun Dec 30 18:34:55 
> 2012
> @@ -694,3 +694,14 @@
>   %cmp = icmp sgt i32 %and, 30
>   ret i1 %cmp
> }
> +
> +; PR14708
> +; CHECK: @test69
> +; CHECK: %1 = and i32 %c, -33
> +; CHECK: %2 = icmp eq i32 %1, 65
> +define i1 @test69(i32 %c) nounwind uwtable {
> +  %1 = icmp eq i32 %c, 97
> +  %2 = icmp eq i32 %c, 65
> +  %3 = or i1 %1, %2
> +  ret i1 %3
> +}
>
>
> _______________________________________________
> 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