https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113466
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- Well, this simply highlights that the CFG doesn't really match "returns-twice". The "returns-twice" part is just (void) // no return value but only the SJLJ __builtin_setjmp_setup/receiver has this properly handled. If we wanted to apply this in a more general form then a function T __attribute__((returns_twice)) fn (ARGS ...); would have to be represented like <bb 2> fn (ARGS ...); <bb 3> T retval = .RECEIVE (); where there's two incoming edges into BB 3 (one abnormal) and just a fallthru from BB2 to BB3. IIRC the two outgoing edges from the receive part are just a code motion barrier. So there should never be PHIs necessary for the call arguments. You could make sure to put the correct argument on the fallthru to the call and simply put uninit SSA names on the abnormal entry. I think that should work as far as correctness is concerned.