diff options
| author | José Fonseca <jfonseca@vmware.com> | 2009-06-28 11:12:22 +0100 | 
|---|---|---|
| committer | José Fonseca <jfonseca@vmware.com> | 2009-06-28 11:12:22 +0100 | 
| commit | bb8f3090ba37aa3f24943fdb43c4120776289658 (patch) | |
| tree | a2079dcea02c8302eb1fbe6ab078c48a4286711b /src/mesa/drivers/dri/s3v/s3v_tris.c | |
| parent | 72ad039d19e033baff774b184ece9ffbfef4a2ff (diff) | |
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/
Diffstat (limited to 'src/mesa/drivers/dri/s3v/s3v_tris.c')
0 files changed, 0 insertions, 0 deletions
