[PATCH] line number notes cleanups (modulo-sched and haifa-sched)

Tehila Meyzels TEHILA@il.ibm.com
Wed Nov 29 14:25:00 GMT 2006


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?

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)



More information about the Gcc-patches mailing list