Subject: Re: gcc de-optimisations
To: None <tech-toolchain@netbsd.org>
From: Ian Lance Taylor <ian@airs.com>
List: tech-toolchain
Date: 10/23/2005 21:13:56
Alan Barrett <apb@cequrux.com> writes:

> On Sun, 23 Oct 2005, David Laight wrote:
> > How do we stop gcc (i386) converting:
> >     if (memcmp(a, b, 16))
> > into:
> >     movl  %ecx, #16
> >     repeq cmpsb
> 
> CFLAGS += -fno-builtin-memcmp

That isn't an ideal solution, as it will prevent gcc from expanding
memcmp in any other way.

Another non-ideal solution is to compile with -Os.

> I suppose a real fix would somehow make gcc choose between the
> function call or the string operation based on various optimisation
> flags and detailed knowledge of the performance characteristics
> of the target CPU, but such a thing is far beyond my skill.  The
> relevant code is the (define_expand "cmpstrsi" ...) part of
> src/gnu/dist/gcc/gcc/config/i386/i386.md, along with tests for
> HAVE_cmpstrsi in src/gnu/dist/gcc/gcc/builtins.c.

Yes.  Some of these expansions are chosen by the processor type (see
uses of TARGET_SINGLE_STRINGOP.  For some reason memcmp isn't one of
them.  It would be appropriate to file a bug report at
http://gcc.gnu.org/bugzilla/.

Ian