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

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
The DECL_EXTERNAL is what should make the difference but IIRC a errno.h
with a tentative definition would be conforming, no?  And that woudln't
be DECL_EXTERNAL ...


TREE_READONLY should be handled more generally,

  /* If the reference is based on a decl that is not aliased the call
     cannot possibly clobber it.  */
  if (DECL_P (base)
      && !may_be_aliased (base)
      /* But local non-readonly statics can be modified through recursion
         or the call may implement a threading barrier which we must
         treat as may-def.  */
      && (TREE_READONLY (base)
          || !is_global_var (base)))
    return false;

gives a hint (but doesn't apply here due to the var being address-taken).
I think we could split out

 if (DECL_P (base)
     && TREE_READONLY (base))
   return false;

?  I know I'm usually overly cautionous with const vs non-const, but on
decls it should work.  OTOH...

int var;
const int const_var __attribute__((alias("var")));

is likely a valid way to "document" that some parts cannot modify 'var'
but for

int foo()
{
  int tem = const_var;
  bar ();
  return const_var;
}

we cannot elide the second load because bar() might modify it via a store
to 'var'.

Likewise interposing a const int def with a non-const int def is probably
OK.

Thus we'd need to ask the varpool if 'base' is prevailing, look at the
ultimate alias target and only take that vars const-ness into account...
(ick).

Reply via email to