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

Sean Silva silvas at purdue.edu
Sun Jun 10 16:29:15 PDT 2012


Unless the situation is not as symmetric as it appears, you should factor
this pattern matching into a separate static function just call it twice,
once with the parameters interchanged. That will be a lot cleaner and less
error-prone.

--Sean Silva
(sorry Ben for sending this twice, forgot to CC the list)

On Sun, Jun 10, 2012 at 1:35 PM, Benjamin Kramer
<benny.kra at googlemail.com>wrote:

> Author: d0k
> Date: Sun Jun 10 15:35:00 2012
> New Revision: 158297
>
> URL: http://llvm.org/viewvc/llvm-project?rev=158297&view=rev
> Log:
> InstCombine: Turn (zext A) == (B & (1<<X)-1) into A == (trunc B),
> narrowing the compare.
>
> This saves a cast, and zext is more expensive on platforms with subreg
> support
> than trunc is. This occurs in the BSD implementation of memchr(3), see
> PR12750.
> On the synthetic benchmark from that bug stupid_memchr and bsd_memchr have
> the
> same performance now when not inlining either function.
>
> stupid_memchr: 323.0us
> bsd_memchr: 321.0us
> memchr: 479.0us
>
> where memchr is the llvm-gcc compiled bsd_memchr from osx lion's libc. When
> inlining is enabled bsd_memchr still regresses down to llvm-gcc memchr
> time,
> I haven't fully understood the issue yet, something is grossly mangling the
> loop after inlining.
>
> Modified:
>    llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
>    llvm/trunk/test/Transforms/InstCombine/icmp.ll
>
> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp?rev=158297&r1=158296&r2=158297&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
> (original)
> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp Sun Jun
> 10 15:35:00 2012
> @@ -2580,10 +2580,32 @@
>       }
>     }
>
> +    // Transform (zext A) == (B & (1<<X)-1) --> A == (trunc B)
> +    ConstantInt *Cst1;
> +    if (Op0->hasOneUse() &&
> +        match(Op0, m_ZExt(m_Value(A))) &&
> +        match(Op1, m_And(m_Value(B), m_ConstantInt(Cst1)))) {
> +      APInt Pow2 = Cst1->getValue() + 1;
> +      if (Pow2.isPowerOf2() && isa<IntegerType>(A->getType()) &&
> +          Pow2.logBase2() ==
> cast<IntegerType>(A->getType())->getBitWidth())
> +        return new ICmpInst(I.getPredicate(), A,
> +                            Builder->CreateTrunc(B, A->getType()));
> +    }
> +
> +    // Transform (B & (1<<X)-1) == (zext A) --> A == (trunc B)
> +    if (Op1->hasOneUse() &&
> +        match(Op0, m_And(m_Value(B), m_ConstantInt(Cst1))) &&
> +        match(Op1, m_ZExt(m_Value(A)))) {
> +      APInt Pow2 = Cst1->getValue() + 1;
> +      if (Pow2.isPowerOf2() && isa<IntegerType>(A->getType()) &&
> +          Pow2.logBase2() ==
> cast<IntegerType>(A->getType())->getBitWidth())
> +        return new ICmpInst(I.getPredicate(), A,
> +                            Builder->CreateTrunc(B, A->getType()));
> +    }
> +
>     // Transform "icmp eq (trunc (lshr(X, cst1)), cst" to
>     // "icmp (and X, mask), cst"
>     uint64_t ShAmt = 0;
> -    ConstantInt *Cst1;
>     if (Op0->hasOneUse() &&
>         match(Op0, m_Trunc(m_OneUse(m_LShr(m_Value(A),
>                                            m_ConstantInt(ShAmt))))) &&
>
> Modified: llvm/trunk/test/Transforms/InstCombine/icmp.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/icmp.ll?rev=158297&r1=158296&r2=158297&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstCombine/icmp.ll (original)
> +++ llvm/trunk/test/Transforms/InstCombine/icmp.ll Sun Jun 10 15:35:00 2012
> @@ -637,3 +637,25 @@
>  ; CHECK: @test62
>  ; CHECK-NEXT: ret i1 true
>  }
> +
> +define i1 @test63(i8 %a, i32 %b) nounwind {
> +  %z = zext i8 %a to i32
> +  %t = and i32 %b, 255
> +  %c = icmp eq i32 %z, %t
> +  ret i1 %c
> +; CHECK: @test63
> +; CHECK-NEXT: %1 = trunc i32 %b to i8
> +; CHECK-NEXT: %c = icmp eq i8 %1, %a
> +; CHECK-NEXT: ret i1 %c
> +}
> +
> +define i1 @test64(i8 %a, i32 %b) nounwind {
> +  %t = and i32 %b, 255
> +  %z = zext i8 %a to i32
> +  %c = icmp eq i32 %t, %z
> +  ret i1 %c
> +; CHECK: @test64
> +; CHECK-NEXT: %1 = trunc i32 %b to i8
> +; CHECK-NEXT: %c = icmp eq i8 %1, %a
> +; CHECK-NEXT: ret i1 %c
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20120610/243d09b7/attachment.html>


More information about the llvm-commits mailing list