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.

Reply via email to