This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/58920] Overeager optimization based on TREE_THIS_NOTRAP
- From: "ebotcazou at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Wed, 30 Oct 2013 10:04:09 +0000
- Subject: [Bug tree-optimization/58920] Overeager optimization based on TREE_THIS_NOTRAP
- Auto-submitted: auto-generated
- References: <bug-58920-4 at http dot gcc dot gnu dot org/bugzilla/>
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.