[Bug rtl-optimization/57067] New: Missing control flow edges for setjmp/longjmp

krebbel at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Thu Apr 25 08:23:00 GMT 2013


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57067

             Bug #: 57067
           Summary: Missing control flow edges for setjmp/longjmp
    Classification: Unclassified
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: krebbel@gcc.gnu.org


The fix for PR56982 adds abnormal control flow edges from function calls to a
setjmp call in the same function. Unfortunately these edges do not survive
until RTL so that the RTL passes might still do the wrong thing. 

The edges are removed in gimple_expand_cfg:

      /* At the moment not all abnormal edges match the RTL
         representation.  It is safe to remove them here as
         find_many_sub_basic_blocks will rediscover them.
         In the future we should get this fixed properly.  */
      if ((e->flags & EDGE_ABNORMAL)
          && !(e->flags & EDGE_SIBCALL))
        remove_edge (e);
      else
        ei_next (&ei);


find_many_sub_basic_blocks needs a fix to add them back as well.

I don't have a testcase for GCC head.  The testcase I have fails only with GCC
4.4: http://gcc.gnu.org/ml/gcc/2013-04/msg00237.html

In this case the RTL scheduler pass generates broken code due to the missing
control flow info.  I think this could potentially happen with GCC head as
well.



More information about the Gcc-bugs mailing list