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.

Reply via email to