This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug optimization/6585] useless memory store instructions on x86
- From: "steven at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 4 Jul 2003 11:09:34 -0000
- Subject: [Bug optimization/6585] useless memory store instructions on x86
- References: <20020506130600.6585.bruno@clisp.org>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
PLEASE REPLY TO gcc-bugzilla@gcc.gnu.org ONLY, *NOT* gcc-bugs@gcc.gnu.org.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=6585
steven at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
Last reconfirmed|0000-00-00 00:00:00 |2003-07-04 11:09:34
date| |
Target Milestone|--- |3.4
------- Additional Comments From steven at gcc dot gnu dot org 2003-07-04 11:09 -------
AFAICT this looks a little better, but still not optimal:
.file "6585.c"
# GNU C version 3.4 20030703 (experimental) (i686-pc-linux-gnu)
# compiled by GNU C version 3.4 20030703 (experimental).
# GGC heuristics: --param ggc-min-expand=47 --param ggc-min-heapsize=31916
# options passed: -O3 -fverbose-asm -march=i686 -mtune=i686
# -fomit-frame-pointer
# options enabled: -feliminate-unused-debug-types -fdefer-pop
# -fomit-frame-pointer -foptimize-sibling-calls -funit-at-a-time
# -fcse-follow-jumps -fcse-skip-blocks -fexpensive-optimizations
# -fthread-jumps -fstrength-reduce -funswitch-loops -fpeephole -fforce-mem
# -ffunction-cse -fkeep-static-consts -fcaller-saves -fpcc-struct-return
# -fgcse -fgcse-lm -fgcse-sm -floop-optimize -fcrossjumping -fif-conversion
# -fif-conversion2 -frerun-cse-after-loop -frerun-loop-opt
# -fdelete-null-pointer-checks -fschedule-insns2 -fsched-interblock
# -fsched-spec -fbranch-count-reg -freorder-blocks -freorder-functions
# -frename-registers -fcprop-registers -fcommon -fverbose-asm -fgnu-linker
# -fregmove -foptimize-register-move -fargument-alias -fstrict-aliasing
# -fmerge-constants -fzero-initialized-in-bss -fident -fpeephole2
# -fguess-branch-probability -fmath-errno -ftrapping-math -m80387
# -mhard-float -mno-soft-float -mieee-fp -mfp-ret-in-387
# -maccumulate-outgoing-args -mno-red-zone -mtls-direct-seg-refs
# -mtune=i686 -march=i686
.text
.p2align 4,,15
.globl mul
.type mul, @function
mul:
subl $20, %esp #
movl 32(%esp), %ecx # load b0 in ecx
movl %edi, 12(%esp) # save %edi
movl 24(%esp), %eax # load a0 in eax
movl %ebx, 8(%esp) # save %ebx
movl 36(%esp), %edi # load b1 in edi
movl %ebp, 16(%esp) # save %ebp !!! USELESS
movl 16(%esp), %ebp # restore %ebp !!! USELESS
mull %ecx # %edx:%eax := a0*b0
movl %edx, %ebx # save high part (==%edx) in %ebx
movl 28(%esp), %edx # load a1 in %edx
movl %eax, (%esp) # save %eax (now a0*b0 in ebx:(%esp))
movl 24(%esp), %eax # load a0 in eax
imull %edx, %ecx # %eax := a1*b0
imull %edi, %eax # %eax := b1*%eax
movl 12(%esp), %edi # restore edi
addl %eax, %ebx # compute final result...
leal (%ebx,%ecx), %eax #...
movl 8(%esp), %ebx # restore ebx
movl %eax, 4(%esp) # Why not just: movl %eax,%edx
movl 4(%esp), %edx # !!! USELESS
movl (%esp), %eax # movl (%esp), %eax
addl $20, %esp #
ret
.size mul, .-mul
.section .note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.4 20030703 (experimental)"
Especially the last "USELESS" is surprising. Why go through the stack here?!