http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58920
Eric Botcazou <ebotcazou at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2013-10-30
CC| |ebotcazou at gcc dot gnu.org
Ever confirmed|0 |1
--- Comment #3 from Eric Botcazou <ebotcazou at gcc dot gnu.org> ---
> The TREE_THIS_NOTRAP macro came up in email the other day, and it seemed to
> me that it would be useful to set on C++ references, since they are required
> to refer to objects; trying to read from a null reference gives undefined
> behavior. So I tried the attached patch. But it breaks all the ext_pointer
> tests in libstdc++.
>
> Basically, what's happening is that there is a code path which is never
> taken which leads to an explicit null dereference. The optimizers see this
> happening within a loop and decide to hoist it out of the loop. So now it
> is executed before the loop starts, and causes a SEGV.
If the dereference can generate a SEGV before being moved and nevertheless has
the TREE_THIS_NOTRAP flag, then this is the bug and loop invariant motion does
not make things worse.
As Andrew explained, you cannot set TREE_THIS_NOTRAP on all references. In
Ada,
we set it only on parameters passed by reference, but it needs to be cleared
during inlining because of this kind of issues.