From a57aee2ab63245bf7678a0cb18997ceb78da8ffc Mon Sep 17 00:00:00 2001 From: Maxim Kuvyrkov Date: Thu, 23 Mar 2006 18:23:53 +0000 Subject: [PATCH] haifa-sched.c (choose_ready): Fix type of the local variable. 2006-03-23 Maxim Kuvyrkov * haifa-sched.c (choose_ready): Fix type of the local variable. Move local variables. Add comment. (check_reg_live): Change signature. Make callable from debugger. * sched-int.h (check_reg_live): Update signature. * sched-ebb.c (check_reg_live): Update parameters. * sched-rgn.c (check_reg_live): Ditto. (region_head_or_leaf_p): Check pointer before dereferencing. * config/ia64/ia64.c (ia64_set_sched_flags): Disable data speculation before reload on optimization levels below 1. From-SVN: r112328 --- gcc/ChangeLog | 12 ++++++++++++ gcc/config/ia64/ia64.c | 2 +- gcc/haifa-sched.c | 42 +++++++++++++++++++++++++++++++++--------- gcc/sched-ebb.c | 2 +- gcc/sched-int.h | 2 +- gcc/sched-rgn.c | 5 +++-- 6 files changed, 51 insertions(+), 14 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 72fa4a5..5cb8291 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2006-03-23 Maxim Kuvyrkov + + * haifa-sched.c (choose_ready): Fix type of the local variable. + Move local variables. Add comment. + (check_reg_live): Change signature. Make callable from debugger. + * sched-int.h (check_reg_live): Update signature. + * sched-ebb.c (check_reg_live): Update parameters. + * sched-rgn.c (check_reg_live): Ditto. + (region_head_or_leaf_p): Check pointer before dereferencing. + * config/ia64/ia64.c (ia64_set_sched_flags): Disable data speculation + before reload on optimization levels below 1. + 2006-03-23 Richard Henderson * config/alpha/alpha.c (alpha_legitimate_constant_p): Reject diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index 2fb1c15..81d4f35 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -6713,7 +6713,7 @@ ia64_set_sched_flags (spec_info_t spec_info) { int mask = 0; - if ((mflag_sched_br_data_spec && !reload_completed) + if ((mflag_sched_br_data_spec && !reload_completed && optimize > 0) || (mflag_sched_ar_data_spec && reload_completed)) { mask |= BEGIN_DATA; diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c index 84311b1..56abcda 100644 --- a/gcc/haifa-sched.c +++ b/gcc/haifa-sched.c @@ -2153,11 +2153,11 @@ choose_ready (struct ready_list *ready) && spec_info->flags & (PREFER_NON_DATA_SPEC | PREFER_NON_CONTROL_SPEC)) { - rtx x; - int s; - for (i = 0, n = ready->n_ready; i < n; i++) { + rtx x; + ds_t s; + x = ready_element (ready, i); s = TODO_SPEC (x); @@ -2185,6 +2185,8 @@ choose_ready (struct ready_list *ready) || (targetm.sched.first_cycle_multipass_dfa_lookahead_guard_spec && !targetm.sched.first_cycle_multipass_dfa_lookahead_guard_spec (insn))) + /* Discard speculative instruction that stands first in the ready + list. */ { change_queue_index (insn, 1); return 0; @@ -4625,9 +4627,12 @@ check_sched_flags (void) gcc_assert (f & USE_GLAT); } -/* Checks global_live_at_{start, end} regsets. */ +/* Check global_live_at_{start, end} regsets. + If FATAL_P is TRUE, then abort execution at the first failure. + Overwise, print diagnostics to STDERR (this mode is for calling + from debugger). */ void -check_reg_live (void) +check_reg_live (bool fatal_p) { basic_block bb; @@ -4638,11 +4643,30 @@ check_reg_live (void) i = bb->index; if (glat_start[i]) - gcc_assert (bitmap_equal_p (bb->il.rtl->global_live_at_start, - glat_start[i])); + { + bool b = bitmap_equal_p (bb->il.rtl->global_live_at_start, + glat_start[i]); + + if (!b) + { + gcc_assert (!fatal_p); + + fprintf (stderr, ";; check_reg_live_at_start (%d) failed.\n", i); + } + } + if (glat_end[i]) - gcc_assert (bitmap_equal_p (bb->il.rtl->global_live_at_end, - glat_end[i])); + { + bool b = bitmap_equal_p (bb->il.rtl->global_live_at_end, + glat_end[i]); + + if (!b) + { + gcc_assert (!fatal_p); + + fprintf (stderr, ";; check_reg_live_at_end (%d) failed.\n", i); + } + } } } #endif /* ENABLE_CHECKING */ diff --git a/gcc/sched-ebb.c b/gcc/sched-ebb.c index 4126a5d..d7a3db9 100644 --- a/gcc/sched-ebb.c +++ b/gcc/sched-ebb.c @@ -667,7 +667,7 @@ schedule_ebbs (void) /* !!! We can't check reg_live_info here because of the fact, that destination registers of COND_EXEC's may be dead before scheduling (while they should be alive). Don't know why. */ - /*check_reg_live ();*/ + /*check_reg_live (true);*/ #endif } sbitmap_free (large_region_blocks); diff --git a/gcc/sched-int.h b/gcc/sched-int.h index cdaca1b..175bd69 100644 --- a/gcc/sched-int.h +++ b/gcc/sched-int.h @@ -639,7 +639,7 @@ extern void add_block (basic_block, basic_block); extern void attach_life_info (void); #ifdef ENABLE_CHECKING -extern void check_reg_live (void); +extern void check_reg_live (bool); #endif #endif /* GCC_SCHED_INT_H */ diff --git a/gcc/sched-rgn.c b/gcc/sched-rgn.c index 77eec4b..a4f037e 100644 --- a/gcc/sched-rgn.c +++ b/gcc/sched-rgn.c @@ -3020,7 +3020,7 @@ schedule_insns (void) : (PROP_DEATH_NOTES | PROP_REG_INFO))); #ifdef ENABLE_CHECKING - check_reg_live (); + check_reg_live (true); #endif } @@ -3266,7 +3266,8 @@ region_head_or_leaf_p (basic_block bb, int leaf_p) i = CONTAINING_RGN (bb->index); FOR_EACH_EDGE (e, ei, bb->succs) - if (CONTAINING_RGN (e->dest->index) == i + if (e->dest != EXIT_BLOCK_PTR + && CONTAINING_RGN (e->dest->index) == i /* except self-loop. */ && e->dest != bb) return 0; -- 2.7.4