From 5e303cdee1ff01e4b302ef2f913c0bdd84ab967e Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Mon, 9 Nov 2020 14:26:04 +0100 Subject: [PATCH] Prefer bit-test over the jump table. 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 | 10 +++++----- 3 files changed, 20 insertions(+), 8 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..a87a2a3cd15 100644 --- a/gcc/tree-switch-conversion.c +++ b/gcc/tree-switch-conversion.c @@ -1743,10 +1743,10 @@ switch_decision_tree::analyze_switch_statement () reset_out_edges_aux (m_switch); - /* Find jump table clusters. */ - vec output = jump_table_cluster::find_jump_tables (clusters); + /* Find bit-test clusters. */ + vec output = bit_test_cluster::find_bit_tests (clusters); - /* Find bit test clusters. */ + /* Find jump table clusters. */ vec output2; auto_vec tmp; output2.create (1); @@ -1759,7 +1759,7 @@ switch_decision_tree::analyze_switch_statement () { if (!tmp.is_empty ()) { - vec n = bit_test_cluster::find_bit_tests (tmp); + vec 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 n = bit_test_cluster::find_bit_tests (tmp); + vec n = jump_table_cluster::find_jump_tables (tmp); output2.safe_splice (n); n.release (); } -- 2.30.2