diff mbox series

Group switch cases in switch lowering (PR tree-optimization/87205).

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

Commit Message

Martin Liška Sept. 5, 2018, 8:31 a.m. UTC
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?
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

Comments

Richard Biener Sept. 5, 2018, 9:31 a.m. UTC | #1
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
>
>
Martin Liška Sept. 5, 2018, 11:06 a.m. UTC | #2
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 mbox series

Patch

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++)