[Bug target/92807] gcc generate extra move for the snippet code along with lea instruction.

skpgkp2 at gmail dot com gcc-bugzilla@gcc.gnu.org
Wed Dec 4 16:59:00 GMT 2019


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92807

Sunil Pandey <skpgkp2 at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |hjl.tools at gmail dot com,
                   |                            |skpgkp2 at gmail dot com
            Summary|gcc generate extra move for |gcc generate extra move for
                   |the snippet code            |the snippet code along with
                   |                            |lea instruction.

--- Comment #1 from Sunil Pandey <skpgkp2 at gmail dot com> ---
$ cat t1.c
#include<stdint.h>
uint32_t abs2( uint32_t a )
{
    uint32_t s = ((a>>15)&0x10001)*0xffff;
        return (a+s)^s;
}

$ gcc --version
gcc (GCC) 9.2.1 20190827 (Red Hat 9.2.1-1)
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


$ gcc -Ofast -S t1.c -o t1.s.gcc.9
$ cat t1.s.gcc.9
        .file   "t1.c"
        .text
        .p2align 4
        .globl  abs2
        .type   abs2, @function
abs2:
.LFB0:
        .cfi_startproc
        movl    %edi, %edx
        shrl    $15, %edx
        andl    $65537, %edx
        movl    %edx, %eax
        sall    $16, %eax
        subl    %edx, %eax
        movl    %eax, %edx
        leal    (%rdi,%rax), %eax
        xorl    %edx, %eax
        ret
        .cfi_endproc
.LFE0:
        .size   abs2, .-abs2
        .ident  "GCC: (GNU) 9.2.1 20190827 (Red Hat 9.2.1-1)"
        .section        .note.GNU-stack,"",@progbits


Intel compiler generate add instead of lea as well as 1 less mov instruction
for same code.

$ icc -Ofast -S t1.c -o t1.s.icc

$ cat t1.s.icc

.L_2__routine_start_abs2_0:
# -- Begin  abs2
        .text
# mark_begin;
       .align    16,0x90
        .globl abs2
# --- abs2(uint32_t)
abs2:
# parameter 1: %edi
..B1.1:                         # Preds ..B1.0
                                # Execution count [1.00e+00]
        .cfi_startproc
..___tag_value_abs2.1:
..L2:
                                                          #3.1
        movl      %edi, %edx                                    #4.23
        shrl      $15, %edx                                     #4.23
        andl      $65537, %edx                                  #4.27
        movl      %edx, %eax                                    #4.36
        shll      $16, %eax                                     #4.36
        subl      %edx, %eax                                    #4.36
        addl      %eax, %edi                                    #5.19
        xorl      %edi, %eax                                    #5.22
        ret                                                     #5.22
        .align    16,0x90
                                # LOE
        .cfi_endproc
# mark_end;
        .type   abs2,@function
        .size   abs2,.-abs2
..LNabs2.0:
        .data
# -- End  abs2
        .data
        .section .note.GNU-stack, ""
# End


More information about the Gcc-bugs mailing list