[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