Message ID | 53dc3976-e57f-c9e1-3330-446618486faa@suse.cz |
---|---|
State | New |
Headers | show |
Series | Group switch cases in switch lowering (PR tree-optimization/87205). | expand |
On Wed, Sep 5, 2018 at 10:31 AM Martin Liška <mliska@suse.cz> wrote: > > Hi. > > It's beneficial to group cases before switch lowering machinery > is making a decision what to do with a switch. > > Patch can bootstrap on ppc64le-redhat-linux and survives regression tests. > > Ready to be installed? Hmm, do we want to do this at O0? There it should be redundant given CFG build already performs it? We also perform it at .optimized (execute_cleanup_cfg_post_optimizing) plus when we redirect some edges and then call record_case_labels. Otherwise OK. Richard. > Martin > > > gcc/ChangeLog: > > 2018-09-04 Martin Liska <mliska@suse.cz> > > PR tree-optimization/87205 > * tree-switch-conversion.c (pass_lower_switch::execute): > Group cases for switch statements. > > gcc/testsuite/ChangeLog: > > 2018-09-04 Martin Liska <mliska@suse.cz> > > PR tree-optimization/87205 > * gcc.dg/tree-ssa/pr87205-2.c: New test. > * gcc.dg/tree-ssa/pr87205.c: New test. > --- > gcc/testsuite/gcc.dg/tree-ssa/pr87205-2.c | 18 ++++++++++++++++++ > gcc/testsuite/gcc.dg/tree-ssa/pr87205.c | 21 +++++++++++++++++++++ > gcc/tree-switch-conversion.c | 8 ++++++-- > 3 files changed, 45 insertions(+), 2 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr87205-2.c > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr87205.c > >
On 09/05/2018 11:31 AM, Richard Biener wrote: > On Wed, Sep 5, 2018 at 10:31 AM Martin Liška <mliska@suse.cz> wrote: >> >> Hi. >> >> It's beneficial to group cases before switch lowering machinery >> is making a decision what to do with a switch. >> >> Patch can bootstrap on ppc64le-redhat-linux and survives regression tests. >> >> Ready to be installed? > > Hmm, do we want to do this at O0? There it should be redundant given > CFG build already performs it? We also perform it at .optimized > (execute_cleanup_cfg_post_optimizing) plus when we redirect some > edges and then call record_case_labels. Sure, I'll not do it with O0. I'm going to install the patch. Martin > > Otherwise OK. > > Richard. > >> Martin >> >> >> gcc/ChangeLog: >> >> 2018-09-04 Martin Liska <mliska@suse.cz> >> >> PR tree-optimization/87205 >> * tree-switch-conversion.c (pass_lower_switch::execute): >> Group cases for switch statements. >> >> gcc/testsuite/ChangeLog: >> >> 2018-09-04 Martin Liska <mliska@suse.cz> >> >> PR tree-optimization/87205 >> * gcc.dg/tree-ssa/pr87205-2.c: New test. >> * gcc.dg/tree-ssa/pr87205.c: New test. >> --- >> gcc/testsuite/gcc.dg/tree-ssa/pr87205-2.c | 18 ++++++++++++++++++ >> gcc/testsuite/gcc.dg/tree-ssa/pr87205.c | 21 +++++++++++++++++++++ >> gcc/tree-switch-conversion.c | 8 ++++++-- >> 3 files changed, 45 insertions(+), 2 deletions(-) >> create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr87205-2.c >> create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr87205.c >> >>
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr87205-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr87205-2.c new file mode 100644 index 00000000000..fb1879ed71b --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr87205-2.c @@ -0,0 +1,18 @@ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +void f(int); +void h(unsigned i) +{ + switch (i) { + default: __builtin_unreachable(); + case 0: f(42); break; + case 1: f(42); break; + case 2: f(42); break; + case 3: f(42); break; + case 4: f(42); break; + case 5: f(42); break; + } +} + +/* { dg-final { scan-tree-dump-not "if" "optimized" } } */ +/* { dg-final { scan-tree-dump-not "switch" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr87205.c b/gcc/testsuite/gcc.dg/tree-ssa/pr87205.c new file mode 100644 index 00000000000..129e60747e2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr87205.c @@ -0,0 +1,21 @@ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +void f( int x ); + +void h( unsigned ix ) +{ + switch( ix ) + { + case 0: f(42); break; + case 1: f(42); break; + case 2: f(42); break; + case 3: f(42); break; + case 4: f(42); break; + case 5: f(42); break; + default: __builtin_unreachable(); + } +} + + +/* { dg-final { scan-tree-dump-not "if" "optimized" } } */ +/* { dg-final { scan-tree-dump-not "switch" "optimized" } } */ diff --git a/gcc/tree-switch-conversion.c b/gcc/tree-switch-conversion.c index 1f543b2ecc8..85039e23e58 100644 --- a/gcc/tree-switch-conversion.c +++ b/gcc/tree-switch-conversion.c @@ -2419,8 +2419,12 @@ pass_lower_switch<O0>::execute (function *fun) FOR_EACH_BB_FN (bb, fun) { gimple *stmt = last_stmt (bb); - if (stmt && gimple_code (stmt) == GIMPLE_SWITCH) - switch_statements.safe_push (stmt); + gswitch *swtch; + if (stmt && (swtch = dyn_cast<gswitch *> (stmt))) + { + group_case_labels_stmt (swtch); + switch_statements.safe_push (swtch); + } } for (unsigned i = 0; i < switch_statements.length (); i++)