Prefer bit-test over the jump table.
authorMartin Liska <mliska@suse.cz>
Mon, 9 Nov 2020 13:26:04 +0000 (14:26 +0100)
committerMartin Liska <mliska@suse.cz>
Mon, 16 Nov 2020 09:54:29 +0000 (10:54 +0100)
gcc/ChangeLog:

PR tree-optimization/97736
* tree-switch-conversion.c (switch_decision_tree::analyze_switch_statement):
Prefer bit tests.

gcc/testsuite/ChangeLog:

PR tree-optimization/97736
* gcc.dg/tree-ssa/switch-1.c: Prefer bit tests.
* g++.dg/tree-ssa/pr97736.C: New test.

gcc/testsuite/g++.dg/tree-ssa/pr97736.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/switch-1.c
gcc/tree-switch-conversion.c

diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr97736.C b/gcc/testsuite/g++.dg/tree-ssa/pr97736.C
new file mode 100644 (file)
index 0000000..bda77e7
--- /dev/null
@@ -0,0 +1,12 @@
+/* PR tree-optimization/97736 */
+/* { dg-do compile { target { { x86_64-*-* aarch64-*-* ia64-*-* powerpc64-*-* } && lp64 } } } */
+/* { dg-options "-O2 -fdump-tree-switchlower1" } */
+
+bool is_vowel(char c) {
+    switch (c)
+  case'a':case'e':case'i':case'o':case'u':
+      return true;
+      return false;
+}
+
+/* { dg-final { scan-tree-dump ";; GIMPLE switch case clusters: BT:97-117" "switchlower1" } } */
index 149687c..6f70c9d 100644 (file)
@@ -54,7 +54,7 @@ int foo3 (int x)
   }
 }
 
-/* { dg-final { scan-tree-dump ";; GIMPLE switch case clusters: JT:0-62" "switchlower1" } } */
+/* { dg-final { scan-tree-dump ";; GIMPLE switch case clusters: BT:0-62" "switchlower1" } } */
 
 int foo4 (int x)
 {
@@ -77,7 +77,7 @@ int foo4 (int x)
   }
 }
 
-/* { dg-final { scan-tree-dump ";; GIMPLE switch case clusters: -100 JT:10-62 600-700" "switchlower1" } } */
+/* { dg-final { scan-tree-dump ";; GIMPLE switch case clusters: -100 BT:10-62 600-700" "switchlower1" } } */
 
 int foo5 (int x)
 {
@@ -107,4 +107,4 @@ int foo5 (int x)
   }
 }
 
-/* { dg-final { scan-tree-dump ";; GIMPLE switch case clusters: JT:10-62 600-700 JT:1000-1021 111111" "switchlower1" } } */
+/* { dg-final { scan-tree-dump ";; GIMPLE switch case clusters: BT:10-62 600-700 JT:1000-1021 111111" "switchlower1" } } */
index 426462e..a87a2a3 100644 (file)
@@ -1743,10 +1743,10 @@ switch_decision_tree::analyze_switch_statement ()
 
   reset_out_edges_aux (m_switch);
 
-  /* Find jump table clusters.  */
-  vec<cluster *> output = jump_table_cluster::find_jump_tables (clusters);
+  /* Find bit-test clusters.  */
+  vec<cluster *> output = bit_test_cluster::find_bit_tests (clusters);
 
-  /* Find bit test clusters.  */
+  /* Find jump table clusters.  */
   vec<cluster *> output2;
   auto_vec<cluster *> tmp;
   output2.create (1);
@@ -1759,7 +1759,7 @@ switch_decision_tree::analyze_switch_statement ()
        {
          if (!tmp.is_empty ())
            {
-             vec<cluster *> n = bit_test_cluster::find_bit_tests (tmp);
+             vec<cluster *> n = jump_table_cluster::find_jump_tables (tmp);
              output2.safe_splice (n);
              n.release ();
              tmp.truncate (0);
@@ -1773,7 +1773,7 @@ switch_decision_tree::analyze_switch_statement ()
   /* We still can have a temporary vector to test.  */
   if (!tmp.is_empty ())
     {
-      vec<cluster *> n = bit_test_cluster::find_bit_tests (tmp);
+      vec<cluster *> n = jump_table_cluster::find_jump_tables (tmp);
       output2.safe_splice (n);
       n.release ();
     }