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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Assignee|unassigned at gcc dot gnu.org      |rguenth at gcc dot 
gnu.org
   Target Milestone|---                         |9.4
     Ever confirmed|0                           |1
           Keywords|                            |ice-checking
   Last reconfirmed|                            |2020-08-07
             Status|UNCONFIRMED                 |ASSIGNED
      Known to fail|                            |9.1.0
      Known to work|                            |8.4.0

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed.  We "if-convert" to

  <bb 3> [local count: 1073741824]:
  # iter.5_3 = PHI <iter.5_4(7), 0(13)>
  # ivtmp_7 = PHI <ivtmp_8(7), 4(13)>
  t7_1 = t7.3[iter.5_3];
  vy (t7_1);
  vy (t7_1);

thus simply merge blocks.  Because the vy() calls are marked as
gimple_call_ctrl_altering_p () which is because r0 is marked
as returns twice and in qw vy is a possible source of abnormal
return.  Later when the last returns_twice call is eliminated
in the function we'd no longer need those markings but nothing
clears them (CFG cleanup does, but only when the callee itself
says so, not when circumstances no longer require the flag).

The trigger here is the cfun->has_nonlocal_label or cfun->calls_setjmp
check in call_can_make_abnormal_goto.

Now I'm not sure if CFG cleanup could simply clear the flag when
there's just a single outgoing edge but still if-conversion needs
to honor stale flags (or clear them itself?).

Reply via email to