From 3e6a3f6fc3662f0c830f4d3e35634745ace379cf Mon Sep 17 00:00:00 2001 From: Andrey Belevantsev Date: Thu, 14 Oct 2010 11:56:47 +0400 Subject: [PATCH] re PR rtl-optimization/45570 (ICE: in cfg_preds_1, at sel-sched-ir.c:4584) PR rtl-optimization/45570 * sel-sched-ir.c (cfg_preds_1): When walking out of the region, assert that we are pipelining outer loops. Allow returning zero predecessors. * gcc.dg/pr45570.c: New test. From-SVN: r165454 --- gcc/ChangeLog | 7 ++++ gcc/sel-sched-ir.c | 12 +++++-- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/pr45570.c | 58 ++++++++++++++++++++++++++++++++++ 4 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr45570.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3735ff524c0..caf71b351f8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-10-14 Andrey Belevantsev + + PR rtl-optimization/45570 + * sel-sched-ir.c (cfg_preds_1): When walking out of the region, + assert that we are pipelining outer loops. Allow returning + zero predecessors. + 2010-10-14 Andrey Belevantsev * sel-sched-ir.c (maybe_tidy_empty_bb): Simplify comment. diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c index 34d5f51c272..f29f7116efc 100644 --- a/gcc/sel-sched-ir.c +++ b/gcc/sel-sched-ir.c @@ -4578,8 +4578,12 @@ cfg_preds_1 (basic_block bb, insn_t **preds, int *n, int *size) basic_block pred_bb = e->src; insn_t bb_end = BB_END (pred_bb); - /* ??? This code is not supposed to walk out of a region. */ - gcc_assert (in_current_region_p (pred_bb)); + if (!in_current_region_p (pred_bb)) + { + gcc_assert (flag_sel_sched_pipelining_outer_loops + && current_loop_nest); + continue; + } if (sel_bb_empty_p (pred_bb)) cfg_preds_1 (pred_bb, preds, n, size); @@ -4592,7 +4596,9 @@ cfg_preds_1 (basic_block bb, insn_t **preds, int *n, int *size) } } - gcc_assert (*n != 0); + gcc_assert (*n != 0 + || (flag_sel_sched_pipelining_outer_loops + && current_loop_nest)); } /* Find all predecessors of BB and record them in PREDS and their number diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5dda0f58184..98ca28465db 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-10-14 Andrey Belevantsev + + PR rtl-optimization/45570 + * gcc.dg/pr45570.c: New test. + 2010-10-13 H.J. Lu * gcc.target/i386/recip-vec-sqrtf-avx.c: New. diff --git a/gcc/testsuite/gcc.dg/pr45570.c b/gcc/testsuite/gcc.dg/pr45570.c new file mode 100644 index 00000000000..0b4b3676b9e --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr45570.c @@ -0,0 +1,58 @@ +/* { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } */ +/* { dg-options "O3 -fselective-scheduling2 -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops -ftracer" } */ +void +parser_get_next_char (char c, int qm, char *p) +{ + int quote_mode = 0; + for (; *p; p++) + { + if (qm) + { + if (quote_mode == 0 && *p == '"' && *(p - 1)) + { + quote_mode = 1; + continue; + } + if (quote_mode && *p == '"' && *(p - 1)) + quote_mode = 0; + } + if (quote_mode == 0 && *p == c && *(p - 1)) + break; + } +} + +void +parser_get_next_parameter (char *p) +{ + parser_get_next_char (':', 1, p); +} + +/* { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } */ +/* { dg-options "O3 -fselective-scheduling2 -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops -ftracer" } */ +void +parser_get_next_char (char c, int qm, char *p) +{ + int quote_mode = 0; + for (; *p; p++) + { + if (qm) + { + if (quote_mode == 0 && *p == '"' && *(p - 1)) + { + quote_mode = 1; + continue; + } + if (quote_mode && *p == '"' && *(p - 1)) + quote_mode = 0; + } + if (quote_mode == 0 && *p == c && *(p - 1)) + break; + } +} + +void +parser_get_next_parameter (char *p) +{ + parser_get_next_char (':', 1, p); +} +