This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: RFH: Impose code-movement restrictions and value assumption (for ASYNCHRONOUS/Coarrays)


On 07/13/2011 03:27 PM, Ian Lance Taylor wrote:
The C99 restrict qualifier doesn't mean that some random function can
change the memory to which the pointer points; it means that assignments
through pointer 1 can't change the memory to which pointer 2 points.
That is, restrict is all about whether one pointer can affect another;
it doesn't say anything about functions, and in general a call to a
function can change any memory pointed to by any pointer.

That was actually my impression - thus, I wanted to have a different flag to tag asynchronous/coarray variables, which do not alias but might change until a synchronization point via single-sided communication or until a wait with asynchronous I/O/communication. As one does not know where a synchronization/waiting point is, all code movements and variable value assumptions (of such tagged variables) should be prohibited across impure function calls.


By contrast, for a normal Fortran variable without POINTER or TARGET attribute does not alias - and may not be changed asynchronously.

The latter is what I thought "restrict" (more precisely: TYPE_QUAL_RESTRICT) does, but seemingly it currently also does the former.

 From a C perspective, the trick here is to know that the address
"non_aliasing_var" does not escape the current function, and that
therefore it can not be changed by a function call.  gcc already knows
that local variables whose address is not taken do not escape the
current function.  I don't know how to express the above code in C; is
there something in there which makes the compiler think that the code is
taking the address of non_aliasing_var?  If not, this should already
work.  If so, what is it?  I.e., what does this code look like in C?

I am not sure whether there is a 100% equivalence, but it should match:


void some_function(void);

void
sub (int *restrict non_aliasing_var)
{
  *non_aliasing_var = 5;
  some_function ();
  if (*non_aliasing_var != 5)
    foobar_();
}

Also in this case, the "if" block is not optimized away with -O3.

Tobias

PS: See also just-filled PR middle-end/49733.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]