* [PATCH] Fix -fcompare-debug failure on pr84146.c (PR target/84146)
@ 2018-02-08 5:43 Jakub Jelinek
2018-03-01 1:19 ` Paul Hua
0 siblings, 1 reply; 2+ messages in thread
From: Jakub Jelinek @ 2018-02-08 5:43 UTC (permalink / raw)
To: Richard Biener, Jeff Law, Alexandre Oliva; +Cc: gcc-patches
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;
- }
}
\f
--- 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
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] Fix -fcompare-debug failure on pr84146.c (PR target/84146)
2018-02-08 5:43 [PATCH] Fix -fcompare-debug failure on pr84146.c (PR target/84146) Jakub Jelinek
@ 2018-03-01 1:19 ` Paul Hua
0 siblings, 0 replies; 2+ messages in thread
From: Paul Hua @ 2018-03-01 1:19 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: Richard Biener, Jeff Law, Alexandre Oliva, gcc-patches
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
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2018-03-01 1:19 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-02-08 5:43 [PATCH] Fix -fcompare-debug failure on pr84146.c (PR target/84146) Jakub Jelinek
2018-03-01 1:19 ` Paul Hua
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).