[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#448370: gcc-4.2: gcc screws up "-mtune" when "-march=native" is used



Package: gcc-4.2
Version: 4.2.2-3
Severity: normal



The option "-march=native" can be used to set the target architecture
from the current host (and "-mtune=native" should do the same thing for
tuning).

By my reading of the docs, "-march=native" should otherwise work just
like any other -march option, in particular, if -mtune is not specified,
it should default to the result of -march.

However, that's not what happens.  In fact, what seems to happen is that
"-march=native" is specified, gcc defaults to -mtune=generic (which
yields very crappy code in many cases).  It doesn't work to specify
-mtune=native (that just ends up as -mtune=generic again), so the only
way to actually get good code is to explicitly specify a cpu type for
-mtune -- and I presume it's exactly this annoyance the -mxxx=native
option was supposed to make unnecessary!

Here's some tests run on a pentium3 machine, grepping the output of
-fverbose-asm to see the concrete target type the compiler chose (the
output was also verified by looking at the code -- gcc generates very
different code for a floating point abs operation on different targets):

   $ echo 'float x(float x){return x < 0 ? -x : x;}' > x.c

First try just -march=native:

   $ gcc -fverbose-asm -O2 -mfpmath=sse -march=native -S x.c

This result in arch=pentium3, but tune=generic:

   $ grep '\(-march\|-mtune\)' x.s
   # options passed:  -march=pentium3 -mtune=generic -mfpmath=sse -auxbase -O2

Ok, so try explicitly saying -mtune=native too:

   $ gcc -fverbose-asm -O2 -mfpmath=sse -march=native -mtune=native -S x.c

Nope:

   $ grep '\(-march\|-mtune\)' x.s
   # options passed:  -march=pentium3 -mtune=generic -mfpmath=sse -auxbase -O2

Now try explicitly specifying -march=pentium3, but keeping -mtune=native:

   $ gcc -fverbose-asm -O2 -mfpmath=sse -march=pentium3 -mtune=native -S x.c

Ugh:

   $ grep '\(-march\|-mtune\)' x.s
   # options passed:  -mtune=generic -mfpmath=sse -march=pentium3 -auxbase -O2

Finally, just explicitly specify -march=pentium3:

   $ gcc -fverbose-asm -O2 -mfpmath=sse -march=pentium3 -S x.c

Ok finally gcc chose the right default:

   $ grep '\(-march\|-mtune\)' x.s
   # options passed:  -mfpmath=sse -march=pentium3 -auxbase -O2 -fverbose-asm

Version info:

   $ head -2 x.s
	   .file	"x.c"
   # GNU C version 4.2.3 20071014 (prerelease) (Debian 4.2.2-3) (i486-linux-gnu)


Thanks,

-Miles



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

Kernel: Linux 2.6.22.7 (PREEMPT)
Locale: LANG=ja_JP.UTF-8, LC_CTYPE=ja_JP.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash

Versions of packages gcc-4.2 depends on:
ii  binutils                      2.18-1     The GNU assembler, linker and bina
ii  cpp-4.2                       4.2.2-3    The GNU C preprocessor
ii  gcc-4.2-base                  4.2.2-3    The GNU Compiler Collection (base 
ii  libc6                         2.6.1-6    GNU C Library: Shared libraries
ii  libgcc1                       1:4.2.2-3  GCC support library
ii  libgomp1                      4.2.2-3    GCC OpenMP (GOMP) support library

Versions of packages gcc-4.2 recommends:
ii  libc6-dev                     2.6.1-6    GNU C Library: Development Librari

-- no debconf information




Reply to: