[llvm-commits] [llvm] r170576 - in /llvm/trunk: lib/Target/X86/README.txt lib/Transforms/InstCombine/InstCombineCompares.cpp test/Transforms/InstCombine/icmp.ll
Nadav Rotem
nrotem at apple.com
Wed Dec 19 12:17:42 PST 2012
Okay, I can see that Duncan reviewed it. Thanks.
On Dec 19, 2012, at 12:15 PM, "Redmond, Paul" <paul.redmond at intel.com> wrote:
> Sorry, I should reply to the thread on llvm-dev--the patch was reviewed there.
>
> paul
>
> On 2012-12-19, at 3:04 PM, Nadav Rotem wrote:
>
>> code review ?
>>
>> On Dec 19, 2012, at 11:47 AM, Paul Redmond <paul.redmond at intel.com> wrote:
>>
>>> Author: predmond
>>> Date: Wed Dec 19 13:47:13 2012
>>> New Revision: 170576
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=170576&view=rev
>>> Log:
>>> Transform (x&C)>V into (x&C)!=0 where possible
>>>
>>> When the least bit of C is greater than V, (x&C) must be greater than V
>>> if it is not zero, so the comparison can be simplified.
>>>
>>> Although this was suggested in Target/X86/README.txt, it benefits any
>>> architecture with a directly testable form of AND.
>>>
>>> Patch by Kevin Schoedel
>>>
>>> Modified:
>>> llvm/trunk/lib/Target/X86/README.txt
>>> llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
>>> llvm/trunk/test/Transforms/InstCombine/icmp.ll
>>>
>>> Modified: llvm/trunk/lib/Target/X86/README.txt
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/README.txt?rev=170576&r1=170575&r2=170576&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/lib/Target/X86/README.txt (original)
>>> +++ llvm/trunk/lib/Target/X86/README.txt Wed Dec 19 13:47:13 2012
>>> @@ -1568,43 +1568,6 @@
>>> Core 2, and "Generic"
>>>
>>> //===---------------------------------------------------------------------===//
>>> -
>>> -Testcase:
>>> -int a(int x) { return (x & 127) > 31; }
>>> -
>>> -Current output:
>>> - movl 4(%esp), %eax
>>> - andl $127, %eax
>>> - cmpl $31, %eax
>>> - seta %al
>>> - movzbl %al, %eax
>>> - ret
>>> -
>>> -Ideal output:
>>> - xorl %eax, %eax
>>> - testl $96, 4(%esp)
>>> - setne %al
>>> - ret
>>> -
>>> -This should definitely be done in instcombine, canonicalizing the range
>>> -condition into a != condition. We get this IR:
>>> -
>>> -define i32 @a(i32 %x) nounwind readnone {
>>> -entry:
>>> - %0 = and i32 %x, 127 ; <i32> [#uses=1]
>>> - %1 = icmp ugt i32 %0, 31 ; <i1> [#uses=1]
>>> - %2 = zext i1 %1 to i32 ; <i32> [#uses=1]
>>> - ret i32 %2
>>> -}
>>> -
>>> -Instcombine prefers to strength reduce relational comparisons to equality
>>> -comparisons when possible, this should be another case of that. This could
>>> -be handled pretty easily in InstCombiner::visitICmpInstWithInstAndIntCst, but it
>>> -looks like InstCombiner::visitICmpInstWithInstAndIntCst should really already
>>> -be redesigned to use ComputeMaskedBits and friends.
>>> -
>>> -
>>> -//===---------------------------------------------------------------------===//
>>> Testcase:
>>> int x(int a) { return (a&0xf0)>>4; }
>>>
>>>
>>> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp?rev=170576&r1=170575&r2=170576&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp (original)
>>> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp Wed Dec 19 13:47:13 2012
>>> @@ -1226,6 +1226,16 @@
>>> ICI.setOperand(0, NewAnd);
>>> return &ICI;
>>> }
>>> +
>>> + // Replace ((X & AndCST) > RHSV) with ((X & AndCST) != 0), if any
>>> + // bit set in (X & AndCST) will produce a result greater than RHSV.
>>> + if (ICI.getPredicate() == ICmpInst::ICMP_UGT) {
>>> + unsigned NTZ = AndCST->getValue().countTrailingZeros();
>>> + if ((NTZ < AndCST->getBitWidth()) &&
>>> + APInt::getOneBitSet(AndCST->getBitWidth(), NTZ).ugt(RHSV))
>>> + return new ICmpInst(ICmpInst::ICMP_NE, LHSI,
>>> + Constant::getNullValue(RHS->getType()));
>>> + }
>>> }
>>>
>>> // Try to optimize things like "A[i]&42 == 0" to index computations.
>>>
>>> Modified: llvm/trunk/test/Transforms/InstCombine/icmp.ll
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/icmp.ll?rev=170576&r1=170575&r2=170576&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/test/Transforms/InstCombine/icmp.ll (original)
>>> +++ llvm/trunk/test/Transforms/InstCombine/icmp.ll Wed Dec 19 13:47:13 2012
>>> @@ -677,3 +677,20 @@
>>> ; CHECK-NEXT: ret i1 true
>>> ret i1 %cmp
>>> }
>>> +
>>> +; CHECK: @test67
>>> +; CHECK: %and = and i32 %x, 96
>>> +; CHECK: %cmp = icmp ne i32 %and, 0
>>> +define i1 @test67(i32 %x) nounwind uwtable {
>>> + %and = and i32 %x, 127
>>> + %cmp = icmp sgt i32 %and, 31
>>> + ret i1 %cmp
>>> +}
>>> +
>>> +; CHECK: @test68
>>> +; CHECK: %cmp = icmp ugt i32 %and, 30
>>> +define i1 @test68(i32 %x) nounwind uwtable {
>>> + %and = and i32 %x, 127
>>> + %cmp = icmp sgt i32 %and, 30
>>> + ret i1 %cmp
>>> +}
>>>
>>>
>>> _______________________________________________
>>> 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