http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55869



             Bug #: 55869

           Summary: different bit shift/or optimization.

    Classification: Unclassified

           Product: gcc

           Version: 4.8.0

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: tree-optimization

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: pl...@agmk.net





here're equvialent functions:



$ cat u.cpp

unsigned long long convert_1( bool flag )

{

        return (unsigned long long)(flag ? 1ull : 0ull) << 57;

}

unsigned long long convert_2( bool flag )

{

        return (unsigned long long)flag << 57;

}



current 4.7/4.8 gcc emits following different machine code:



_Z9convert_1b:



        testb   %dil, %dil      # 29    *cmpqi_ccno_1/1 [length = 3]

        movl    $0, %edx        # 32    *movdi_internal_rex64/1 [length = 5]

        movabsq $144115188075855872, %rax       # 28    *movdi_internal_rex64/3

[length = 10]

        cmove   %rdx, %rax      # 31    *movdicc_noc/1  [length = 4]

        ret     # 39    simple_return_internal  [length = 1]



_Z9convert_2b:

        movq    %rdi, %rax      # 19    *movdi_internal_rex64/2 [length = 3]

        salq    $57, %rax       # 8     *ashldi3_1/1    [length = 4]

        ret     # 27    simple_return_internal  [length = 1]





while clang/llvm emits equivalent machine code for both functions:



_Z9convert_1b:                          # @_Z9convert_1b

        movzbl  %dil, %eax

        shlq    $57, %rax

        ret



_Z9convert_2b:                          # @_Z9convert_2b

        movzbl  %dil, %eax

        shlq    $57, %rax

        ret

Reply via email to