https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94359
--- Comment #3 from Iain Sandoe <iains at gcc dot gnu.org> --- Note1 : the 32b multilib works without any error. Note2 : The dumps are gimple from symmetric-transfer-00-basic.C.020t.fixup_cfg1 which is the pass after all the coroutine-specific stuff is complete. thus, For O0 (produces the error saying it can't tail call): <bb 25> : actor.continue.ret: actor.continue = VIEW_CONVERT_EXPR<struct coroutine_handle>(D.38505); _38 = std::__n4835::coroutine_handle<void>::address (&actor.continue); _39 = MEM[(void (*<Te3>) (void *) *)_38]; _39 (_38); [tail call] [must tail call] goto <bb 38>; [INV] ... <bb 38> : <bb 39> : actor.continue = {CLOBBER}; <bb 40> : <L55>: return; ==== for O2 (execute fails, because without the tail-call we overflow the stack). <bb 14> : actor.continue.ret: frame_ptr->__resume_at = 6; _22 = &frame_ptr->__lv.1.1.aw; D.38734 = Loopy<int>::loopy_awaiter::await_suspend (_22, frame_ptr->__self_h); [return slot optimization] actor.continue = VIEW_CONVERT_EXPR<struct coroutine_handle>(D.38734); _38 = std::__n4835::coroutine_handle<void>::address (&actor.continue); _39 = MEM[(void (*<Te3>) (void *) *)_38]; _39 (_38); [tail call] goto <bb 21>; [INV] ... <bb 21> : actor.suspend.ret: <L63>: actor.continue = {CLOBBER}; return;