Package: gcc-3.4
Version: 3.4.3-6
Severity: wishlist

This is a regression from gcc-3.2 in that gcc-3.2 does not have this
problem bug gcc-3.3 does.

The attached program generates the following code on i386 with
gcc -S -O2:

...

.L2:
        movl    -16(%ebp), %eax
        xorl    %esi, %esi
        testl   %eax, %eax
        je      .L8

As you can see %eax now contains the value in -16(%ebp).

        subl    $12, %esp
        movl    -16(%ebp), %eax

gcc-3.4 decides to reload for no reason at all.

        pushl   %eax
        call    strlen
        movl    %eax, %esi
        addl    $16, %esp
.L5:
        pushl   %eax
        pushl   %edi
        pushl   %ebx
        leal    2(%edi,%esi), %eax
        pushl   %eax
        call    malloc
        movl    %eax, (%esp)
        movl    %eax, %ebx
        call    mempcpy
        movl    -16(%ebp), %edi

Again the value of -16(%ebp) is in %edi.

        addl    $16, %esp
        testl   %edi, %edi
        je      .L6
        movb    $61, (%eax)
        pushl   %ecx
        pushl   %esi
        movl    -16(%ebp), %edx

gcc-3.4 decides to reload it yet again.

        pushl   %edx
        incl    %eax
        pushl   %eax
        call    mempcpy
        addl    $16, %esp

...

Cheers,

-- System Information
Debian Release: 3.1
Kernel Version: Linux gondolin 2.4.27-hx-1-686-smp #3 SMP Tue Oct 5 20:01:26 
EST 2004 i686 GNU/Linux

Versions of the packages gcc-3.4 depends on:
ii  binutils       2.15-5         The GNU assembler, linker and binary utiliti
ii  cpp-3.4        3.4.3-6        The GNU C preprocessor
ii  gcc-3.4-base   3.4.3-6        The GNU Compiler Collection (base package)
ii  libc6          2.3.2.ds1-20   GNU C Library: Shared libraries and Timezone
ii  libgcc1        3.4.3-6        GCC support library
--
typedef unsigned int size_t;
extern size_t strlen (__const char *__s) __attribute__ ((__pure__));
extern char *strchrnul (__const char *__s, int __c) __attribute__ ((__pure__));
extern void *mempcpy (void *__restrict __dest,
        __const void *__restrict __src, size_t __n) ;
extern void *malloc(size_t);

extern void setvareq(char *s, int flags);
extern char *endofname(const char *);
extern void sh_error(const char *, ...) __attribute__ ((__noreturn__));

void
setvar(const char *name, const char *val, int flags)
{
 char *p, *q;
 size_t namelen;
 char *nameeq;
 size_t vallen;

 q = endofname(name);
 p = strchrnul(q, '=');
 namelen = p - name;
 if (!namelen || p != q)
  sh_error("%.*s: bad variable name", namelen, name);
 vallen = 0;
 if (val == ((void *)0)) {
  flags |= 2;
 } else {
  vallen = strlen(val);
 }
 p = mempcpy(nameeq = malloc(namelen + vallen + 2), name, namelen);
 if (val) {
  *p++ = '=';
  p = mempcpy(p, val, vallen);
 }
 *p = '\0';
 setvareq(nameeq, flags | 1);
}


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to