C compiler bug (optimizer), Irix 3.3.1

Mike Gigante mg at GODZILLA.CGL.RMIT.OZ.AU
Fri May 3 13:49:42 AEST 1991


In the following code:

void
  drawbbox(struct bbox bb)
{
  float v[7][3];
  int i;

  /*
   * a close enough approximation...
   */
  v[0][0] = bb.x1;
  v[0][1] = bb.y1;
  v[0][2] = bb.z1;

  v[1][0] = bb.x2;
  v[1][1] = bb.y1;
  v[1][2] = bb.z1;

  v[2][0] = bb.x2;
  v[2][1] = bb.y2;
  v[2][2] = bb.z1;

  v[3][0] = bb.x1;
  v[3][1] = bb.y2;
  v[3][2] = bb.z1;

  v[4][0] = bb.x1;
  v[4][1] = bb.y2;
  v[4][2] = bb.z2;

  v[5][0] = bb.x2;
  v[5][1] = bb.y2;
  v[5][2] = bb.z2;

  v[6][0] = bb.x2;
  v[6][1] = bb.y1;
  v[6][2] = bb.z2;  (*)

  v[7][0] = bb.x1;
  v[7][1] = bb.y1;
  v[7][2] = bb.z2;  (**)

  bgnclosedline();
  for(i=0; i < 8; i++)
    v3f(v[i]);
  endclosedline();
}

I get an incorrectly draw bbox. Ok, so I did the following:


  bgnclosedline();
  for(i=0; i < 8; i++) {
    v3f(v[i]);
    printf("bbox: %f %f %f\n", v[i][0], v[i][1], v[i][2]);
  }
  endclosedline();

and lo and behold, it tells me that the Z value for the last point is
wrong while for the second last point, it is correct. A quick look at
the assignment code shows that in both positions, (see * & **), reveals
that this should *not* happen.

The cure was to declare v to be 

	volatile v[8][3];

and change the v3f call to

	v3f((float *)v[i]);

An alternative solution is to use -O0, but that doesn't appeal for other
reasons :-)

Mike Gigante,
ACGC
Royal Melbourne Institute of Technology



More information about the Comp.sys.sgi mailing list