[prev in list] [next in list] [prev in thread] [next in thread]
List: gcc-patches
Subject: Re: [PATCH] line number notes cleanups (modulo-sched and haifa-sched)
From: Dorit Nuzman <DORIT () il ! ibm ! com>
Date: 2006-11-30 10:26:32
Message-ID: OF0EEA4DAF.AF142922-ONC2257236.0039301B-C2257236.00395CBA () il ! ibm ! com
[Download RAW message or body]
>
> Hi,
>
> I'm resubmitting the patch before committing it, cause it's been a while
> since it was approved:
> http://gcc.gnu.org/ml/gcc-patches/2006-10/msg01377.html
> It is reduced patch, since Jan Hubicka applied part of it in his patch:
> http://gcc.gnu.org/ml/gcc-patches/2006-11/msg00501.html
> Bootstrapped and regtested with up-to-date mainline, on
> powerpc64-suse-linux and i386-redhat-linux.
> Also, finally regtested against the gdb-6.5 testsuite, and passed without
> regressions.
> I don't have write permission, so Dorit Nuzman agreed to commit it for
me.
>
> Any objections?
>
I already committed it... (didn't see this note, sorry)
dorit
> Thanks,
> Tehila.
>
>
> 2006-11-29 Tehila Meyzels <tehila@il.ibm.com>
>
> * haifa-sched.c: Remove define LINE_NOTE(INSN).
> Remove line_note_head.
> Update documentation.
> (associate_line_notes_with_blocks): Kill.
> (extend_bb): Remove basic block argument, put void instead.
> Remove line number handling for each bb.
> (save_line_notes): Kill.
> (restore_line_notes): Kill.
> (sched_init): Remove line_note_head initialization.
> Change extend_bb call.
> (sched_finish): Remove free of line_note_head.
> (add_block): Change extend_bb call.
> * sched-ebb.c (schedule_ebb): Remove save_line_notes,
> rm_line_notes and restore_line_notes calls.
> (schedule_ebbs): Remove rm_redundant_line_notes.
> * sched-int.h (struct haifa_insn_data): Remove line_note.
> (save_line_notes): Remove declaration.
> (restore_line_notes): Remove declaration.
> * modulo-sched.c (loop_canon_p): Update debug info printing
> by using insn locators instead of line note.
> (sms_schedule): Update debug info printing, by using insn
> locators instead of line note.
> * sched-rgn.c (debug_dependencies): Remove handling of case
> n>0 (line number), since it's a dead code.
> (schedule_region): Remove save_line_notes and
> restore_line_notes calls.
>
>
> Index: sched-ebb.c
> ===================================================================
> --- sched-ebb.c (revision 118723)
> +++ sched-ebb.c (working copy)
> @@ -479,11 +479,6 @@
> current_sched_info->prev_head = PREV_INSN (head);
> current_sched_info->next_tail = NEXT_INSN (tail);
>
> - if (write_symbols != NO_DEBUG)
> - {
> - save_line_notes (first_bb->index, head, tail);
> - }
> -
> /* rm_other_notes only removes notes which are _inside_ the
> block---that is, it won't remove notes before the first real insn
> or after the last real insn of the block. So if the first insn
> @@ -519,9 +514,6 @@
> head = current_sched_info->head;
> tail = current_sched_info->tail;
>
> - if (write_symbols != NO_DEBUG)
> - restore_line_notes (head, tail);
> -
> if (EDGE_COUNT (last_bb->preds) == 0)
> /* LAST_BB is unreachable. */
> {
> Index: haifa-sched.c
> ===================================================================
> --- haifa-sched.c (revision 118723)
> +++ haifa-sched.c (working copy)
> @@ -186,7 +186,6 @@
>
> struct haifa_insn_data *h_i_d;
>
> -#define LINE_NOTE(INSN) (h_i_d[INSN_UID (INSN)].line_note)
> #define INSN_TICK(INSN) (h_i_d[INSN_UID (INSN)].tick)
> #define INTER_TICK(INSN) (h_i_d[INSN_UID (INSN)].inter_tick)
>
> @@ -200,10 +199,6 @@
> For now, all instructions are equally good. */
> #define ISSUE_POINTS(INSN) 1
>
> -/* Vector indexed by basic block number giving the starting line-number
> - for each basic block. */
> -static rtx *line_note_head;
> -
> /* List of important notes we must keep around. This is a pointer to
the
> last element in the list. */
> static rtx note_list;
> @@ -509,7 +504,7 @@
> /* Notes handling mechanism:
> =========================
> Generally, NOTES are saved before scheduling and restored after
> scheduling.
> - The scheduler distinguishes between three types of notes:
> + The scheduler distinguishes between two types of notes:
>
> (1) LOOP_BEGIN, LOOP_END, SETJMP, EHREGION_BEG, EHREGION_END notes:
> Before scheduling a region, a pointer to the note is added to the
insn
> @@ -569,12 +564,11 @@
> static basic_block create_recovery_block (void);
> static void create_check_block_twin (rtx, bool);
> static void fix_recovery_deps (basic_block);
> -static void associate_line_notes_with_blocks (basic_block);
> static void change_pattern (rtx, rtx);
> static int speculate_insn (rtx, ds_t, rtx *);
> static void dump_new_block_header (int, basic_block, rtx, rtx);
> static void restore_bb_notes (basic_block);
> -static void extend_bb (basic_block);
> +static void extend_bb (void);
> static void fix_jump_move (rtx);
> static void move_block_after_check (rtx);
> static void move_succs (VEC(edge,gc) **, basic_block);
> @@ -1321,99 +1315,6 @@
> return 1;
> }
>
> -/* Save line number notes for each insn in block B. HEAD and TAIL are
> - the boundaries of the block in which notes should be processed. */
> -
> -void
> -save_line_notes (int b, rtx head, rtx tail)
> -{
> - rtx next_tail;
> -
> - /* We must use the true line number for the first insn in the block
> - that was computed and saved at the start of this pass. We can't
> - use the current line number, because scheduling of the previous
> - block may have changed the current line number. */
> -
> - rtx line = line_note_head[b];
> - rtx insn;
> -
> - next_tail = NEXT_INSN (tail);
> -
> - for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
> - LINE_NOTE (insn) = line;
> -}
> -
> -/* After a block was scheduled, insert line notes into the insns list.
> - HEAD and TAIL are the boundaries of the block in which notes should
> - be processed. */
> -
> -void
> -restore_line_notes (rtx head, rtx tail)
> -{
> - rtx line, note, prev, new;
> - int added_notes = 0;
> - rtx next_tail, insn;
> -
> - head = head;
> - next_tail = NEXT_INSN (tail);
> -
> - /* Determine the current line-number. We want to know the current
> - line number of the first insn of the block here, in case it is
> - different from the true line number that was saved earlier. If
> - different, then we need a line number note before the first insn
> - of this block. If it happens to be the same, then we don't want to
> - emit another line number note here. */
> - for (line = head; line; line = PREV_INSN (line))
> - if (NOTE_P (line) && NOTE_LINE_NUMBER (line) > 0)
> - break;
> -
> - /* Walk the insns keeping track of the current line-number and
inserting
> - the line-number notes as needed. */
> - for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
> - if (NOTE_P (insn) && NOTE_LINE_NUMBER (insn) > 0)
> - line = insn;
> - /* This used to emit line number notes before every non-deleted note.
> - However, this confuses a debugger, because line notes not separated
> - by real instructions all end up at the same address. I can find no
> - use for line number notes before other notes, so none are emitted.
> */
> - else if (!NOTE_P (insn)
> - && INSN_UID (insn) < old_max_uid
> - && (note = LINE_NOTE (insn)) != 0
> - && note != line
> - && (line == 0
> -#ifdef USE_MAPPED_LOCATION
> - || NOTE_SOURCE_LOCATION (note) != NOTE_SOURCE_LOCATION
(line)
> -#else
> - || NOTE_LINE_NUMBER (note) != NOTE_LINE_NUMBER (line)
> - || NOTE_SOURCE_FILE (note) != NOTE_SOURCE_FILE (line)
> -#endif
> - ))
> - {
> - line = note;
> - prev = PREV_INSN (insn);
> - if (LINE_NOTE (note))
> - {
> - /* Re-use the original line-number note. */
> - LINE_NOTE (note) = 0;
> - PREV_INSN (note) = prev;
> - NEXT_INSN (prev) = note;
> - PREV_INSN (insn) = note;
> - NEXT_INSN (note) = insn;
> - set_block_for_insn (note, BLOCK_FOR_INSN (insn));
> - }
> - else
> - {
> - added_notes++;
> - new = emit_note_after (NOTE_LINE_NUMBER (note), prev);
> -#ifndef USE_MAPPED_LOCATION
> - NOTE_SOURCE_FILE (new) = NOTE_SOURCE_FILE (note);
> -#endif
> - }
> - }
> - if (sched_verbose && added_notes)
> - fprintf (sched_dump, ";; added %d line-number notes\n",
added_notes);
> -}
> -
> /* Delete notes between HEAD and TAIL and put them in the chain
> of notes ended by NOTE_LIST. */
>
> @@ -2722,11 +2623,10 @@
>
> init_alias_analysis ();
>
> - line_note_head = 0;
> old_last_basic_block = 0;
> glat_start = 0;
> glat_end = 0;
> - extend_bb (0);
> + extend_bb ();
>
> if (current_sched_info->flags & USE_GLAT)
> init_glat ();
> @@ -2758,7 +2658,6 @@
> dfa_finish ();
> free_dependency_caches ();
> end_alias_analysis ();
> - free (line_note_head);
> free_glat ();
>
> if (targetm.sched.md_finish_global)
> @@ -3898,29 +3797,6 @@
> add_jump_dependencies (insn, jump);
> }
>
> -/* The function saves line notes at the beginning of block B. */
> -static void
> -associate_line_notes_with_blocks (basic_block b)
> -{
> - rtx line;
> -
> - for (line = BB_HEAD (b); line; line = PREV_INSN (line))
> - if (NOTE_P (line) && NOTE_LINE_NUMBER (line) > 0)
> - {
> - line_note_head[b->index] = line;
> - break;
> - }
> - /* Do a forward search as well, since we won't get to see the first
> - notes in a basic block. */
> - for (line = BB_HEAD (b); line; line = NEXT_INSN (line))
> - {
> - if (INSN_P (line))
> - break;
> - if (NOTE_P (line) && NOTE_LINE_NUMBER (line) > 0)
> - line_note_head[b->index] = line;
> - }
> -}
> -
> /* Changes pattern of the INSN to NEW_PAT. */
> static void
> change_pattern (rtx insn, rtx new_pat)
> @@ -4083,28 +3959,10 @@
> If BB is NULL, initialize structures for the whole CFG.
> Otherwise, initialize them for the just created BB. */
> static void
> -extend_bb (basic_block bb)
> +extend_bb (void)
> {
> rtx insn;
>
> - if (write_symbols != NO_DEBUG)
> - {
> - /* Save-line-note-head:
> - Determine the line-number at the start of each basic block.
> - This must be computed and saved now, because after a basic
> block's
> - predecessor has been scheduled, it is impossible to accurately
> - determine the correct line number for the first insn of the
> block. */
> - line_note_head = xrecalloc (line_note_head, last_basic_block,
> - old_last_basic_block,
> - sizeof (*line_note_head));
> -
> - if (bb)
> - associate_line_notes_with_blocks (bb);
> - else
> - FOR_EACH_BB (bb)
> - associate_line_notes_with_blocks (bb);
> - }
> -
> old_last_basic_block = last_basic_block;
>
> if (current_sched_info->flags & USE_GLAT)
> @@ -4139,7 +3997,7 @@
> && bb->il.rtl->global_live_at_start == 0
> && bb->il.rtl->global_live_at_end == 0);
>
> - extend_bb (bb);
> + extend_bb ();
>
> glat_start[bb->index] = 0;
> glat_end[bb->index] = 0;
> Index: modulo-sched.c
> ===================================================================
> --- modulo-sched.c (revision 118723)
> +++ modulo-sched.c (working copy)
> @@ -818,7 +818,11 @@
> {
> if (dump_file)
> {
> + rtx insn = BB_END (loop->header);
> +
> fprintf (dump_file, "SMS loop many exits ");
> + fprintf (dump_file, " %s %d (file, line)\n",
> + insn_file (insn), insn_line (insn));
> }
> return false;
> }
> @@ -827,7 +831,11 @@
> {
> if (dump_file)
> {
> + rtx insn = BB_END (loop->header);
> +
> fprintf (dump_file, "SMS loop many BBs. ");
> + fprintf (dump_file, " %s %d (file, line)\n",
> + insn_file (insn), insn_line (insn));
> }
> return false;
> }
> @@ -955,6 +963,8 @@
> {
> if (dump_file)
> {
> + fprintf (dump_file, " %s %d (file, line)\n",
> + insn_file (tail), insn_line (tail));
> fprintf (dump_file, "SMS single-bb-loop\n");
> if (profile_info && flag_branch_probabilities)
> {
> @@ -1044,6 +1054,8 @@
>
> if (dump_file)
> {
> + fprintf (dump_file, " %s %d (file, line)\n",
> + insn_file (tail), insn_line (tail));
> fprintf (dump_file, "SMS single-bb-loop\n");
> if (profile_info && flag_branch_probabilities)
> {
> Index: sched-int.h
> ===================================================================
> --- sched-int.h (revision 118723)
> +++ sched-int.h (working copy)
> @@ -270,11 +270,7 @@
> /* A list of scheduled producers of the instruction. Links are being
> moved
> from LOG_LINKS to RESOLVED_DEPS during scheduling. */
> rtx resolved_deps;
> -
> - /* The line number note in effect for each insn. For line number
> - notes, this indicates whether the note may be reused. */
> - rtx line_note;
>
> /* Logical uid gives the original ordering of the insns. */
> int luid;
>
> @@ -634,8 +630,6 @@
> extern void get_ebb_head_tail (basic_block, basic_block, rtx *, rtx *);
> extern int no_real_insns_p (rtx, rtx);
>
> -extern void save_line_notes (int, rtx, rtx);
> -extern void restore_line_notes (rtx, rtx);
> extern void rm_other_notes (rtx, rtx);
>
> extern int insn_cost (rtx, rtx, rtx);
> Index: sched-rgn.c
> ===================================================================
> --- sched-rgn.c (revision 118723)
> +++ sched-rgn.c (working copy)
> @@ -2584,13 +2584,6 @@
> n = NOTE_LINE_NUMBER (insn);
> if (n < 0)
> fprintf (sched_dump, "%s\n", GET_NOTE_INSN_NAME (n));
> - else
> - {
> - expanded_location xloc;
> - NOTE_EXPANDED_LOCATION (xloc, insn);
> - fprintf (sched_dump, "line %d, file %s\n",
> - xloc.line, xloc.file);
> - }
> }
> else
> fprintf (sched_dump, " {%s}\n", GET_RTX_NAME (GET_CODE
> (insn)));
> @@ -2768,7 +2761,6 @@
> {
> basic_block first_bb, last_bb, curr_bb;
> rtx head, tail;
> - int b = BB_TO_BLOCK (bb);
>
> first_bb = EBB_FIRST_BB (bb);
> last_bb = EBB_LAST_BB (bb);
> @@ -2784,10 +2776,6 @@
> current_sched_info->prev_head = PREV_INSN (head);
> current_sched_info->next_tail = NEXT_INSN (tail);
>
> - if (write_symbols != NO_DEBUG)
> - {
> - save_line_notes (b, head, tail);
> - }
>
> /* rm_other_notes only removes notes which are _inside_ the
> block---that is, it won't remove notes before the first real insn
> @@ -2838,18 +2826,7 @@
> /* Sanity check: verify that all region insns were scheduled. */
> gcc_assert (sched_rgn_n_insns == rgn_n_insns);
>
> - /* Restore line notes. */
> - if (write_symbols != NO_DEBUG)
> - {
> - for (bb = 0; bb < current_nr_blocks; bb++)
> - {
> - rtx head, tail;
>
> - get_ebb_head_tail (EBB_FIRST_BB (bb), EBB_LAST_BB (bb), &head,
> &tail);
> - restore_line_notes (head, tail);
> - }
> - }
> -
> /* Done with this region. */
>
> if (current_nr_blocks > 1)
>
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic