diff mbox series

Fix -fcompare-debug failure on pr84146.c (PR target/84146)

Message ID 20180207223658.GT5867@tucnak
State New
Headers show
Series Fix -fcompare-debug failure on pr84146.c (PR target/84146) | expand

Commit Message

Jakub Jelinek Feb. 7, 2018, 10:36 p.m. UTC
Hi!

Unfortunately, seems my rest_of_insert_endbranch fix doesn't fix
-fcompare-debug on the testcase, when adding the endbr after the setjmp
call with no note in between, we add it into the same bb as the setjmp call,
while when adding it with -g with NOTE_INSN_CALL_ARG_LOCATION, which is
already outside of the bb, we add it outside of bb.

This patch fixes it by removing lots of code:
 22 files changed, 50 insertions(+), 205 deletions(-)
instead of sticking the call arg location info into a separate note that
is required to be adjacent to the call and thus requires lots of special
cases everywhere we emit it as a REG_CALL_ARG_LOCATION note in REG_NOTES
directly on the call.
All we need to ensure is that we remove that reg note before emitting
-fcompare-debug final insns dump, and need to unshare the rtl in there
(apparently rtl sharing verification ignores
NOTE_INSN_{CALL_ARG,VAR}_LOCATION notes, but of course not REG_NOTES).

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2018-02-07  Jakub Jelinek  <jakub@redhat.com>

	PR target/84146
	* reg-notes.def (REG_CALL_ARG_LOCATION): New reg note.
	* insn-notes.def (NOTE_INSN_CALL_ARG_LOCATION): Remove.
	* var-tracking.c (emit_note_insn_var_location): Remove all references
	to NOTE_INSN_CALL_ARG_LOCATION.
	(emit_notes_in_bb): Emit arguments as REG_CALL_ARG_LOCATION note on
	the CALL_INSN rather than separate NOTE_INSN_CALL_ARG_LOCATION note.
	Use copy_rtx_if_shared.
	* dwarf2out.c (gen_subprogram_die): Use XEXP with 0 instead of
	NOTE_VAR_LOCATION on ca_loc->call_arg_loc_note.
	(dwarf2out_var_location): Remove handling of
	NOTE_INSN_CALL_ARG_LOCATION, instead handle REG_CALL_ARG_LOCATION note
	on call_insn.
	* final.c (final_scan_insn): Remove all references to
	NOTE_INSN_CALL_ARG_LOCATION.
	(rest_of_clean_state): Likewise.  Remove REG_CALL_ARG_LOCATION notes
	before dumping final insns.
	* except.c (emit_note_eh_region_end): Remove all references to
	NOTE_INSN_CALL_ARG_LOCATION.
	* config/alpha/alpha.c (alpha_pad_function_end): Likewise.
	* config/c6x/c6x.c (c6x_gen_bundles): Likewise.
	* config/arc/arc.c (hwloop_optimize): Likewise.
	* config/arm/arm.c (create_fix_barrier): Likewise.
	* config/s390/s390.c (s390_chunkify_start): Likewise.
	* config/sh/sh.c (find_barrier): Likewise.
	* config/i386/i386.c (rest_of_insert_endbranch,
	ix86_seh_fixup_eh_fallthru): Likewise.
	* config/xtensa/xtensa.c (hwloop_optimize): Likewise.
	* config/iq2000/iq2000.c (final_prescan_insn): Likewise.
	* config/frv/frv.c (frv_function_prologue): Likewise.
	* emit-rtl.c (try_split): Likewise.  Copy over REG_CALL_ARG_LOCATION
	reg note.
	(note_outside_basic_block_p): Remove all references to
	NOTE_INSN_CALL_ARG_LOCATION.
	* gengtype.c (adjust_field_rtx_def): Likewise.
	* print-rtl.c (rtx_writer::print_rtx_operand_code_0, print_insn):
	Likewise.
	* jump.c (cleanup_barriers, delete_related_insns): Likewise.
	* cfgrtl.c (force_nonfallthru_and_redirect): Likewise.

	* gcc.target/i386/pr84146.c: Add -fcompare-debug to dg-options.


	Jakub

Comments

Paul Hua March 1, 2018, 1:19 a.m. UTC | #1
Hi Jakub:

It's introduce a regression on mips target.
see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84623.

Paul hua


