Commit d73b1f07 by Richard Henderson

cfglayout.c (scope_def, [...]): Remove.

        * cfglayout.c (scope_def, scope_forest_info, forest,
        relate_bbs_with_scopes, make_new_scope, build_scope_forest,
        remove_scope_notes, insert_intra_before_1, insert_intra_1,
        insert_intra_bb_scope_notes, insert_inter_bb_scope_notes,
        rebuild_scope_notes, free_scope_forest_1, dump_scope_forest,
        dump_scope_forest_1, get_next_bb_note, get_prev_bb_note): Remove.
        (fixup_reorder_chain): Don't set scope for bb.
        (insn_scopes, scope_to_insns_initialize, set_block_levels,
        change_scope, scope_to_insns_finalize): New.
        (cfg_layout_initialize, cfg_layout_finalize): Update to match.
        * cfglayout.h (scope_def, scope): Remove.
        (reorder_block_def): Remove scope member.
        (scope_to_insns_initialize, scope_to_insns_finalize): Declare.
        * haifa-sched.c: Revert reemit_other_notes change.
        * sched-ebb.c (schedule_ebbs): Don't call remove_unnecessary_notes.
        Use scope_to_insns_initialize and scope_to_insns_finalize.
        * sched-rgn.c (schedule_insns): Likewise.

        * gcc.dg/debug-6.c: New.

