[backport from gcc-4.7/trunk r183519, the commit forgot to add the test case, took it from the original patch submission ] gcc/ 2012-01-25 Andrey Belevantsev PR rtl-optimization/48374 * sel-sched-ir.h (get_all_loop_exits): Check for zero successors. gcc/testsuite/ 2012-01-25 Andrey Belevantsev PR rtl-optimization/48374 * gcc.dg/pr48374.c: New test. --- gcc-4.6.2/gcc/sel-sched-ir.h.~1~ 2011-04-07 14:07:24.000000000 +0200 +++ gcc-4.6.2/gcc/sel-sched-ir.h 2012-02-05 18:38:14.000000000 +0100 @@ -1119,7 +1119,8 @@ get_all_loop_exits (basic_block bb) /* If bb is empty, and we're skipping to loop exits, then consider bb as a possible gate to the inner loop now. */ while (sel_bb_empty_or_nop_p (bb) - && in_current_region_p (bb)) + && in_current_region_p (bb) + && EDGE_COUNT (bb->succs) > 0) { bb = single_succ (bb); --- gcc-4.6.2/gcc/testsuite/gcc.dg/pr48374.c.~1~ 1970-01-01 01:00:00.000000000 +0100 +++ gcc-4.6.2/gcc/testsuite/gcc.dg/pr48374.c 2012-02-05 18:43:09.000000000 +0100 @@ -0,0 +1,17 @@ +/* { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } */ +/* { dg-options "-O -fschedule-insns2 -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops -fselective-scheduling2 --param max-sched-extend-regions-iters=2" } */ + +void foo (int y) +{ + switch (y) + { + case 3: + case 5: + case 7: + case 11: + break; + default: + __builtin_unreachable (); + } +} +