[gnu.gcc.bug] volatile bug & fix for 1.35

rfg@MCC.COM (Ron Guilmette) (05/14/89)

The following code, when compiled with GCC 1.35 (with Michael
Meissner's M88k patches installed) resulted in bogus code.
Specifically, although the store into the volatile int
pointed to by "vip" *was* generated correctly, the subsequent
load was *not* properly generated, and instead, the value
(of 7) which was still in a register was reused.  That's not
right!  Since "vip" points to a volatile word, that word
should be referenced again for the final executable statement
shown below.

volatile int vi;

void test ()
{
	volatile int * vip = (volatile int *) 99;

	*vip = 7;
	vi = *vip;
}

I tracked this problem down into reload1.c.  Here is a trivial
(but correct) fix that solved the problem.


diff -rc2 1.35-/reload1.c 1.35+/reload1.c
*** 1.35-/reload1.c	Thu Mar 23 08:03:42 1989
--- 1.35+/reload1.c	Sat May 13 22:06:38 1989
***************
*** 1071,1074 ****
--- 1071,1075 ----
        {
  	rtx addr = XEXP (x, 0);
+ 	rtx mem;
  	FIX_FRAME_POINTER_ADDRESS (addr, depth);
  	/* These MEMs are normally shared.  Make a changed copy;
***************
*** 1075,1079 ****
  	   don't alter the shared MEM, since it needs to be altered
  	   differently each time it occurs (since DEPTH varies).  */
! 	return gen_rtx (MEM, GET_MODE (x), addr);
        }
  
--- 1076,1082 ----
  	   don't alter the shared MEM, since it needs to be altered
  	   differently each time it occurs (since DEPTH varies).  */
! 	mem = gen_rtx (MEM, GET_MODE (x), addr);
! 	MEM_VOLATILE_P (mem) = MEM_VOLATILE_P (x);
! 	return mem;
        }