https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71916
--- Comment #13 from Jakub Jelinek <jakub at gcc dot gnu.org> --- This looks like a bug in handling of __builtin_unreachable (in RTL basic blocks without successors) during cross-jumping in jump2 pass. In *.csa there are 2 such basic blocks in the IL, but in *.jump2 only one. The __builtin_unreachable blocks are bb 34 and bb 39, and we have 4 bbs that contain d = 0 memory store following to branch to one of these basic blocks (two to bb 34, two to bb 39). Cross-jumping the d = 0 bbs that branch to the same empty block with no successors is of course fine, the problem is with cross-jumping the ones that branch to different empty blocks with no successors. For noreturn calls which is a similar case, we avoid this with /* For noreturn calls when not accumulating outgoing args force REG_ARGS_SIZE note to prevent crossjumping of calls with different args sizes. */ else if (!ACCUMULATE_OUTGOING_ARGS && (ecf_flags & ECF_NORETURN) != 0) add_reg_note (call_insn, REG_ARGS_SIZE, GEN_INT (stack_pointer_delta)); but of course for the multiple __builtin_unreachable () cases there is no instruction to stick the REG_ARGS_SIZE to.