[Bug target/92807] gcc generate extra move for the snippet code along with lea instruction.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92807 --- Comment #6 from liuhongt at gcc dot gnu.org --- Author: liuhongt Date: Tue Dec 17 01:29:09 2019 New Revision: 279451 URL: https://gcc.gnu.org/viewcvs?rev=279451&root=gcc&view=rev Log: Use add for a = a + b and a = b + a when possible. Since except for Bonnell, 01 fb add%edi,%ebx is faster and shorter than 8d 1c 1flea(%rdi,%rbx,1),%ebx we should use add for a = a + b and a = b + a when possible if not optimizing for Bonnell. Tested on x86-64. 2019-12-17 H.J. Lu gcc/ PR target/92807 * config/i386/i386.c (ix86_lea_outperforms): Check !TARGET_BONNELL. (ix86_avoid_lea_for_addr): When not optimizing for Bonnell, use add for a = a + b and a = b + a. gcc/testsuite/ PR target/92807 * gcc.target/i386/pr92807-1.c: New test. Added: trunk/gcc/testsuite/gcc.target/i386/pr92807-1.c Modified: trunk/gcc/ChangeLog trunk/gcc/config/i386/i386.c trunk/gcc/testsuite/ChangeLog
[Bug target/92807] gcc generate extra move for the snippet code along with lea instruction.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92807 --- Comment #5 from Sunil Pandey --- Patch link: https://gcc.gnu.org/ml/gcc-patches/2019-12/msg00450.html
[Bug target/92807] gcc generate extra move for the snippet code along with lea instruction.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92807 --- Comment #4 from H.J. Lu --- Created attachment 47424 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=47424&action=edit A patch
[Bug target/92807] gcc generate extra move for the snippet code along with lea instruction.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92807 Jakub Jelinek changed: What|Removed |Added CC||jakub at gcc dot gnu.org --- Comment #3 from Jakub Jelinek --- Well, lea has to be used in case the flags are live across it. Not the case of this PR though of course.
[Bug target/92807] gcc generate extra move for the snippet code along with lea instruction.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92807 H.J. Lu changed: What|Removed |Added Status|UNCONFIRMED |NEW Last reconfirmed||2019-12-04 Ever confirmed|0 |1 --- Comment #2 from H.J. Lu --- Shouldn't leal(%rdi,%rax), %eax be changed to addl %edi, %eax unconditionally?
[Bug target/92807] gcc generate extra move for the snippet code along with lea instruction.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92807 Sunil Pandey 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 --- $ cat t1.c #include uint32_t abs2( uint32_t a ) { uint32_t s = ((a>>15)&0x10001)*0x; 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; .align16,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 .align16,0x90 # LOE .cfi_endproc # mark_end; .type abs2,@function .size abs2,.-abs2 ..LNabs2.0: .data # -- End abs2 .data .section .note.GNU-stack, "" # End