Your message dated Tue, 24 Jun 2008 08:16:33 +0200
with message-id <[EMAIL PROTECTED]>
and subject line Re: Bug#484784: gcc-4.3: -O2 -O3 - wrong arguments are passing 
to inlined body of function
has caused the Debian Bug report #484784,
regarding gcc-4.3: -O2 -O3 - wrong arguments are passing to inlined body of 
function
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact [EMAIL PROTECTED]
immediately.)


-- 
484784: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=484784
Debian Bug Tracking System
Contact [EMAIL PROTECTED] with problems
--- Begin Message ---
Subject: gcc-4.3: -O2 -O3 - wrong arguments are passing to inlined body of 
function
Package: gcc-4.3
Version: 4.3.0-5
Severity: important

Consider this simple program:

---bug.c---
#define N 100
char array[N];

void inline_asm(int iters) {
        __asm__ volatile (
#ifdef PRESERVE_ALL_REGS
                "pushal                         \n"
#endif
                "       xorl %%ebx, %%ebx       \n"
                "0:                             \n"
                "       movzbl (%%eax), %%edx   \n"
                "       addl %%edx, %%ebx       \n"
                "       incl %%eax              \n"
                "       decl %%ecx              \n"
                "       jnz  0b                 \n"
#ifdef PRESERVE_ALL_REGS
                "popal                          \n"
#endif
                : /* no output */
                : "a" (array),
                  "c" (iters)
                : "ebx", "edx"
        );
}


int main() {
        int n = 100;

        while (n--)
                inline_asm(N);
}
---eof---

Function inline_asm just add all values from array; all modified/input
registers are listed in __asm__ statement.

When program is compiled without any optimization flag, it works ok.
However if compiled with -O3 or -O3 --- segfaults.  I quickly analyzed
assembly output, and it is clear, that gcc fully inlined procedure,
however in a while loop only address is restored (%eax), but inner loop
counter (%ecx) isn't.  Thus in a second iteration %ecx has value 0, and
loop would execute 0xffffffff times, but segfault appear faster.

When sample program is compiled with -O3 -DPRESERVE_ALL_REGS all is
ok, because pair pushal/popal saves and restores all registers.

---bug.s---
main:
        # .. snip ...
        movl    $array, %esi
        pushl   %ebx
        pushl   %ecx
        movl    $100, %ecx      <-- ERROR: ecx is loaded only once
        .p2align 4,,7
        .p2align 3
#while
.L4:
        movl    %esi, %eax      <-- OK: eax is reloaded in every while-iteration
#APP
# 6 "bug.c" 1
        xorl %ebx, %ebx 
0:                              
        movzbl (%eax), %edx     
        addl %edx, %ebx 
        incl %eax               
        decl %ecx               
        jnz  0b                 

# 0 "" 2
#NO_APP
        addl    $1, %edi
        cmpl    $100, %edi
        jne     .L4
#endwhile
        # ... snip ...
---cut---


-- System Information:
Debian Release: lenny/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (500, 'stable')
Architecture: i386 (i686)

Kernel: Linux 2.6.25-2-686 (SMP w/2 CPU cores)
Locale: LANG=pl_PL, LC_CTYPE=pl_PL (charmap=ISO-8859-2)
Shell: /bin/sh linked to /bin/bash

Versions of packages gcc-4.3 depends on:
ii  binutils            2.18.1~cvs20080103-6 The GNU assembler, linker and bina
ii  cpp-4.3             4.3.0-5              The GNU C preprocessor
ii  gcc-4.3-base        4.3.0-5              The GNU Compiler Collection (base 
ii  libc6               2.7-12               GNU C Library: Shared libraries
ii  libgcc1             1:4.3.0-5            GCC support library
ii  libgomp1            4.3.0-5              GCC OpenMP (GOMP) support library

Versions of packages gcc-4.3 recommends:
ii  libc6-dev                     2.7-12     GNU C Library: Development Librari



--- End Message ---
--- Begin Message ---
On Sat, Jun 07, 2008 at 10:16:36AM +0200, Bastian Blank wrote:
> No bug. You cheated so the compiler is free to do whatever it wants.

Closing.

Bastian

-- 
Killing is stupid; useless!
                -- McCoy, "A Private Little War", stardate 4211.8


--- End Message ---

Reply via email to