From 762bffbac19855194ddcf644c332cee01be701be Mon Sep 17 00:00:00 2001 From: Andrey Belevantsev Date: Thu, 14 Jan 2010 14:02:18 +0300 Subject: [PATCH] re PR rtl-optimization/42388 (ICE in move_bb_info with sel-sched and modulo-sched for 176.gcc) PR rtl-optimization/42388 * sel-sched-ir.c (maybe_tidy_empty_bb): Do not delete empty blocks that have no predecessors nor successors. Do not call move_bb_info for empty blocks outside of current region. From-SVN: r155894 --- gcc/ChangeLog | 7 ++++ gcc/sel-sched-ir.c | 10 +++-- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/pr42388.c | 67 ++++++++++++++++++++++++++++++++++ 4 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr42388.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c8bd4c97f7e..eb096499c85 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-01-14 Andrey Belevantsev + + PR rtl-optimization/42388 + * sel-sched-ir.c (maybe_tidy_empty_bb): Do not delete empty blocks + that have no predecessors nor successors. Do not call move_bb_info + for empty blocks outside of current region. + 2010-01-14 Alexander Monakov PR rtl-optimization/42294 diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c index 218c04e5bf1..1353b4cfc65 100644 --- a/gcc/sel-sched-ir.c +++ b/gcc/sel-sched-ir.c @@ -3540,12 +3540,15 @@ maybe_tidy_empty_bb (basic_block bb, bool recompute_toporder_p) bool rescan_p; /* Keep empty bb only if this block immediately precedes EXIT and - has incoming non-fallthrough edge. Otherwise remove it. */ + has incoming non-fallthrough edge, or it has no predecessors or + successors. Otherwise remove it. */ if (!sel_bb_empty_p (bb) || (single_succ_p (bb) && single_succ (bb) == EXIT_BLOCK_PTR && (!single_pred_p (bb) - || !(single_pred_edge (bb)->flags & EDGE_FALLTHRU)))) + || !(single_pred_edge (bb)->flags & EDGE_FALLTHRU))) + || EDGE_COUNT (bb->preds) == 0 + || EDGE_COUNT (bb->succs) == 0) return false; /* Do not attempt to redirect complex edges. */ @@ -3595,7 +3598,8 @@ maybe_tidy_empty_bb (basic_block bb, bool recompute_toporder_p) { gcc_assert (pred_bb != NULL); - move_bb_info (pred_bb, bb); + if (in_current_region_p (pred_bb)) + move_bb_info (pred_bb, bb); remove_empty_bb (bb, true); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6389af52eaf..dfc02daad65 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-01-14 Alexander Monakov + + PR rtl-optimization/42388 + * gcc.dg/pr42388.c: New. + 2010-01-14 Alexander Monakov PR rtl-optimization/42294 diff --git a/gcc/testsuite/gcc.dg/pr42388.c b/gcc/testsuite/gcc.dg/pr42388.c new file mode 100644 index 00000000000..ad97eb4d98a --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr42388.c @@ -0,0 +1,67 @@ +/* { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } */ +/* { dg-options "-O2 -fselective-scheduling -fmodulo-sched" } */ + +enum rtx_code +{ + INSN, ADDR_VEC, ADDR_DIFF_VEC, CALL_INSN, CODE_LABEL, BARRIER, NOTE +}; +typedef union rtunion_def +{ + int rtint; + char *rtstr; + struct rtx_def *rtx; + struct rtvec_def *rtvec; +} +rtunion; +typedef struct rtx_def +{ + unsigned short code; + rtunion fld[1]; +} + *rtx; +typedef struct rtvec_def +{ + unsigned num_elem; + rtunion elem[1]; +} + *rtvec; +extern rtx emit_barrier (void); +extern rtx emit_note (char *); + +static void +copy_loop_body (rtx *map) +{ + int i; + rtx insn, copy; + rtx pat = copy->fld[3].rtx; + + switch (insn->code) + { + case INSN: + if (insn->fld[7].rtx) + { + } + else if (pat->code == ADDR_VEC || pat->code == ADDR_DIFF_VEC) + { + int diff_vec_p = pat->code == ADDR_DIFF_VEC; + int len = pat->fld[diff_vec_p].rtvec->num_elem; + for (i = 0; i < len; i++) + pat->fld[diff_vec_p].rtvec->elem[i].rtx->fld[5].rtint++; + } + case CALL_INSN: + for (i = 0; i < 64; i++) + map[i] = 0; + case CODE_LABEL: + case BARRIER: + copy = emit_barrier (); + case NOTE: + copy = emit_note ("x"); + } +} +void +unroll_loop (int insn_count, rtx *map) +{ + if (insn_count > 50) + copy_loop_body (map); +} + -- 2.30.2