From 366ed8bc89a3dc61de6de614a1a8e75635ca8fea Mon Sep 17 00:00:00 2001 From: Andrey Belevantsev Date: Thu, 7 Apr 2011 11:00:10 +0400 Subject: [PATCH] backport: re PR rtl-optimization/46875 (ICE: verify_flow_info failed: too many outgoing branch edges from bb 3 with -Os -fselective-scheduling2) Backport from mainline 2010-12-14 Alexander Monakov PR rtl-optimization/46875 * sched-vis.c (print_pattern): Dump "sequence" for ADDR_VECs. * sel-sched-ir.c (bb_has_removable_jump_to_p): Forbid table jumps. From-SVN: r172085 --- gcc/ChangeLog | 9 +++++++++ gcc/sched-vis.c | 2 +- gcc/sel-sched-ir.c | 3 ++- gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/gcc.dg/pr46875.c | 27 +++++++++++++++++++++++++++ 5 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr46875.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8311907c7295..90f310ae051d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2011-04-07 Andrey Belevantsev + + Backport from mainline + 2010-12-14 Alexander Monakov + + PR rtl-optimization/46875 + * sched-vis.c (print_pattern): Dump "sequence" for ADDR_VECs. + * sel-sched-ir.c (bb_has_removable_jump_to_p): Forbid table jumps. + 2011-04-07 Andrey Belevantsev Backport from mainline diff --git a/gcc/sched-vis.c b/gcc/sched-vis.c index 5754a56a5fa7..805b8cffbfbf 100644 --- a/gcc/sched-vis.c +++ b/gcc/sched-vis.c @@ -600,7 +600,7 @@ print_pattern (char *buf, const_rtx x, int verbose) sprintf (buf, "asm {%s}", XSTR (x, 0)); break; case ADDR_VEC: - break; + /* Fall through. */ case ADDR_DIFF_VEC: print_value (buf, XEXP (x, 0), verbose); break; diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c index 154b9e2d49dc..4c3d94a73609 100644 --- a/gcc/sel-sched-ir.c +++ b/gcc/sel-sched-ir.c @@ -6129,7 +6129,8 @@ sel_is_loop_preheader_p (basic_block bb) static bool bb_has_removable_jump_to_p (basic_block jump_bb, basic_block dest_bb) { - if (!onlyjump_p (BB_END (jump_bb))) + if (!onlyjump_p (BB_END (jump_bb)) + || tablejump_p (BB_END (jump_bb), NULL, NULL)) return false; /* Several outgoing edges, abnormal edge or destination of jump is diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d943dd376861..ea578fabf131 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2011-04-07 Andrey Belevantsev + + Backport from mainline + 2010-12-14 Alexander Monakov + + PR rtl-optimization/46875 + * gcc.dg/pr46875.c: New. + 2011-04-07 Andrey Belevantsev Backport from mainline diff --git a/gcc/testsuite/gcc.dg/pr46875.c b/gcc/testsuite/gcc.dg/pr46875.c new file mode 100644 index 000000000000..c601708dc117 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr46875.c @@ -0,0 +1,27 @@ +/* { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } */ +/* { dg-options "-Os -fselective-scheduling2" } */ + +long +foo (int x, long *y) +{ + long a = 0; + switch (x) + { + case 0: + a = *y; + break; + case 1: + a = *y; + break; + case 2: + a = *y; + break; + case 3: + a = *y; + break; + case 4: + a = *y; + break; + } + return a; +} -- 2.47.2