Message ID | 4F1FF779.6050904@ispras.ru |
---|---|
State | New |
Headers | show |
2012/1/25 Andrey Belevantsev <abel@ispras.ru>: > Hello, > > This patch fixes another problem with sel-sched not happy having bbs with > zero successors. Bootstrapped and tested on x86_64/linux. > > Again, this is not a regression as __builtin_unreachable did not exist > before sel-sched, but the patch is very safe and obvious. It is my fault > not committing this earlier (the patch in the audit trail was created in > April 2011). What do release managers think? Looks fine for me. Richard. > Andrey > > gcc/ > 2012-01-25 Andrey Belevantsev <abel@ispras.ru> > > PR rtl-optimization/48374 > * sel-sched-ir.h (get_all_loop_exits): Check for zero successors. > > testsuite/ > 2012-01-25 Andrey Belevantsev <abel@ispras.ru> > > PR rtl-optimization/48374 > * gcc.dg/pr48374.c: New test. > > diff --git a/gcc/sel-sched-ir.h b/gcc/sel-sched-ir.h > index c8f8be6..ede08e4 100644 > --- a/gcc/sel-sched-ir.h > +++ b/gcc/sel-sched-ir.h > @@ -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); > > diff --git a/gcc/testsuite/gcc.dg/pr48374.c b/gcc/testsuite/gcc.dg/pr48374.c > new file mode 100644 > index 0000000..24826d5 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/pr48374.c > @@ -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 (); > + } > +} > + >
diff --git a/gcc/sel-sched-ir.h b/gcc/sel-sched-ir.h index c8f8be6..ede08e4 100644 --- a/gcc/sel-sched-ir.h +++ b/gcc/sel-sched-ir.h @@ -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); diff --git a/gcc/testsuite/gcc.dg/pr48374.c b/gcc/testsuite/gcc.dg/pr48374.c new file mode 100644 index 0000000..24826d5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr48374.c @@ -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 (); + } +}