This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug tree-optimization/58920] Overeager optimization based on TREE_THIS_NOTRAP


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.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]