On Thu, Feb 8, 2018 at 6:36 AM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> Unfortunately, seems my rest_of_insert_endbranch fix doesn't fix
> -fcompare-debug on the testcase, when adding the endbr after the setjmp
> call with no note in between, we add it into the same bb as the setjmp call,
> while when adding it with -g with NOTE_INSN_CALL_ARG_LOCATION, which is
> already outside of the bb, we add it outside of bb.
>
> This patch fixes it by removing lots of code:
>  22 files changed, 50 insertions(+), 205 deletions(-)
> instead of sticking the call arg location info into a separate note that
> is required to be adjacent to the call and thus requires lots of special
> cases everywhere we emit it as a REG_CALL_ARG_LOCATION note in REG_NOTES
> directly on the call.
> All we need to ensure is that we remove that reg note before emitting
> -fcompare-debug final insns dump, and need to unshare the rtl in there
> (apparently rtl sharing verification ignores
> NOTE_INSN_{CALL_ARG,VAR}_LOCATION notes, but of course not REG_NOTES).
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> 2018-02-07  Jakub Jelinek  <jakub@redhat.com>
>
>         PR target/84146
>         * reg-notes.def (REG_CALL_ARG_LOCATION): New reg note.
>         * insn-notes.def (NOTE_INSN_CALL_ARG_LOCATION): Remove.
>         * var-tracking.c (emit_note_insn_var_location): Remove all references
>         to NOTE_INSN_CALL_ARG_LOCATION.
>         (emit_notes_in_bb): Emit arguments as REG_CALL_ARG_LOCATION note on
>         the CALL_INSN rather than separate NOTE_INSN_CALL_ARG_LOCATION note.
>         Use copy_rtx_if_shared.
>         * dwarf2out.c (gen_subprogram_die): Use XEXP with 0 instead of
>         NOTE_VAR_LOCATION on ca_loc->call_arg_loc_note.
>         (dwarf2out_var_location): Remove handling of
>         NOTE_INSN_CALL_ARG_LOCATION, instead handle REG_CALL_ARG_LOCATION note
>         on call_insn.
>         * final.c (final_scan_insn): Remove all references to
>         NOTE_INSN_CALL_ARG_LOCATION.
>         (rest_of_clean_state): Likewise.  Remove REG_CALL_ARG_LOCATION notes
>         before dumping final insns.
>         * except.c (emit_note_eh_region_end): Remove all references to
>         NOTE_INSN_CALL_ARG_LOCATION.
>         * config/alpha/alpha.c (alpha_pad_function_end): Likewise.
>         * config/c6x/c6x.c (c6x_gen_bundles): Likewise.
>         * config/arc/arc.c (hwloop_optimize): Likewise.
>         * config/arm/arm.c (create_fix_barrier): Likewise.
>         * config/s390/s390.c (s390_chunkify_start): Likewise.
>         * config/sh/sh.c (find_barrier): Likewise.
>         * config/i386/i386.c (rest_of_insert_endbranch,
>         ix86_seh_fixup_eh_fallthru): Likewise.
>         * config/xtensa/xtensa.c (hwloop_optimize): Likewise.
>         * config/iq2000/iq2000.c (final_prescan_insn): Likewise.
>         * config/frv/frv.c (frv_function_prologue): Likewise.
>         * emit-rtl.c (try_split): Likewise.  Copy over REG_CALL_ARG_LOCATION
>         reg note.
>         (note_outside_basic_block_p): Remove all references to
>         NOTE_INSN_CALL_ARG_LOCATION.
>         * gengtype.c (adjust_field_rtx_def): Likewise.
>         * print-rtl.c (rtx_writer::print_rtx_operand_code_0, print_insn):
>         Likewise.
>         * jump.c (cleanup_barriers, delete_related_insns): Likewise.
>         * cfgrtl.c (force_nonfallthru_and_redirect): Likewise.
>
>         * gcc.target/i386/pr84146.c: Add -fcompare-debug to dg-options.
>
> --- gcc/reg-notes.def.jj        2018-01-03 10:19:55.239533971 +0100
> +++ gcc/reg-notes.def   2018-02-07 16:40:03.800915206 +0100
> @@ -239,3 +239,6 @@ REG_NOTE (CALL_DECL)
>     when a called function has a 'notrack' attribute.  This note is used by the
>     compiler when the option -fcf-protection=branch is specified.  */
>  REG_NOTE (CALL_NOCF_CHECK)
> +
> +/* The values passed to callee, for debuginfo purposes.  */
> +REG_NOTE (CALL_ARG_LOCATION)
> --- gcc/insn-notes.def.jj       2018-01-03 10:19:55.669534040 +0100
> +++ gcc/insn-notes.def  2018-02-07 16:40:03.800915206 +0100
> @@ -65,9 +65,6 @@ INSN_NOTE (EH_REGION_END)
>  /* The location of a variable.  */
>  INSN_NOTE (VAR_LOCATION)
>
> -/* The values passed to callee.  */
> -INSN_NOTE (CALL_ARG_LOCATION)
> -
>  /* The beginning of a statement.  */
>  INSN_NOTE (BEGIN_STMT)
>
> --- gcc/var-tracking.c.jj       2018-02-07 13:11:26.950985542 +0100
> +++ gcc/var-tracking.c  2018-02-07 16:44:10.810478942 +0100
> @@ -8860,14 +8860,12 @@ emit_note_insn_var_location (variable **
>        /* Make sure that the call related notes come first.  */
>        while (NEXT_INSN (insn)
>              && NOTE_P (insn)
> -            && ((NOTE_KIND (insn) == NOTE_INSN_VAR_LOCATION
> -                 && NOTE_DURING_CALL_P (insn))
> -                || NOTE_KIND (insn) == NOTE_INSN_CALL_ARG_LOCATION))
> +            && NOTE_KIND (insn) == NOTE_INSN_VAR_LOCATION
> +            && NOTE_DURING_CALL_P (insn))
>         insn = NEXT_INSN (insn);
>        if (NOTE_P (insn)
> -         && ((NOTE_KIND (insn) == NOTE_INSN_VAR_LOCATION
> -              && NOTE_DURING_CALL_P (insn))
> -             || NOTE_KIND (insn) == NOTE_INSN_CALL_ARG_LOCATION))
> +         && NOTE_KIND (insn) == NOTE_INSN_VAR_LOCATION
> +         && NOTE_DURING_CALL_P (insn))
>         note = emit_note_after (NOTE_INSN_VAR_LOCATION, insn);
>        else
>         note = emit_note_before (NOTE_INSN_VAR_LOCATION, insn);
> @@ -9210,7 +9208,6 @@ emit_notes_in_bb (basic_block bb, datafl
>             emit_notes_for_changes (insn, EMIT_NOTE_AFTER_CALL_INSN, set->vars);
>             {
>               rtx arguments = mo->u.loc, *p = &arguments;
> -             rtx_note *note;
>               while (*p)
>                 {
>                   XEXP (XEXP (*p, 0), 1)
> @@ -9218,7 +9215,11 @@ emit_notes_in_bb (basic_block bb, datafl
>                                      shared_hash_htab (set->vars));
>                   /* If expansion is successful, keep it in the list.  */
>                   if (XEXP (XEXP (*p, 0), 1))
> -                   p = &XEXP (*p, 1);
> +                   {
> +                     XEXP (XEXP (*p, 0), 1)
> +                       = copy_rtx_if_shared (XEXP (XEXP (*p, 0), 1));
> +                     p = &XEXP (*p, 1);
> +                   }
>                   /* Otherwise, if the following item is data_value for it,
>                      drop it too too.  */
>                   else if (XEXP (*p, 1)
> @@ -9234,8 +9235,7 @@ emit_notes_in_bb (basic_block bb, datafl
>                   else
>                     *p = XEXP (*p, 1);
>                 }
> -             note = emit_note_after (NOTE_INSN_CALL_ARG_LOCATION, insn);
> -             NOTE_VAR_LOCATION (note) = arguments;
> +             add_reg_note (insn, REG_CALL_ARG_LOCATION, arguments);
>             }
>             break;
>
> --- gcc/dwarf2out.c.jj  2018-02-06 21:30:56.402732183 +0100
> +++ gcc/dwarf2out.c     2018-02-07 16:43:08.201589517 +0100
> @@ -22607,7 +22607,7 @@ gen_subprogram_die (tree decl, dw_die_re
>               rtx arg, next_arg;
>
>               for (arg = (ca_loc->call_arg_loc_note != NULL_RTX
> -                         ? NOTE_VAR_LOCATION (ca_loc->call_arg_loc_note)
> +                         ? XEXP (ca_loc->call_arg_loc_note, 0)
>                           : NULL_RTX);
>                    arg; arg = next_arg)
>                 {
> @@ -26366,6 +26366,17 @@ dwarf2out_var_location (rtx_insn *loc_no
>           call_site_count++;
>           if (SIBLING_CALL_P (loc_note))
>             tail_call_site_count++;
> +         if (find_reg_note (loc_note, REG_CALL_ARG_LOCATION, NULL_RTX))
> +           {
> +             call_insn = loc_note;
> +             loc_note = NULL;
> +             var_loc_p = false;
> +
> +             next_real = dwarf2out_next_real_insn (call_insn);
> +             next_note = NULL;
> +             cached_next_real_insn = NULL;
> +             goto create_label;
> +           }
>           if (optimize == 0 && !flag_var_tracking)
>             {
>               /* When the var-tracking pass is not running, there is no note
> @@ -26419,8 +26430,7 @@ dwarf2out_var_location (rtx_insn *loc_no
>        || next_note->deleted ()
>        || ! NOTE_P (next_note)
>        || (NOTE_KIND (next_note) != NOTE_INSN_VAR_LOCATION
> -         && NOTE_KIND (next_note) != NOTE_INSN_BEGIN_STMT
> -         && NOTE_KIND (next_note) != NOTE_INSN_CALL_ARG_LOCATION))
> +         && NOTE_KIND (next_note) != NOTE_INSN_BEGIN_STMT))
>      next_note = NULL;
>
>    if (! next_real)
> @@ -26529,10 +26539,10 @@ create_label:
>      {
>        struct call_arg_loc_node *ca_loc
>         = ggc_cleared_alloc<call_arg_loc_node> ();
> -      rtx_insn *prev
> -        = loc_note != NULL_RTX ? prev_real_insn (loc_note) : call_insn;
> +      rtx_insn *prev = call_insn;
>
> -      ca_loc->call_arg_loc_note = loc_note;
> +      ca_loc->call_arg_loc_note
> +       = find_reg_note (call_insn, REG_CALL_ARG_LOCATION, NULL_RTX);
>        ca_loc->next = NULL;
>        ca_loc->label = last_label;
>        gcc_assert (prev
> --- gcc/final.c.jj      2018-01-18 21:11:57.272207030 +0100
> +++ gcc/final.c 2018-02-07 17:15:40.031809548 +0100
> @@ -2355,7 +2355,6 @@ final_scan_insn (rtx_insn *insn, FILE *f
>           break;
>
>         case NOTE_INSN_VAR_LOCATION:
> -       case NOTE_INSN_CALL_ARG_LOCATION:
>           if (!DECL_IGNORED_P (current_function_decl))
>             debug_hooks->var_location (insn);
>           break;
> @@ -4664,14 +4663,19 @@ rest_of_clean_state (void)
>        SET_NEXT_INSN (insn) = NULL;
>        SET_PREV_INSN (insn) = NULL;
>
> +      if (CALL_P (insn))
> +       {
> +         rtx note = find_reg_note (insn, REG_CALL_ARG_LOCATION, NULL_RTX);
> +         if (note)
> +           remove_note (insn, note);
> +       }
>        if (final_output
> -         && (!NOTE_P (insn) ||
> -             (NOTE_KIND (insn) != NOTE_INSN_VAR_LOCATION
> -              && NOTE_KIND (insn) != NOTE_INSN_BEGIN_STMT
> -              && NOTE_KIND (insn) != NOTE_INSN_CALL_ARG_LOCATION
> -              && NOTE_KIND (insn) != NOTE_INSN_BLOCK_BEG
> -              && NOTE_KIND (insn) != NOTE_INSN_BLOCK_END
> -              && NOTE_KIND (insn) != NOTE_INSN_DELETED_DEBUG_LABEL)))
> +         && (!NOTE_P (insn)
> +             || (NOTE_KIND (insn) != NOTE_INSN_VAR_LOCATION
> +                 && NOTE_KIND (insn) != NOTE_INSN_BEGIN_STMT
> +                 && NOTE_KIND (insn) != NOTE_INSN_BLOCK_BEG
> +                 && NOTE_KIND (insn) != NOTE_INSN_BLOCK_END
> +                 && NOTE_KIND (insn) != NOTE_INSN_DELETED_DEBUG_LABEL)))
>         print_rtl_single (final_output, insn);
>      }
>
> --- gcc/except.c.jj     2018-01-03 10:19:55.864534071 +0100
> +++ gcc/except.c        2018-02-07 16:43:08.200589519 +0100
> @@ -2465,14 +2465,6 @@ add_call_site (rtx landing_pad, int acti
>  static rtx_note *
>  emit_note_eh_region_end (rtx_insn *insn)
>  {
> -  rtx_insn *next = NEXT_INSN (insn);
> -
> -  /* Make sure we do not split a call and its corresponding
> -     CALL_ARG_LOCATION note.  */
> -  if (next && NOTE_P (next)
> -      && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
> -    insn = next;
> -
>    return emit_note_after (NOTE_INSN_EH_REGION_END, insn);
>  }
>
> --- gcc/config/alpha/alpha.c.jj 2018-01-04 12:37:25.259487337 +0100
> +++ gcc/config/alpha/alpha.c    2018-02-07 16:43:08.200589519 +0100
> @@ -9406,14 +9406,6 @@ alpha_pad_function_end (void)
>                || find_reg_note (insn, REG_NORETURN, NULL_RTX)))
>          continue;
>
> -      /* Make sure we do not split a call and its corresponding
> -        CALL_ARG_LOCATION note.  */
> -      next = NEXT_INSN (insn);
> -      if (next == NULL)
> -       continue;
> -      if (NOTE_P (next) && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
> -       insn = next;
> -
>        next = next_active_insn (insn);
>        if (next)
>         {
> --- gcc/config/c6x/c6x.c.jj     2018-01-03 10:20:00.740534851 +0100
> +++ gcc/config/c6x/c6x.c        2018-02-07 16:43:08.201589517 +0100
> @@ -4637,7 +4637,6 @@ static void
>  c6x_gen_bundles (void)
>  {
>    basic_block bb;
> -  rtx_insn *insn, *next, *last_call;
>
>    FOR_EACH_BB_FN (bb, cfun)
>      {
> @@ -4704,29 +4703,6 @@ c6x_gen_bundles (void)
>             break;
>         }
>      }
> -  /* Bundling, and emitting nops, can separate
> -     NOTE_INSN_CALL_ARG_LOCATION from the corresponding calls.  Fix
> -     that up here.  */
> -  last_call = NULL;
> -  for (insn = get_insns (); insn; insn = next)
> -    {
> -      next = NEXT_INSN (insn);
> -      if (CALL_P (insn)
> -         || (INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE
> -             && CALL_P (XVECEXP (PATTERN (insn), 0, 0))))
> -       last_call = insn;
> -      if (!NOTE_P (insn) || NOTE_KIND (insn) != NOTE_INSN_CALL_ARG_LOCATION)
> -       continue;
> -      if (NEXT_INSN (last_call) == insn)
> -       continue;
> -      SET_NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
> -      SET_PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
> -      SET_PREV_INSN (insn) = last_call;
> -      SET_NEXT_INSN (insn) = NEXT_INSN (last_call);
> -      SET_PREV_INSN (NEXT_INSN (insn)) = insn;
> -      SET_NEXT_INSN (PREV_INSN (insn)) = insn;
> -      last_call = insn;
> -    }
>  }
>
>  /* Emit a NOP instruction for CYCLES cycles after insn AFTER.  Return it.  */
> --- gcc/config/arc/arc.c.jj     2018-01-31 21:38:10.510050496 +0100
> +++ gcc/config/arc/arc.c        2018-02-07 16:43:08.201589517 +0100
> @@ -7700,10 +7700,7 @@ hwloop_optimize (hwloop_info loop)
>  #if 0
>        while (DEBUG_INSN_P (entry_after)
>               || (NOTE_P (entry_after)
> -                 && NOTE_KIND (entry_after) != NOTE_INSN_BASIC_BLOCK
> -                /* Make sure we don't split a call and its corresponding
> -                   CALL_ARG_LOCATION note.  */
> -                 && NOTE_KIND (entry_after) != NOTE_INSN_CALL_ARG_LOCATION))
> +                && NOTE_KIND (entry_after) != NOTE_INSN_BASIC_BLOCK))
>          entry_after = NEXT_INSN (entry_after);
>  #endif
>        entry_after = next_nonnote_nondebug_insn_bb (entry_after);
> --- gcc/config/arm/arm.c.jj     2018-02-06 13:13:08.930742979 +0100
> +++ gcc/config/arm/arm.c        2018-02-07 16:43:08.201589517 +0100
> @@ -16556,16 +16556,6 @@ create_fix_barrier (Mfix *fix, HOST_WIDE
>    /* Make sure that we found a place to insert the jump.  */
>    gcc_assert (selected);
>
> -  /* Make sure we do not split a call and its corresponding
> -     CALL_ARG_LOCATION note.  */
> -  if (CALL_P (selected))
> -    {
> -      rtx_insn *next = NEXT_INSN (selected);
> -      if (next && NOTE_P (next)
> -         && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
> -         selected = next;
> -    }
> -
>    /* Create a new JUMP_INSN that branches around a barrier.  */
>    from = emit_jump_insn_after (gen_jump (label), selected);
>    JUMP_LABEL (from) = label;
> --- gcc/config/s390/s390.c.jj   2018-01-03 10:20:05.176535560 +0100
> +++ gcc/config/s390/s390.c      2018-02-07 16:43:08.201589517 +0100
> @@ -9224,7 +9224,6 @@ s390_chunkify_start (void)
>             section_switch_p = true;
>             break;
>           case NOTE_INSN_VAR_LOCATION:
> -         case NOTE_INSN_CALL_ARG_LOCATION:
>             continue;
>           default:
>             break;
> @@ -9295,8 +9294,7 @@ s390_chunkify_start (void)
>                     }
>                   while (next
>                          && NOTE_P (next)
> -                        && (NOTE_KIND (next) == NOTE_INSN_VAR_LOCATION
> -                            || NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION));
> +                        && NOTE_KIND (next) == NOTE_INSN_VAR_LOCATION);
>                 }
>               else
>                 {
> --- gcc/config/sh/sh.c.jj       2018-01-14 17:16:55.869836128 +0100
> +++ gcc/config/sh/sh.c  2018-02-07 16:43:08.201589517 +0100
> @@ -5229,16 +5229,6 @@ find_barrier (int num_mova, rtx_insn *mo
>              || LABEL_P (from))
>         from = PREV_INSN (from);
>
> -      /* Make sure we do not split between a call and its corresponding
> -        CALL_ARG_LOCATION note.  */
> -      if (CALL_P (from))
> -       {
> -         rtx_insn *next = NEXT_INSN (from);
> -         if (next && NOTE_P (next)
> -             && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
> -           from = next;
> -       }
> -
>        from = emit_jump_insn_after (gen_jump (label), from);
>        JUMP_LABEL (from) = label;
>        LABEL_NUSES (label) = 1;
> --- gcc/config/i386/i386.c.jj   2018-02-07 13:11:29.449980343 +0100
> +++ gcc/config/i386/i386.c      2018-02-07 16:43:08.201589517 +0100
> @@ -2619,16 +2619,8 @@ rest_of_insert_endbranch (void)
>               /* Generate ENDBRANCH after CALL, which can return more than
>                  twice, setjmp-like functions.  */
>
> -             /* Skip notes that must immediately follow the call insn.  */
> -             rtx_insn *next_insn = insn;
> -             if (NEXT_INSN (insn)
> -                 && NOTE_P (NEXT_INSN (insn))
> -                 && (NOTE_KIND (NEXT_INSN (insn))
> -                     == NOTE_INSN_CALL_ARG_LOCATION))
> -               next_insn = NEXT_INSN (insn);
> -
>               cet_eb = gen_nop_endbr ();
> -             emit_insn_after_setloc (cet_eb, next_insn, INSN_LOCATION (insn));
> +             emit_insn_after_setloc (cet_eb, insn, INSN_LOCATION (insn));
>               continue;
>             }
>
> @@ -42115,9 +42107,7 @@ ix86_seh_fixup_eh_fallthru (void)
>
>        /* Do not separate calls from their debug information.  */
>        for (next = NEXT_INSN (insn); next != NULL; next = NEXT_INSN (next))
> -       if (NOTE_P (next)
> -            && (NOTE_KIND (next) == NOTE_INSN_VAR_LOCATION
> -                || NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION))
> +       if (NOTE_P (next) && NOTE_KIND (next) == NOTE_INSN_VAR_LOCATION)
>           insn = next;
>         else
>           break;
> --- gcc/config/xtensa/xtensa.c.jj       2018-01-03 10:20:07.506535933 +0100
> +++ gcc/config/xtensa/xtensa.c  2018-02-07 16:43:08.201589517 +0100
> @@ -4255,10 +4255,7 @@ hwloop_optimize (hwloop_info loop)
>        entry_after = BB_END (entry_bb);
>        while (DEBUG_INSN_P (entry_after)
>               || (NOTE_P (entry_after)
> -                 && NOTE_KIND (entry_after) != NOTE_INSN_BASIC_BLOCK
> -                /* Make sure we don't split a call and its corresponding
> -                   CALL_ARG_LOCATION note.  */
> -                 && NOTE_KIND (entry_after) != NOTE_INSN_CALL_ARG_LOCATION))
> +                && NOTE_KIND (entry_after) != NOTE_INSN_BASIC_BLOCK))
>          entry_after = PREV_INSN (entry_after);
>
>        emit_insn_after (seq, entry_after);
> --- gcc/config/iq2000/iq2000.c.jj       2018-01-03 10:20:08.778536124 +0100
> +++ gcc/config/iq2000/iq2000.c  2018-02-07 16:43:08.201589517 +0100
> @@ -1578,13 +1578,7 @@ final_prescan_insn (rtx_insn *insn, rtx
>         || (GET_CODE (PATTERN (insn)) == RETURN))
>            && NEXT_INSN (PREV_INSN (insn)) == insn)
>      {
> -      rtx_insn *tmp = insn;
> -      while (NEXT_INSN (tmp)
> -            && NOTE_P (NEXT_INSN (tmp))
> -            && NOTE_KIND (NEXT_INSN (tmp)) == NOTE_INSN_CALL_ARG_LOCATION)
> -       tmp = NEXT_INSN (tmp);
> -
> -      rtx_insn *nop_insn = emit_insn_after (gen_nop (), tmp);
> +      rtx_insn *nop_insn = emit_insn_after (gen_nop (), insn);
>        INSN_ADDRESSES_NEW (nop_insn, -1);
>      }
>
> --- gcc/config/frv/frv.c.jj     2018-01-03 10:20:15.021537135 +0100
> +++ gcc/config/frv/frv.c        2018-02-07 16:43:08.201589517 +0100
> @@ -1415,8 +1415,6 @@ frv_function_contains_far_jump (void)
>  static void
>  frv_function_prologue (FILE *file)
>  {
> -  rtx_insn *insn, *next, *last_call;
> -
>    /* If no frame was created, check whether the function uses a call
>       instruction to implement a far jump.  If so, save the link in gr3 and
>       replace all returns to LR with returns to GR3.  GR3 is used because it
> @@ -1457,32 +1455,6 @@ frv_function_prologue (FILE *file)
>
>    /* Allow the garbage collector to free the nops created by frv_reorg.  */
>    memset (frv_nops, 0, sizeof (frv_nops));
> -
> -  /* Locate CALL_ARG_LOCATION notes that have been misplaced
> -     and move them back to where they should be located.  */
> -  last_call = NULL;
> -  for (insn = get_insns (); insn; insn = next)
> -    {
> -      next = NEXT_INSN (insn);
> -      if (CALL_P (insn)
> -         || (INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE
> -             && CALL_P (XVECEXP (PATTERN (insn), 0, 0))))
> -       last_call = insn;
> -
> -      if (!NOTE_P (insn) || NOTE_KIND (insn) != NOTE_INSN_CALL_ARG_LOCATION)
> -       continue;
> -
> -      if (NEXT_INSN (last_call) == insn)
> -       continue;
> -
> -      SET_NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
> -      SET_PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
> -      SET_PREV_INSN (insn) = last_call;
> -      SET_NEXT_INSN (insn) = NEXT_INSN (last_call);
> -      SET_PREV_INSN (NEXT_INSN (insn)) = insn;
> -      SET_NEXT_INSN (PREV_INSN (insn)) = insn;
> -      last_call = insn;
> -    }
>  }
>
>
> --- gcc/emit-rtl.c.jj   2018-01-10 10:00:09.241349608 +0100
> +++ gcc/emit-rtl.c      2018-02-07 16:43:08.201589517 +0100
> @@ -3866,15 +3866,12 @@ try_split (rtx pat, rtx_insn *trial, int
>        for (insn = insn_last; insn ; insn = PREV_INSN (insn))
>         if (CALL_P (insn))
>           {
> -           rtx_insn *next;
> -           rtx *p;
> -
>             gcc_assert (call_insn == NULL_RTX);
>             call_insn = insn;
>
>             /* Add the old CALL_INSN_FUNCTION_USAGE to whatever the
>                target may have explicitly specified.  */
> -           p = &CALL_INSN_FUNCTION_USAGE (insn);
> +           rtx *p = &CALL_INSN_FUNCTION_USAGE (insn);
>             while (*p)
>               p = &XEXP (*p, 1);
>             *p = CALL_INSN_FUNCTION_USAGE (trial);
> @@ -3882,21 +3879,6 @@ try_split (rtx pat, rtx_insn *trial, int
>             /* If the old call was a sibling call, the new one must
>                be too.  */
>             SIBLING_CALL_P (insn) = SIBLING_CALL_P (trial);
> -
> -           /* If the new call is the last instruction in the sequence,
> -              it will effectively replace the old call in-situ.  Otherwise
> -              we must move any following NOTE_INSN_CALL_ARG_LOCATION note
> -              so that it comes immediately after the new call.  */
> -           if (NEXT_INSN (insn))
> -             for (next = NEXT_INSN (trial);
> -                  next && NOTE_P (next);
> -                  next = NEXT_INSN (next))
> -               if (NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
> -                 {
> -                   remove_insn (next);
> -                   add_insn_after (next, insn, NULL);
> -                   break;
> -                 }
>           }
>      }
>
> @@ -3913,6 +3895,7 @@ try_split (rtx pat, rtx_insn *trial, int
>         case REG_SETJMP:
>         case REG_TM:
>         case REG_CALL_NOCF_CHECK:
> +       case REG_CALL_ARG_LOCATION:
>           for (insn = insn_last; insn != NULL_RTX; insn = PREV_INSN (insn))
>             {
>               if (CALL_P (insn))
> @@ -4777,7 +4760,6 @@ note_outside_basic_block_p (enum insn_no
>          inside basic blocks.  If the caller is emitting on the basic block
>          boundary, do not set BLOCK_FOR_INSN on the new note.  */
>        case NOTE_INSN_VAR_LOCATION:
> -      case NOTE_INSN_CALL_ARG_LOCATION:
>        case NOTE_INSN_EH_REGION_BEG:
>        case NOTE_INSN_EH_REGION_END:
>         return on_bb_boundary_p;
> --- gcc/gengtype.c.jj   2018-01-03 10:19:54.626533873 +0100
> +++ gcc/gengtype.c      2018-02-07 16:43:08.201589517 +0100
> @@ -1187,7 +1187,6 @@ adjust_field_rtx_def (type_p t, options_
>             break;
>
>           case NOTE_INSN_VAR_LOCATION:
> -         case NOTE_INSN_CALL_ARG_LOCATION:
>             note_flds = create_field (note_flds, rtx_tp, "rt_rtx");
>             break;
>
> --- gcc/print-rtl.c.jj  2018-01-03 10:19:55.991534091 +0100
> +++ gcc/print-rtl.c     2018-02-07 16:43:08.201589517 +0100
> @@ -264,7 +264,6 @@ rtx_writer::print_rtx_operand_code_0 (co
>           }
>
>         case NOTE_INSN_VAR_LOCATION:
> -       case NOTE_INSN_CALL_ARG_LOCATION:
>           fputc (' ', m_outfile);
>           print_rtx (NOTE_VAR_LOCATION (in_rtx));
>           break;
> @@ -1965,7 +1964,6 @@ print_insn (pretty_printer *pp, const rt
>             break;
>
>           case NOTE_INSN_VAR_LOCATION:
> -         case NOTE_INSN_CALL_ARG_LOCATION:
>             pp_left_brace (pp);
>             print_pattern (pp, NOTE_VAR_LOCATION (x), verbose);
>             pp_right_brace (pp);
> --- gcc/jump.c.jj       2018-01-03 10:19:54.949533924 +0100
> +++ gcc/jump.c  2018-02-07 16:43:08.201589517 +0100
> @@ -127,17 +127,6 @@ cleanup_barriers (void)
>           if (!prev)
>             continue;
>
> -         if (CALL_P (prev))
> -           {
> -             /* Make sure we do not split a call and its corresponding
> -                CALL_ARG_LOCATION note.  */
> -             rtx_insn *next = NEXT_INSN (prev);
> -
> -             if (NOTE_P (next)
> -                 && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
> -               prev = next;
> -           }
> -
>           if (BARRIER_P (prev))
>             delete_insn (insn);
>           else if (prev != PREV_INSN (insn))
> @@ -1279,26 +1268,6 @@ delete_related_insns (rtx uncast_insn)
>    if (next != 0 && BARRIER_P (next))
>      delete_insn (next);
>
> -  /* If this is a call, then we have to remove the var tracking note
> -     for the call arguments.  */
> -
> -  if (CALL_P (insn)
> -      || (NONJUMP_INSN_P (insn)
> -         && GET_CODE (PATTERN (insn)) == SEQUENCE
> -         && CALL_P (XVECEXP (PATTERN (insn), 0, 0))))
> -    {
> -      rtx_insn *p;
> -
> -      for (p = next && next->deleted () ? NEXT_INSN (next) : next;
> -          p && NOTE_P (p);
> -          p = NEXT_INSN (p))
> -       if (NOTE_KIND (p) == NOTE_INSN_CALL_ARG_LOCATION)
> -         {
> -           remove_insn (p);
> -           break;
> -         }
> -    }
> -
>    /* If deleting a jump, decrement the count of the label,
>       and delete the label if it is now unused.  */
>
> --- gcc/cfgrtl.c.jj     2018-01-11 19:01:11.904444589 +0100
> +++ gcc/cfgrtl.c        2018-02-07 16:43:08.201589517 +0100
> @@ -1628,11 +1628,6 @@ force_nonfallthru_and_redirect (edge e,
>        else
>         new_head = BB_END (e->src);
>        new_head = NEXT_INSN (new_head);
> -      /* Make sure we don't split a call and its corresponding
> -        CALL_ARG_LOCATION note.  */
> -      if (new_head && NOTE_P (new_head)
> -         && NOTE_KIND (new_head) == NOTE_INSN_CALL_ARG_LOCATION)
> -       new_head = NEXT_INSN (new_head);
>
>        jump_block = create_basic_block (new_head, NULL, e->src);
>        jump_block->count = count;
> --- gcc/testsuite/gcc.target/i386/pr84146.c.jj  2018-02-06 21:32:08.549609100 +0100
> +++ gcc/testsuite/gcc.target/i386/pr84146.c     2018-02-07 17:16:37.345774290 +0100
> @@ -1,6 +1,6 @@
>  /* PR target/84146 */
>  /* { dg-do compile } */
> -/* { dg-options "-O2 -g -mcet -fcf-protection=full" } */
> +/* { dg-options "-O2 -g -mcet -fcf-protection=full -fcompare-debug" } */
>
>  int __setjmp (void **);
>  void *buf[64];
>
>         Jakub
diff mbox series

Patch

--- gcc/reg-notes.def.jj	2018-01-03 10:19:55.239533971 +0100
+++ gcc/reg-notes.def	2018-02-07 16:40:03.800915206 +0100
@@ -239,3 +239,6 @@  REG_NOTE (CALL_DECL)
    when a called function has a 'notrack' attribute.  This note is used by the
    compiler when the option -fcf-protection=branch is specified.  */
 REG_NOTE (CALL_NOCF_CHECK)
+
+/* The values passed to callee, for debuginfo purposes.  */
+REG_NOTE (CALL_ARG_LOCATION)
--- gcc/insn-notes.def.jj	2018-01-03 10:19:55.669534040 +0100
+++ gcc/insn-notes.def	2018-02-07 16:40:03.800915206 +0100
@@ -65,9 +65,6 @@  INSN_NOTE (EH_REGION_END)
 /* The location of a variable.  */
 INSN_NOTE (VAR_LOCATION)
 
-/* The values passed to callee.  */
-INSN_NOTE (CALL_ARG_LOCATION)
-
 /* The beginning of a statement.  */
 INSN_NOTE (BEGIN_STMT)
 
--- gcc/var-tracking.c.jj	2018-02-07 13:11:26.950985542 +0100
+++ gcc/var-tracking.c	2018-02-07 16:44:10.810478942 +0100
@@ -8860,14 +8860,12 @@  emit_note_insn_var_location (variable **
       /* Make sure that the call related notes come first.  */
       while (NEXT_INSN (insn)
 	     && NOTE_P (insn)
-	     && ((NOTE_KIND (insn) == NOTE_INSN_VAR_LOCATION
-		  && NOTE_DURING_CALL_P (insn))
-		 || NOTE_KIND (insn) == NOTE_INSN_CALL_ARG_LOCATION))
+	     && NOTE_KIND (insn) == NOTE_INSN_VAR_LOCATION
+	     && NOTE_DURING_CALL_P (insn))
 	insn = NEXT_INSN (insn);
       if (NOTE_P (insn)
-	  && ((NOTE_KIND (insn) == NOTE_INSN_VAR_LOCATION
-	       && NOTE_DURING_CALL_P (insn))
-	      || NOTE_KIND (insn) == NOTE_INSN_CALL_ARG_LOCATION))
+	  && NOTE_KIND (insn) == NOTE_INSN_VAR_LOCATION
+	  && NOTE_DURING_CALL_P (insn))
 	note = emit_note_after (NOTE_INSN_VAR_LOCATION, insn);
       else
 	note = emit_note_before (NOTE_INSN_VAR_LOCATION, insn);
@@ -9210,7 +9208,6 @@  emit_notes_in_bb (basic_block bb, datafl
 	    emit_notes_for_changes (insn, EMIT_NOTE_AFTER_CALL_INSN, set->vars);
 	    {
 	      rtx arguments = mo->u.loc, *p = &arguments;
-	      rtx_note *note;
 	      while (*p)
 		{
 		  XEXP (XEXP (*p, 0), 1)
@@ -9218,7 +9215,11 @@  emit_notes_in_bb (basic_block bb, datafl
 				     shared_hash_htab (set->vars));
 		  /* If expansion is successful, keep it in the list.  */
 		  if (XEXP (XEXP (*p, 0), 1))
-		    p = &XEXP (*p, 1);
+		    {
+		      XEXP (XEXP (*p, 0), 1)
+			= copy_rtx_if_shared (XEXP (XEXP (*p, 0), 1));
+		      p = &XEXP (*p, 1);
+		    }
 		  /* Otherwise, if the following item is data_value for it,
 		     drop it too too.  */
 		  else if (XEXP (*p, 1)
@@ -9234,8 +9235,7 @@  emit_notes_in_bb (basic_block bb, datafl
 		  else
 		    *p = XEXP (*p, 1);
 		}
-	      note = emit_note_after (NOTE_INSN_CALL_ARG_LOCATION, insn);
-	      NOTE_VAR_LOCATION (note) = arguments;
+	      add_reg_note (insn, REG_CALL_ARG_LOCATION, arguments);
 	    }
 	    break;
 
--- gcc/dwarf2out.c.jj	2018-02-06 21:30:56.402732183 +0100
+++ gcc/dwarf2out.c	2018-02-07 16:43:08.201589517 +0100
@@ -22607,7 +22607,7 @@  gen_subprogram_die (tree decl, dw_die_re
 	      rtx arg, next_arg;
 
 	      for (arg = (ca_loc->call_arg_loc_note != NULL_RTX
-			  ? NOTE_VAR_LOCATION (ca_loc->call_arg_loc_note)
+			  ? XEXP (ca_loc->call_arg_loc_note, 0)
 			  : NULL_RTX);
 		   arg; arg = next_arg)
 		{
@@ -26366,6 +26366,17 @@  dwarf2out_var_location (rtx_insn *loc_no
 	  call_site_count++;
 	  if (SIBLING_CALL_P (loc_note))
 	    tail_call_site_count++;
+	  if (find_reg_note (loc_note, REG_CALL_ARG_LOCATION, NULL_RTX))
+	    {
+	      call_insn = loc_note;
+	      loc_note = NULL;
+	      var_loc_p = false;
+
+	      next_real = dwarf2out_next_real_insn (call_insn);
+	      next_note = NULL;
+	      cached_next_real_insn = NULL;
+	      goto create_label;
+	    }
 	  if (optimize == 0 && !flag_var_tracking)
 	    {
 	      /* When the var-tracking pass is not running, there is no note
@@ -26419,8 +26430,7 @@  dwarf2out_var_location (rtx_insn *loc_no
       || next_note->deleted ()
       || ! NOTE_P (next_note)
       || (NOTE_KIND (next_note) != NOTE_INSN_VAR_LOCATION
-	  && NOTE_KIND (next_note) != NOTE_INSN_BEGIN_STMT
-	  && NOTE_KIND (next_note) != NOTE_INSN_CALL_ARG_LOCATION))
+	  && NOTE_KIND (next_note) != NOTE_INSN_BEGIN_STMT))
     next_note = NULL;
 
   if (! next_real)
@@ -26529,10 +26539,10 @@  create_label:
     {
       struct call_arg_loc_node *ca_loc
 	= ggc_cleared_alloc<call_arg_loc_node> ();
-      rtx_insn *prev
-        = loc_note != NULL_RTX ? prev_real_insn (loc_note) : call_insn;
+      rtx_insn *prev = call_insn;
 
-      ca_loc->call_arg_loc_note = loc_note;
+      ca_loc->call_arg_loc_note
+	= find_reg_note (call_insn, REG_CALL_ARG_LOCATION, NULL_RTX);
       ca_loc->next = NULL;
       ca_loc->label = last_label;
       gcc_assert (prev
--- gcc/final.c.jj	2018-01-18 21:11:57.272207030 +0100
+++ gcc/final.c	2018-02-07 17:15:40.031809548 +0100
@@ -2355,7 +2355,6 @@  final_scan_insn (rtx_insn *insn, FILE *f
 	  break;
 
 	case NOTE_INSN_VAR_LOCATION:
-	case NOTE_INSN_CALL_ARG_LOCATION:
 	  if (!DECL_IGNORED_P (current_function_decl))
 	    debug_hooks->var_location (insn);
 	  break;
@@ -4664,14 +4663,19 @@  rest_of_clean_state (void)
       SET_NEXT_INSN (insn) = NULL;
       SET_PREV_INSN (insn) = NULL;
 
+      if (CALL_P (insn))
+	{
+	  rtx note = find_reg_note (insn, REG_CALL_ARG_LOCATION, NULL_RTX);
+	  if (note)
+	    remove_note (insn, note);
+	}
       if (final_output
-	  && (!NOTE_P (insn) ||
-	      (NOTE_KIND (insn) != NOTE_INSN_VAR_LOCATION
-	       && NOTE_KIND (insn) != NOTE_INSN_BEGIN_STMT
-	       && NOTE_KIND (insn) != NOTE_INSN_CALL_ARG_LOCATION
-	       && NOTE_KIND (insn) != NOTE_INSN_BLOCK_BEG
-	       && NOTE_KIND (insn) != NOTE_INSN_BLOCK_END
-	       && NOTE_KIND (insn) != NOTE_INSN_DELETED_DEBUG_LABEL)))
+	  && (!NOTE_P (insn)
+	      || (NOTE_KIND (insn) != NOTE_INSN_VAR_LOCATION
+		  && NOTE_KIND (insn) != NOTE_INSN_BEGIN_STMT
+		  && NOTE_KIND (insn) != NOTE_INSN_BLOCK_BEG
+		  && NOTE_KIND (insn) != NOTE_INSN_BLOCK_END
+		  && NOTE_KIND (insn) != NOTE_INSN_DELETED_DEBUG_LABEL)))
 	print_rtl_single (final_output, insn);
     }
 
--- gcc/except.c.jj	2018-01-03 10:19:55.864534071 +0100
+++ gcc/except.c	2018-02-07 16:43:08.200589519 +0100
@@ -2465,14 +2465,6 @@  add_call_site (rtx landing_pad, int acti
 static rtx_note *
 emit_note_eh_region_end (rtx_insn *insn)
 {
-  rtx_insn *next = NEXT_INSN (insn);
-
-  /* Make sure we do not split a call and its corresponding
-     CALL_ARG_LOCATION note.  */
-  if (next && NOTE_P (next)
-      && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
-    insn = next;
-
   return emit_note_after (NOTE_INSN_EH_REGION_END, insn);
 }
 
--- gcc/config/alpha/alpha.c.jj	2018-01-04 12:37:25.259487337 +0100
+++ gcc/config/alpha/alpha.c	2018-02-07 16:43:08.200589519 +0100
@@ -9406,14 +9406,6 @@  alpha_pad_function_end (void)
 	       || find_reg_note (insn, REG_NORETURN, NULL_RTX)))
         continue;
 
-      /* Make sure we do not split a call and its corresponding
-	 CALL_ARG_LOCATION note.  */
-      next = NEXT_INSN (insn);
-      if (next == NULL)
-	continue;
-      if (NOTE_P (next) && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
-	insn = next;
-
       next = next_active_insn (insn);
       if (next)
 	{
--- gcc/config/c6x/c6x.c.jj	2018-01-03 10:20:00.740534851 +0100
+++ gcc/config/c6x/c6x.c	2018-02-07 16:43:08.201589517 +0100
@@ -4637,7 +4637,6 @@  static void
 c6x_gen_bundles (void)
 {
   basic_block bb;
-  rtx_insn *insn, *next, *last_call;
 
   FOR_EACH_BB_FN (bb, cfun)
     {
@@ -4704,29 +4703,6 @@  c6x_gen_bundles (void)
 	    break;
 	}
     }
-  /* Bundling, and emitting nops, can separate
-     NOTE_INSN_CALL_ARG_LOCATION from the corresponding calls.  Fix
-     that up here.  */
-  last_call = NULL;
-  for (insn = get_insns (); insn; insn = next)
-    {
-      next = NEXT_INSN (insn);
-      if (CALL_P (insn)
-	  || (INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE
-	      && CALL_P (XVECEXP (PATTERN (insn), 0, 0))))
-	last_call = insn;
-      if (!NOTE_P (insn) || NOTE_KIND (insn) != NOTE_INSN_CALL_ARG_LOCATION)
-	continue;
-      if (NEXT_INSN (last_call) == insn)
-	continue;
-      SET_NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
-      SET_PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
-      SET_PREV_INSN (insn) = last_call;
-      SET_NEXT_INSN (insn) = NEXT_INSN (last_call);
-      SET_PREV_INSN (NEXT_INSN (insn)) = insn;
-      SET_NEXT_INSN (PREV_INSN (insn)) = insn;
-      last_call = insn;
-    }
 }
 
 /* Emit a NOP instruction for CYCLES cycles after insn AFTER.  Return it.  */
--- gcc/config/arc/arc.c.jj	2018-01-31 21:38:10.510050496 +0100
+++ gcc/config/arc/arc.c	2018-02-07 16:43:08.201589517 +0100
@@ -7700,10 +7700,7 @@  hwloop_optimize (hwloop_info loop)
 #if 0
       while (DEBUG_INSN_P (entry_after)
              || (NOTE_P (entry_after)
-                 && NOTE_KIND (entry_after) != NOTE_INSN_BASIC_BLOCK
-		 /* Make sure we don't split a call and its corresponding
-		    CALL_ARG_LOCATION note.  */
-                 && NOTE_KIND (entry_after) != NOTE_INSN_CALL_ARG_LOCATION))
+		 && NOTE_KIND (entry_after) != NOTE_INSN_BASIC_BLOCK))
         entry_after = NEXT_INSN (entry_after);
 #endif
       entry_after = next_nonnote_nondebug_insn_bb (entry_after);
--- gcc/config/arm/arm.c.jj	2018-02-06 13:13:08.930742979 +0100
+++ gcc/config/arm/arm.c	2018-02-07 16:43:08.201589517 +0100
@@ -16556,16 +16556,6 @@  create_fix_barrier (Mfix *fix, HOST_WIDE
   /* Make sure that we found a place to insert the jump.  */
   gcc_assert (selected);
 
-  /* Make sure we do not split a call and its corresponding
-     CALL_ARG_LOCATION note.  */
-  if (CALL_P (selected))
-    {
-      rtx_insn *next = NEXT_INSN (selected);
-      if (next && NOTE_P (next)
-	  && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
-	  selected = next;
-    }
-
   /* Create a new JUMP_INSN that branches around a barrier.  */
   from = emit_jump_insn_after (gen_jump (label), selected);
   JUMP_LABEL (from) = label;
--- gcc/config/s390/s390.c.jj	2018-01-03 10:20:05.176535560 +0100
+++ gcc/config/s390/s390.c	2018-02-07 16:43:08.201589517 +0100
@@ -9224,7 +9224,6 @@  s390_chunkify_start (void)
 	    section_switch_p = true;
 	    break;
 	  case NOTE_INSN_VAR_LOCATION:
-	  case NOTE_INSN_CALL_ARG_LOCATION:
 	    continue;
 	  default:
 	    break;
@@ -9295,8 +9294,7 @@  s390_chunkify_start (void)
 		    }
 		  while (next
 			 && NOTE_P (next)
-			 && (NOTE_KIND (next) == NOTE_INSN_VAR_LOCATION
-			     || NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION));
+			 && NOTE_KIND (next) == NOTE_INSN_VAR_LOCATION);
 		}
 	      else
 		{
--- gcc/config/sh/sh.c.jj	2018-01-14 17:16:55.869836128 +0100
+++ gcc/config/sh/sh.c	2018-02-07 16:43:08.201589517 +0100
@@ -5229,16 +5229,6 @@  find_barrier (int num_mova, rtx_insn *mo
 	     || LABEL_P (from))
 	from = PREV_INSN (from);
 
-      /* Make sure we do not split between a call and its corresponding
-	 CALL_ARG_LOCATION note.  */
-      if (CALL_P (from))
-	{
-	  rtx_insn *next = NEXT_INSN (from);
-	  if (next && NOTE_P (next)
-	      && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
-	    from = next;
-	}
-
       from = emit_jump_insn_after (gen_jump (label), from);
       JUMP_LABEL (from) = label;
       LABEL_NUSES (label) = 1;
--- gcc/config/i386/i386.c.jj	2018-02-07 13:11:29.449980343 +0100
+++ gcc/config/i386/i386.c	2018-02-07 16:43:08.201589517 +0100
@@ -2619,16 +2619,8 @@  rest_of_insert_endbranch (void)
 	      /* Generate ENDBRANCH after CALL, which can return more than
 		 twice, setjmp-like functions.  */
 
-	      /* Skip notes that must immediately follow the call insn.  */
-	      rtx_insn *next_insn = insn;
-	      if (NEXT_INSN (insn)
-		  && NOTE_P (NEXT_INSN (insn))
-		  && (NOTE_KIND (NEXT_INSN (insn))
-		      == NOTE_INSN_CALL_ARG_LOCATION))
-		next_insn = NEXT_INSN (insn);
-
 	      cet_eb = gen_nop_endbr ();
-	      emit_insn_after_setloc (cet_eb, next_insn, INSN_LOCATION (insn));
+	      emit_insn_after_setloc (cet_eb, insn, INSN_LOCATION (insn));
 	      continue;
 	    }
 
@@ -42115,9 +42107,7 @@  ix86_seh_fixup_eh_fallthru (void)
 
       /* Do not separate calls from their debug information.  */
       for (next = NEXT_INSN (insn); next != NULL; next = NEXT_INSN (next))
-	if (NOTE_P (next)
-            && (NOTE_KIND (next) == NOTE_INSN_VAR_LOCATION
-                || NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION))
+	if (NOTE_P (next) && NOTE_KIND (next) == NOTE_INSN_VAR_LOCATION)
 	  insn = next;
 	else
 	  break;
--- gcc/config/xtensa/xtensa.c.jj	2018-01-03 10:20:07.506535933 +0100
+++ gcc/config/xtensa/xtensa.c	2018-02-07 16:43:08.201589517 +0100
@@ -4255,10 +4255,7 @@  hwloop_optimize (hwloop_info loop)
       entry_after = BB_END (entry_bb);
       while (DEBUG_INSN_P (entry_after)
              || (NOTE_P (entry_after)
-                 && NOTE_KIND (entry_after) != NOTE_INSN_BASIC_BLOCK
-		 /* Make sure we don't split a call and its corresponding
-		    CALL_ARG_LOCATION note.  */
-                 && NOTE_KIND (entry_after) != NOTE_INSN_CALL_ARG_LOCATION))
+		 && NOTE_KIND (entry_after) != NOTE_INSN_BASIC_BLOCK))
         entry_after = PREV_INSN (entry_after);
 
       emit_insn_after (seq, entry_after);
--- gcc/config/iq2000/iq2000.c.jj	2018-01-03 10:20:08.778536124 +0100
+++ gcc/config/iq2000/iq2000.c	2018-02-07 16:43:08.201589517 +0100
@@ -1578,13 +1578,7 @@  final_prescan_insn (rtx_insn *insn, rtx
        || (GET_CODE (PATTERN (insn)) == RETURN))
 	   && NEXT_INSN (PREV_INSN (insn)) == insn)
     {
-      rtx_insn *tmp = insn;
-      while (NEXT_INSN (tmp)
-	     && NOTE_P (NEXT_INSN (tmp))
-	     && NOTE_KIND (NEXT_INSN (tmp)) == NOTE_INSN_CALL_ARG_LOCATION)
-	tmp = NEXT_INSN (tmp);
-
-      rtx_insn *nop_insn = emit_insn_after (gen_nop (), tmp);
+      rtx_insn *nop_insn = emit_insn_after (gen_nop (), insn);
       INSN_ADDRESSES_NEW (nop_insn, -1);
     }
   
--- gcc/config/frv/frv.c.jj	2018-01-03 10:20:15.021537135 +0100
+++ gcc/config/frv/frv.c	2018-02-07 16:43:08.201589517 +0100
@@ -1415,8 +1415,6 @@  frv_function_contains_far_jump (void)
 static void
 frv_function_prologue (FILE *file)
 {
-  rtx_insn *insn, *next, *last_call;
-
   /* If no frame was created, check whether the function uses a call
      instruction to implement a far jump.  If so, save the link in gr3 and
      replace all returns to LR with returns to GR3.  GR3 is used because it
@@ -1457,32 +1455,6 @@  frv_function_prologue (FILE *file)
 
   /* Allow the garbage collector to free the nops created by frv_reorg.  */
   memset (frv_nops, 0, sizeof (frv_nops));
-
-  /* Locate CALL_ARG_LOCATION notes that have been misplaced
-     and move them back to where they should be located.  */
-  last_call = NULL;
-  for (insn = get_insns (); insn; insn = next)
-    {
-      next = NEXT_INSN (insn);
-      if (CALL_P (insn)
-	  || (INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE
-	      && CALL_P (XVECEXP (PATTERN (insn), 0, 0))))
-	last_call = insn;
-
-      if (!NOTE_P (insn) || NOTE_KIND (insn) != NOTE_INSN_CALL_ARG_LOCATION)
-	continue;
-
-      if (NEXT_INSN (last_call) == insn)
-	continue;
-
-      SET_NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
-      SET_PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
-      SET_PREV_INSN (insn) = last_call;
-      SET_NEXT_INSN (insn) = NEXT_INSN (last_call);
-      SET_PREV_INSN (NEXT_INSN (insn)) = insn;
-      SET_NEXT_INSN (PREV_INSN (insn)) = insn;
-      last_call = insn;
-    }
 }
 
 
--- gcc/emit-rtl.c.jj	2018-01-10 10:00:09.241349608 +0100
+++ gcc/emit-rtl.c	2018-02-07 16:43:08.201589517 +0100
@@ -3866,15 +3866,12 @@  try_split (rtx pat, rtx_insn *trial, int
       for (insn = insn_last; insn ; insn = PREV_INSN (insn))
 	if (CALL_P (insn))
 	  {
-	    rtx_insn *next;
-	    rtx *p;
-
 	    gcc_assert (call_insn == NULL_RTX);
 	    call_insn = insn;
 
 	    /* Add the old CALL_INSN_FUNCTION_USAGE to whatever the
 	       target may have explicitly specified.  */
-	    p = &CALL_INSN_FUNCTION_USAGE (insn);
+	    rtx *p = &CALL_INSN_FUNCTION_USAGE (insn);
 	    while (*p)
 	      p = &XEXP (*p, 1);
 	    *p = CALL_INSN_FUNCTION_USAGE (trial);
@@ -3882,21 +3879,6 @@  try_split (rtx pat, rtx_insn *trial, int
 	    /* If the old call was a sibling call, the new one must
 	       be too.  */
 	    SIBLING_CALL_P (insn) = SIBLING_CALL_P (trial);
-
-	    /* If the new call is the last instruction in the sequence,
-	       it will effectively replace the old call in-situ.  Otherwise
-	       we must move any following NOTE_INSN_CALL_ARG_LOCATION note
-	       so that it comes immediately after the new call.  */
-	    if (NEXT_INSN (insn))
-	      for (next = NEXT_INSN (trial);
-		   next && NOTE_P (next);
-		   next = NEXT_INSN (next))
-		if (NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
-		  {
-		    remove_insn (next);
-		    add_insn_after (next, insn, NULL);
-		    break;
-		  }
 	  }
     }
 
@@ -3913,6 +3895,7 @@  try_split (rtx pat, rtx_insn *trial, int
 	case REG_SETJMP:
 	case REG_TM:
 	case REG_CALL_NOCF_CHECK:
+	case REG_CALL_ARG_LOCATION:
 	  for (insn = insn_last; insn != NULL_RTX; insn = PREV_INSN (insn))
 	    {
 	      if (CALL_P (insn))
@@ -4777,7 +4760,6 @@  note_outside_basic_block_p (enum insn_no
 	 inside basic blocks.  If the caller is emitting on the basic block
 	 boundary, do not set BLOCK_FOR_INSN on the new note.  */
       case NOTE_INSN_VAR_LOCATION:
-      case NOTE_INSN_CALL_ARG_LOCATION:
       case NOTE_INSN_EH_REGION_BEG:
       case NOTE_INSN_EH_REGION_END:
 	return on_bb_boundary_p;
--- gcc/gengtype.c.jj	2018-01-03 10:19:54.626533873 +0100
+++ gcc/gengtype.c	2018-02-07 16:43:08.201589517 +0100
@@ -1187,7 +1187,6 @@  adjust_field_rtx_def (type_p t, options_
 	    break;
 
 	  case NOTE_INSN_VAR_LOCATION:
-	  case NOTE_INSN_CALL_ARG_LOCATION:
 	    note_flds = create_field (note_flds, rtx_tp, "rt_rtx");
 	    break;
 
--- gcc/print-rtl.c.jj	2018-01-03 10:19:55.991534091 +0100
+++ gcc/print-rtl.c	2018-02-07 16:43:08.201589517 +0100
@@ -264,7 +264,6 @@  rtx_writer::print_rtx_operand_code_0 (co
 	  }
 
 	case NOTE_INSN_VAR_LOCATION:
-	case NOTE_INSN_CALL_ARG_LOCATION:
 	  fputc (' ', m_outfile);
 	  print_rtx (NOTE_VAR_LOCATION (in_rtx));
 	  break;
@@ -1965,7 +1964,6 @@  print_insn (pretty_printer *pp, const rt
 	    break;
 
 	  case NOTE_INSN_VAR_LOCATION:
-	  case NOTE_INSN_CALL_ARG_LOCATION:
 	    pp_left_brace (pp);
 	    print_pattern (pp, NOTE_VAR_LOCATION (x), verbose);
 	    pp_right_brace (pp);
--- gcc/jump.c.jj	2018-01-03 10:19:54.949533924 +0100
+++ gcc/jump.c	2018-02-07 16:43:08.201589517 +0100
@@ -127,17 +127,6 @@  cleanup_barriers (void)
 	  if (!prev)
 	    continue;
 
-	  if (CALL_P (prev))
-	    {
-	      /* Make sure we do not split a call and its corresponding
-		 CALL_ARG_LOCATION note.  */
-	      rtx_insn *next = NEXT_INSN (prev);
-
-	      if (NOTE_P (next)
-		  && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
-		prev = next;
-	    }
-
 	  if (BARRIER_P (prev))
 	    delete_insn (insn);
 	  else if (prev != PREV_INSN (insn))
@@ -1279,26 +1268,6 @@  delete_related_insns (rtx uncast_insn)
   if (next != 0 && BARRIER_P (next))
     delete_insn (next);
 
-  /* If this is a call, then we have to remove the var tracking note
-     for the call arguments.  */
-
-  if (CALL_P (insn)
-      || (NONJUMP_INSN_P (insn)
-	  && GET_CODE (PATTERN (insn)) == SEQUENCE
-	  && CALL_P (XVECEXP (PATTERN (insn), 0, 0))))
-    {
-      rtx_insn *p;
-
-      for (p = next && next->deleted () ? NEXT_INSN (next) : next;
-	   p && NOTE_P (p);
-	   p = NEXT_INSN (p))
-	if (NOTE_KIND (p) == NOTE_INSN_CALL_ARG_LOCATION)
-	  {
-	    remove_insn (p);
-	    break;
-	  }
-    }
-
   /* If deleting a jump, decrement the count of the label,
      and delete the label if it is now unused.  */
 
--- gcc/cfgrtl.c.jj	2018-01-11 19:01:11.904444589 +0100
+++ gcc/cfgrtl.c	2018-02-07 16:43:08.201589517 +0100
@@ -1628,11 +1628,6 @@  force_nonfallthru_and_redirect (edge e,
       else
 	new_head = BB_END (e->src);
       new_head = NEXT_INSN (new_head);
-      /* Make sure we don't split a call and its corresponding
-	 CALL_ARG_LOCATION note.  */
-      if (new_head && NOTE_P (new_head)
-	  && NOTE_KIND (new_head) == NOTE_INSN_CALL_ARG_LOCATION)
-	new_head = NEXT_INSN (new_head);
 
       jump_block = create_basic_block (new_head, NULL, e->src);
       jump_block->count = count;
--- gcc/testsuite/gcc.target/i386/pr84146.c.jj	2018-02-06 21:32:08.549609100 +0100
+++ gcc/testsuite/gcc.target/i386/pr84146.c	2018-02-07 17:16:37.345774290 +0100
@@ -1,6 +1,6 @@ 
 /* PR target/84146 */
 /* { dg-do compile } */
-/* { dg-options "-O2 -g -mcet -fcf-protection=full" } */
+/* { dg-options "-O2 -g -mcet -fcf-protection=full -fcompare-debug" } */
 
 int __setjmp (void **);
 void *buf[64];