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.
This commit is contained in:
parent
d12603b746
commit
5e303cdee1
3 changed files with 20 additions and 8 deletions
12
gcc/testsuite/g++.dg/tree-ssa/pr97736.C
Normal file
12
gcc/testsuite/g++.dg/tree-ssa/pr97736.C
Normal file
|
@ -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" } } */
|
|
@ -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" } } */
|
||||
|
|
|
@ -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 ();
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue