Mesa (master): scons: Disable optimizations only for gcc-4.2
Jakob Bornecrantz
wallbraker at kemper.freedesktop.org
Mon Jun 29 15:37:53 UTC 2009
Module: Mesa
Branch: master
Commit: bb8f3090ba37aa3f24943fdb43c4120776289658
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=bb8f3090ba37aa3f24943fdb43c4120776289658
Author: José Fonseca <jfonseca at vmware.com>
Date: Sun Jun 28 11:12:22 2009 +0100
scons: Disable optimizations only for gcc-4.2
gcc-4.2's optimizer has a strange bug where it looses code from inner
loops in certain situations. For example, if the appearently innocent
looking code below is compiled with gcc-4.2 -S -O1, the inner loop's
code is missing from the outputed assembly.
struct Size {
unsigned width;
};
struct Command {
unsigned length;
struct Size sizes[32];
};
extern void emit_command(void *command, unsigned length);
void
create_surface( struct Size size, unsigned faces, unsigned levels)
{
struct Command cmd;
unsigned face;
unsigned level;
cmd.length = faces*levels*sizeof(cmd.sizes[0]);
for(face = 0; face < faces; ++face) {
for(level = 0; level < levels; ++level) {
cmd.sizes[face*levels + level] = size;
// This should generate a shrl statement, but the whole for body
// disappears in gcc-4.2 -O1/-O2/-O3!
size.width >>= 1;
}
}
emit(&cmd, sizeof cmd.length + cmd.length);
}
Note that this is not specific to MinGW's gcc-4.2 crosscompiler (the
version typically found in debian/ubuntu's mingw32 packages). gcc-4.2 on
Linux also displays the same error. gcc-4.3 and above gets this
correctly though.
Updated MinGW debian packages with gcc-4.3 are available from
http://people.freedesktop.org/~jrfonseca/debian/pool/main/m/
---
scons/gallium.py | 6 ++++--
1 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/scons/gallium.py b/scons/gallium.py
index b69f2f2..217478b 100644
--- a/scons/gallium.py
+++ b/scons/gallium.py
@@ -324,8 +324,10 @@ def generate(env):
if gcc:
if debug:
ccflags += ['-O0', '-g3']
- elif env['toolchain'] == 'crossmingw':
- ccflags += ['-O0', '-g3'] # mingw 4.2.1 optimizer is broken
+ elif env['CCVERSION'].startswith('4.2.'):
+ # gcc 4.2.x optimizer is broken
+ print "warning: gcc 4.2.x optimizer is broken -- disabling optimizations"
+ ccflags += ['-O0', '-g3']
else:
ccflags += ['-O3', '-g3']
if env['profile']:
More information about the mesa-commit
mailing list