From-SVN: r48412
parent eb3aaa5b
2001-12-30 Richard Henderson <rth@redhat.com>
* cfglayout.c (scope_def, scope_forest_info, forest,
relate_bbs_with_scopes, make_new_scope, build_scope_forest,
remove_scope_notes, insert_intra_before_1, insert_intra_1,
insert_intra_bb_scope_notes, insert_inter_bb_scope_notes,
rebuild_scope_notes, free_scope_forest_1, dump_scope_forest,
dump_scope_forest_1, get_next_bb_note, get_prev_bb_note): Remove.
(fixup_reorder_chain): Don't set scope for bb.
(insn_scopes, scope_to_insns_initialize, set_block_levels,
change_scope, scope_to_insns_finalize): New.
(cfg_layout_initialize, cfg_layout_finalize): Update to match.
* cfglayout.h (scope_def, scope): Remove.
(reorder_block_def): Remove scope member.
(scope_to_insns_initialize, scope_to_insns_finalize): Declare.
* haifa-sched.c: Revert reemit_other_notes change.
* sched-ebb.c (schedule_ebbs): Don't call remove_unnecessary_notes.
Use scope_to_insns_initialize and scope_to_insns_finalize.
* sched-rgn.c (schedule_insns): Likewise.
2001-12-31 Graham Stott <grahams@redhat.com>
2001-12-31 Graham Stott <grahams@redhat.com> 2001-12-31 Graham Stott <grahams@redhat.com>
* c-lex.c: Include tree.h before expr.h * c-lex.c: Include tree.h before expr.h
......
...@@ -18,15 +18,11 @@ ...@@ -18,15 +18,11 @@
Software Foundation, 59 Temple Place - Suite 330, Boston, MA Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */ 02111-1307, USA. */
struct scope_def;
typedef struct scope_def *scope;
/* Structure to hold information about the blocks during reordering. */ /* Structure to hold information about the blocks during reordering. */
typedef struct reorder_block_def typedef struct reorder_block_def
{ {
rtx eff_head; rtx eff_head;
rtx eff_end; rtx eff_end;
scope scope;
basic_block next; basic_block next;
int visited; int visited;
} *reorder_block_def; } *reorder_block_def;
...@@ -35,3 +31,6 @@ typedef struct reorder_block_def ...@@ -35,3 +31,6 @@ typedef struct reorder_block_def
extern void cfg_layout_initialize PARAMS ((void)); extern void cfg_layout_initialize PARAMS ((void));
extern void cfg_layout_finalize PARAMS ((void)); extern void cfg_layout_finalize PARAMS ((void));
extern void scope_to_insns_initialize PARAMS ((void));
extern void scope_to_insns_finalize PARAMS ((void));
...@@ -319,7 +319,6 @@ static void adjust_priority PARAMS ((rtx)); ...@@ -319,7 +319,6 @@ static void adjust_priority PARAMS ((rtx));
static rtx unlink_other_notes PARAMS ((rtx, rtx)); static rtx unlink_other_notes PARAMS ((rtx, rtx));
static rtx unlink_line_notes PARAMS ((rtx, rtx)); static rtx unlink_line_notes PARAMS ((rtx, rtx));
static rtx reemit_notes PARAMS ((rtx, rtx)); static rtx reemit_notes PARAMS ((rtx, rtx));
static rtx reemit_other_notes PARAMS ((rtx, rtx));
static rtx *ready_lastpos PARAMS ((struct ready_list *)); static rtx *ready_lastpos PARAMS ((struct ready_list *));
static void ready_sort PARAMS ((struct ready_list *)); static void ready_sort PARAMS ((struct ready_list *));
...@@ -1576,60 +1575,6 @@ reemit_notes (insn, last) ...@@ -1576,60 +1575,6 @@ reemit_notes (insn, last)
return retval; return retval;
} }
/* NOTE_LIST is the end of a chain of notes previously found among the
insns. Insert them at the beginning of the insns. Actually, insert
NOTE_INSN_BLOCK_END notes at the end of the insns. Doing otherwise
tends to collapse lexical blocks into empty regions, which is somewhat
less than useful. */
/* ??? Ideally we'd mark each insn with the block it originated from,
and preserve that information. This requires some moderately
sophisticated block reconstruction code, since block nestings must
be preserved. */
static rtx
reemit_other_notes (head, tail)
rtx head, tail;
{
bool saw_block_beg = false;
while (note_list)
{
rtx note_tail = note_list;
note_list = PREV_INSN (note_tail);
if (NOTE_LINE_NUMBER (note_tail) == NOTE_INSN_BLOCK_END
/* We can only extend the lexical block while we havn't
seen a BLOCK_BEG note. Otherwise we risk mis-nesting
the notes. */
&& ! saw_block_beg)
{
rtx insert_after = tail;
if (GET_CODE (NEXT_INSN (tail)) == BARRIER)
insert_after = NEXT_INSN (tail);
PREV_INSN (note_tail) = insert_after;
NEXT_INSN (note_tail) = NEXT_INSN (insert_after);
if (NEXT_INSN (insert_after))
PREV_INSN (NEXT_INSN (insert_after)) = note_tail;
NEXT_INSN (insert_after) = note_tail;
}
else
{
if (NOTE_LINE_NUMBER (note_tail) == NOTE_INSN_BLOCK_BEG)
saw_block_beg = true;
PREV_INSN (note_tail) = PREV_INSN (head);
NEXT_INSN (PREV_INSN (head)) = note_tail;
NEXT_INSN (note_tail) = head;
PREV_INSN (head) = note_tail;
head = note_tail;
}
}
return head;
}
/* Move INSN, and all insns which should be issued before it, /* Move INSN, and all insns which should be issued before it,
due to SCHED_GROUP_P flag. Reemit notes if needed. due to SCHED_GROUP_P flag. Reemit notes if needed.
...@@ -1855,7 +1800,24 @@ schedule_block (b, rgn_n_insns) ...@@ -1855,7 +1800,24 @@ schedule_block (b, rgn_n_insns)
head = NEXT_INSN (prev_head); head = NEXT_INSN (prev_head);
tail = last; tail = last;
head = reemit_other_notes (head, tail); /* Restore-other-notes: NOTE_LIST is the end of a chain of notes
previously found among the insns. Insert them at the beginning
of the insns. */
if (note_list != 0)
{
rtx note_head = note_list;
while (PREV_INSN (note_head))
{
note_head = PREV_INSN (note_head);
}
PREV_INSN (note_head) = PREV_INSN (head);
NEXT_INSN (PREV_INSN (head)) = note_head;
PREV_INSN (head) = note_list;
NEXT_INSN (note_list) = head;
head = note_head;
}
/* Debugging. */ /* Debugging. */
if (sched_verbose) if (sched_verbose)
......
...@@ -36,6 +36,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -36,6 +36,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "except.h" #include "except.h"
#include "toplev.h" #include "toplev.h"
#include "recog.h" #include "recog.h"
#include "cfglayout.h"
#include "sched-int.h" #include "sched-int.h"
/* The number of insns to be scheduled in total. */ /* The number of insns to be scheduled in total. */
...@@ -285,9 +286,7 @@ schedule_ebbs (dump_file) ...@@ -285,9 +286,7 @@ schedule_ebbs (dump_file)
if (n_basic_blocks == 0) if (n_basic_blocks == 0)
return; return;
/* Remove lexical block notes for empty regions. These get shuffled scope_to_insns_initialize ();
about during scheduling and confuse the debugging issue. */
remove_unnecessary_notes ();
sched_init (dump_file); sched_init (dump_file);
...@@ -357,5 +356,7 @@ schedule_ebbs (dump_file) ...@@ -357,5 +356,7 @@ schedule_ebbs (dump_file)
if (write_symbols != NO_DEBUG) if (write_symbols != NO_DEBUG)
rm_redundant_line_notes (); rm_redundant_line_notes ();
scope_to_insns_finalize ();
sched_finish (); sched_finish ();
} }
...@@ -60,6 +60,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -60,6 +60,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "except.h" #include "except.h"
#include "toplev.h" #include "toplev.h"
#include "recog.h" #include "recog.h"
#include "cfglayout.h"
#include "sched-int.h" #include "sched-int.h"
/* Define when we want to do count REG_DEAD notes before and after scheduling /* Define when we want to do count REG_DEAD notes before and after scheduling
...@@ -2896,9 +2897,7 @@ schedule_insns (dump_file) ...@@ -2896,9 +2897,7 @@ schedule_insns (dump_file)
if (n_basic_blocks == 0) if (n_basic_blocks == 0)
return; return;
/* Remove lexical block notes for empty regions. These get shuffled scope_to_insns_initialize ();
about during scheduling and confuse the debugging issue. */
remove_unnecessary_notes ();
nr_inter = 0; nr_inter = 0;
nr_spec = 0; nr_spec = 0;
...@@ -2986,6 +2985,8 @@ schedule_insns (dump_file) ...@@ -2986,6 +2985,8 @@ schedule_insns (dump_file)
if (write_symbols != NO_DEBUG) if (write_symbols != NO_DEBUG)
rm_redundant_line_notes (); rm_redundant_line_notes ();
scope_to_insns_finalize ();
if (sched_verbose) if (sched_verbose)
{ {
if (reload_completed == 0 && flag_schedule_interblock) if (reload_completed == 0 && flag_schedule_interblock)
......
2001-12-30 Richard Henderson <rth@redhat.com>
* gcc.dg/debug-6.c: New.
2001-12-30 Jakub Jelinek <jakub@redhat.com> 2001-12-30 Jakub Jelinek <jakub@redhat.com>
* gcc.c-torture/compile/20011229-2.c: New test. * gcc.c-torture/compile/20011229-2.c: New test.
......
/* Verify that bb-reorder re-inserts nested scopes properly. */
/* { dg-do compile } */
/* { dg-options "-O2 -g -dA" } */
/* { dg-final { scan-assembler "xyzzy" } } */
extern void abort (void);
struct A { char *a, *b, *c, *d; };
static int
bar2 (struct A *x)
{
int a = x->c - x->b;
x->c += 26;
return a;
}
void fnptr (int *);
void
foo (void)
{
struct A e;
if (bar2 (&e) < 0)
abort ();
{
int xyzzy;
fnptr (&xyzzy);
}
{
struct A *f;
f = &e;
if (f->c - f->a > f->d - f->a)
f->c = f->d;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment