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?).