https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120972

--- Comment #2 from Feng Xue <fxue at os dot amperecomputing.com> ---
(In reply to Richard Biener from comment #1)
> Yes, it's not possible to implement the standards restrict qualification
> constraints reliably for pointers not in the outermost scope of a function
> and after the compiler was allowed to do CSE or other code transforms.
> 
> For simplicity only function parameters (and select "global" cases)
> are handled in the implementation which resides in points-to analysis.
> 
> In principle 'restrict' should be handled in the C/C++ language frontends
> instead.

Maybe, I caught your point, w/o front-end scope information, we do not know the
effective lifetime of "__restrict__" pointer merely from def/use chain in the
gimple. An example:

  void foo (int *p)
  {
     int *a_escaped;

     {
       int * __restrict__ a = ...;

       /* no alias between "a" and "p" */
       *a = ...;

       /* Make "a" escaped from block scope */
       a_escaped = a + offset;
     }

    /* By source-level declaration syntax, "a_escaped" and "p" may be aliased.
But in the gimple, we do not know usage of "a_escaped" does not belongs to
lifetime constrainted by "__restrict__", and could lead to an incorrect
conclusion that "a_escaped" and "p" are alias-free. */

    *a_escaped = ...;

    ...
  }

But for the 2nd case, all pointers are defined in the outermost scope of
function. How about an enhancement? Besides parameters, we could also mark all
__restrict__ pointers declared in the outermost scope, and ignore others in any
enclosed scopes, as you said, probably this could be done that at the front-end
stage.

Reply via email to