Volatile MEMs in statement expressions and functions inlined as trees

Alexandre Oliva aoliva@redhat.com
Thu Dec 6 16:24:00 GMT 2001


On Dec  6, 2001, Linus Torvalds <torvalds@transmeta.com> wrote:

> In article <or4rn9fqka.fsf@free.redhat.lsd.ic.unicamp.br> you write:
>> 
>> volatile int *p, *q, r;
>> 
>> void foo() {
>> *p = *q = r; // don't load *p back
>> }

> Does this still load off "q"?

Yup.  I'm pretty sure I read somewhere that this should be done, but I
can't find the reference now and, in fact, some reading of the C99 and
C++ Standards seem to imply that *q shouldn't be re-loaded.

> 	*q = r;		// read 'r' just once, write to 'q'
> 	*p = *q;	// read 'q' again, write it to 'p'

> (the latter seems to be what at least older versions of gcc reads into
> it). 

Yup.  Perhaps the `somewhere' where I read it was some GCC
documentation or source file :-(

[checks]

Yeah, I see this in expr.c:

      /* If target is volatile, ANSI requires accessing the value
	 *from* the target, if it is accessed.  So make that happen.
	 In no case return the target itself.  */
      if (! MEM_VOLATILE_P (target) && want_value)
	dont_return_target = 1;

Do we want to change this?  Perhaps some older C standard imposed this
requirement?

-- 
Alexandre Oliva   Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
Red Hat GCC Developer                  aoliva@{cygnus.com, redhat.com}
CS PhD student at IC-Unicamp        oliva@{lsd.ic.unicamp.br, gnu.org}
Free Software Evangelist    *Please* write to mailing lists, not to me



More information about the Gcc-patches mailing list