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

Benjamin Kramer benny.kra at googlemail.com
Mon Jun 11 01:04:41 PDT 2012


On 11.06.2012, at 01:29, Sean Silva wrote:

> 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.

Right, the code is indeed duplicated. I fused the two ifs in r158301. Thanks Sean!

- Ben

> 
> --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
> 





More information about the llvm-commits mailing list