Totally bogus string optimizations

Bernd Schmidt bernds@redhat.co.uk
Sat Oct 28 12:26:00 GMT 2000


On Sat, 28 Oct 2000, Joseph S. Myers wrote:

> If this gets improved in GCC, then the strcpy macro should best be
> disabled for GCC 2.97 and later: the code generated by the macro in GCC
> CVS is terrible:
> 
> .LC0:
>         .string "Foobar"
>         .text
>         .align 16
> .globl foo
>         .type   foo,@function
> foo:
>         movl    $.LC0+1, %eax
>         subl    $12, %esp
>         cmpl    %eax, %eax
>         je      .L158

Note that there's definitely a bug in gcc's constant folding here.  This is the
part of the macro that tries to determine whether the string is made of 1 unit
wide characters by doing
  (((char *)&"Foobar"[1]) - (char *)&"Foobar"[0]) == 1
and gcc ought to optimize this away.

> while GCC 2.95.2 generates with the macro the code we want, apart from
> leaving the string constant in the code (so there *is* a regression in
> GCC):

Yes.  All this, however, is with the unaligned version of the strcpy macro.
The aligned version generates completely bogus code with all gcc versions I've
tried (2.7.2.3, 2.95.2, current).


Bernd



More information about the Libc-alpha mailing list