Hello.
As mentioned in the PR, we used to prefer BT over JT in switch expansion.
I restore the behavior to that.
Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
Ready to be installed?
Thanks,
Martin
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 | 12 ++++++++++++
gcc/testsuite/gcc.dg/tree-ssa/switch-1.c | 6 +++---
gcc/tree-switch-conversion.c | 8 ++++----
3 files changed, 19 insertions(+), 7 deletions(-)
create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr97736.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
index 00000000000..bda77e7e165
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/pr97736.C
@@ -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" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/switch-1.c
b/gcc/testsuite/gcc.dg/tree-ssa/switch-1.c
index 149687ca2bb..6f70c9de0c1 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/switch-1.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/switch-1.c
@@ -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" } } */
diff --git a/gcc/tree-switch-conversion.c b/gcc/tree-switch-conversion.c
index 426462e856b..a7c5df31743 100644
--- a/gcc/tree-switch-conversion.c
+++ b/gcc/tree-switch-conversion.c
@@ -1743,8 +1743,8 @@ 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. */
vec<cluster *> output2;
@@ -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 ();
}
--
2.29.2