This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug optimization/6585] useless memory store instructions on x86


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]