[Bug rtl-optimization/48302] ICE: SIGSEGV in reposition_prologue_and_epilogue_notes (function.c:5662) with -fcrossjumping -fselective-scheduling2
amonakov at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Apr 6 16:08:00 GMT 2011
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48302
Alexander Monakov <amonakov at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |ASSIGNED
Last reconfirmed| |2011.04.06 16:08:13
CC| |amonakov at gcc dot gnu.org
AssignedTo|unassigned at gcc dot |amonakov at gcc dot gnu.org
|gnu.org |
Ever Confirmed|0 |1
--- Comment #1 from Alexander Monakov <amonakov at gcc dot gnu.org> 2011-04-06 16:08:13 UTC ---
Confirmed. We call sched_scan for preheader blocks from inner regions twice:
first during sel_add_loop_preheaders, and then during the subsequent call to
sel_init_bbs in setup_current_loop_nest. As a result, we also call
remove_notes for those blocks twice, and after the second call incorrectly
record that the block has no notes.
The solution is to call sel_add_loop_preheaders after sel_init_bbs. We need to
add new preheader blocks into bbs vector in setup_current_loop_nest, so we pass
the pointer to the vector to sel_add_loop_preheaders.
diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c
index 95c1431..a6daa58 100644
--- a/gcc/sel-sched-ir.c
+++ b/gcc/sel-sched-ir.c
@@ -6094,11 +6094,11 @@ sel_find_rgns (void)
bbs_in_loop_rgns = NULL;
}
-/* Adds the preheader blocks from previous loop to current region taking
- it from LOOP_PREHEADER_BLOCKS (current_loop_nest).
+/* Add the preheader blocks from previous loop to current region taking
+ it from LOOP_PREHEADER_BLOCKS (current_loop_nest) and record them in *BBS.
This function is only used with -fsel-sched-pipelining-outer-loops. */
void
-sel_add_loop_preheaders (void)
+sel_add_loop_preheaders (bb_vec_t *bbs)
{
int i;
basic_block bb;
@@ -6109,6 +6109,7 @@ sel_add_loop_preheaders (void)
VEC_iterate (basic_block, preheader_blocks, i, bb);
i++)
{
+ VEC_safe_push (basic_block, heap, *bbs, bb);
VEC_safe_push (basic_block, heap, last_added_blocks, bb);
sel_add_bb (bb);
}
diff --git a/gcc/sel-sched-ir.h b/gcc/sel-sched-ir.h
index 5516da9..b0c52eb 100644
--- a/gcc/sel-sched-ir.h
+++ b/gcc/sel-sched-ir.h
@@ -1628,7 +1628,7 @@ extern void sel_sched_region (int);
extern loop_p get_loop_nest_for_rgn (unsigned int);
extern bool considered_for_pipelining_p (struct loop *);
extern void make_region_from_loop_preheader (VEC(basic_block, heap) **);
-extern void sel_add_loop_preheaders (void);
+extern void sel_add_loop_preheaders (bb_vec_t *);
extern bool sel_is_loop_preheader_p (basic_block);
extern void clear_outdated_rtx_info (basic_block);
extern void free_data_sets (basic_block);
diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c
index 415eaa4..42a2cde 100644
--- a/gcc/sel-sched.c
+++ b/gcc/sel-sched.c
@@ -6802,7 +6802,7 @@ current_region_empty_p (void)
/* Prepare and verify loop nest for pipelining. */
static void
-setup_current_loop_nest (int rgn)
+setup_current_loop_nest (int rgn, bb_vec_t *bbs)
{
current_loop_nest = get_loop_nest_for_rgn (rgn);
@@ -6811,7 +6811,7 @@ setup_current_loop_nest (int rgn)
/* If this loop has any saved loop preheaders from nested loops,
add these basic blocks to the current region. */
- sel_add_loop_preheaders ();
+ sel_add_loop_preheaders (bbs);
/* Check that we're starting with a valid information. */
gcc_assert (loop_latch_edge (current_loop_nest));
@@ -6850,9 +6850,6 @@ sel_region_init (int rgn)
if (current_region_empty_p ())
return true;
- if (flag_sel_sched_pipelining)
- setup_current_loop_nest (rgn);
-
sel_setup_region_sched_flags ();
bbs = VEC_alloc (basic_block, heap, current_nr_blocks);
@@ -6862,6 +6859,9 @@ sel_region_init (int rgn)
sel_init_bbs (bbs, NULL);
+ if (flag_sel_sched_pipelining)
+ setup_current_loop_nest (rgn, &bbs);
+
/* Initialize luids and dependence analysis which both sel-sched and haifa
need. */
sched_init_luids (bbs, NULL, NULL, NULL);
More information about the Gcc-bugs
mailing list