On Tue, Jul 19, 2022 at 5:17 PM Alexander Monakov via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > The testcase in the PR demonstrates how it is possible for one > __builtin_setjmp_receiver label to appear in > nonlocal_goto_handler_labels list twice (after the block with > __builtin_setjmp_setup referring to it was duplicated). > > remove_node_from_insn_list did not account for this possibility and > removed only the first copy from the list. Add an assert verifying that > duplicates are not present. > > To avoid adding a label to the list twice, move registration of the > label from __builtin_setjmp_setup handling to __builtin_setjmp_receiver.
Eric is probably most familiar with this, but can you make sure to bootstrap and test this on a SJLJ EH target? I'm not sure --enable-sjlj-exceptions is well tested anywhere but on targets not supporting DWARF EH and the configury is a bit odd suggesting the option is mostly ignored ... Richard. > gcc/ChangeLog: > > PR rtl-optimization/101347 > * builtins.cc (expand_builtin) [BUILT_IN_SETJMP_SETUP]: Move > population of nonlocal_goto_handler_labels from here ... > (expand_builtin) [BUILT_IN_SETJMP_RECEIVER]: ... to here. > * rtlanal.cc (remove_node_from_insn_list): Verify that a > duplicate is not present in the remainder of the list. > --- > gcc/builtins.cc | 15 +++++++-------- > gcc/rtlanal.cc | 1 + > 2 files changed, 8 insertions(+), 8 deletions(-) > > diff --git a/gcc/builtins.cc b/gcc/builtins.cc > index e6816d5c8..12a688dd8 100644 > --- a/gcc/builtins.cc > +++ b/gcc/builtins.cc > @@ -7467,15 +7467,7 @@ expand_builtin (tree exp, rtx target, rtx subtarget, > machine_mode mode, > tree label = TREE_OPERAND (CALL_EXPR_ARG (exp, 1), 0); > rtx_insn *label_r = label_rtx (label); > > - /* This is copied from the handling of non-local gotos. */ > expand_builtin_setjmp_setup (buf_addr, label_r); > - nonlocal_goto_handler_labels > - = gen_rtx_INSN_LIST (VOIDmode, label_r, > - nonlocal_goto_handler_labels); > - /* ??? Do not let expand_label treat us as such since we would > - not want to be both on the list of non-local labels and on > - the list of forced labels. */ > - FORCED_LABEL (label) = 0; > return const0_rtx; > } > break; > @@ -7488,6 +7480,13 @@ expand_builtin (tree exp, rtx target, rtx subtarget, > machine_mode mode, > rtx_insn *label_r = label_rtx (label); > > expand_builtin_setjmp_receiver (label_r); > + nonlocal_goto_handler_labels > + = gen_rtx_INSN_LIST (VOIDmode, label_r, > + nonlocal_goto_handler_labels); > + /* ??? Do not let expand_label treat us as such since we would > + not want to be both on the list of non-local labels and on > + the list of forced labels. */ > + FORCED_LABEL (label) = 0; > return const0_rtx; > } > break; > diff --git a/gcc/rtlanal.cc b/gcc/rtlanal.cc > index ec95ecd6c..56da7435a 100644 > --- a/gcc/rtlanal.cc > +++ b/gcc/rtlanal.cc > @@ -2899,6 +2899,7 @@ remove_node_from_insn_list (const rtx_insn *node, > rtx_insn_list **listp) > else > *listp = temp->next (); > > + gcc_checking_assert (!in_insn_list_p (temp->next (), node)); > return; > } > > -- > 2.35.1 >