[llvm-commits] [llvm] r171270 - in /llvm/trunk: lib/Transforms/InstCombine/InstCombineAndOrXor.cpp test/Transforms/InstCombine/icmp.ll
Jakub Staszak
kubastaszak at gmail.com
Mon Dec 31 10:32:48 PST 2012
Thanks, added in r171310.
- Kuba
On Dec 31, 2012, at 1:38 PM, Nuno Lopes <nunoplopes at sapo.pt> wrote:
> 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