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.