optimization/6585: useless memory store instructions on x86

Bruno Haible bruno@clisp.org
Wed Apr 23 12:54:00 GMT 2003


>     Bruno, I can verify your problem with 3.2, but I get
>     significantly better code with 3.2.2. Can you say a word
>     whether the new code satisfies you?

No, the new code is somewhat better, but still exhibits three problems:
- The dead store is still there.
- The prologue still saves and restores an unused register.
- The final reshuffling of registers before return is suboptimal.

=========================== mul.c ===============================
long long mul (long long a, long long b) {
  return a * b;
}
=================================================================

$ gcc -v
Reading specs from /packages/gnu-inst-gcc/3.2.2/lib/gcc-lib/i686-pc-linux-gnu/3.2.2/specs
Configured with: ../configure --prefix=/packages/gnu-inst-gcc/3.2.2 --enable-shared --enable-version-specific-runtime-libs --enable-nls --enable-threads=posix --enable-__cxa_atexit
Thread model: posix
gcc version 3.2.2

$ gcc -O6 -fomit-frame-pointer -S mul.c
$ cat mul.s
        .file   "mul.c"
        .text
        .p2align 4,,15
.globl mul
        .type   mul,@function
mul:
        subl    $20, %esp
        movl    24(%esp), %eax		a0
        movl    %ebx, 8(%esp)				save %ebx
        movl    32(%esp), %ebx		b0
        movl    %esi, 12(%esp)				save %esi
        movl    36(%esp), %ecx		b1
        movl    %edi, 16(%esp)				save %edi USELESS!
        movl    16(%esp), %edi				restore %edi USELESS!
        mull    %ebx			%edx:%eax := a0*b0
        movl    %edx, %esi
        movl    %eax, (%esp)
        movl    24(%esp), %eax		a0
        movl    %edx, 4(%esp)				USELESS!
        imull   %ecx, %eax		a0*b1
        addl    %eax, %esi
        movl    28(%esp), %eax		a1
        imull   %eax, %ebx		a1*b0
        leal    (%ebx,%esi), %eax
        movl    12(%esp), %esi
        movl    8(%esp), %ebx
        movl    %eax, 4(%esp)		! Could be simplified to 2 instructions:
        movl    (%esp), %eax		! movl    %eax, %edx
        movl    4(%esp), %edx		! movl    (%esp), %eax
        addl    $20, %esp
        ret
.Lfe1:
        .size   mul,.Lfe1-mul
        .ident  "GCC: (GNU) 3.2.2"



More information about the Gcc-bugs mailing list