Revert "Simplify switch bit test clustering algorithm"

This reverts commit 3d06e9c3e0.
This commit is contained in:
Andi Kleen 2024-10-29 16:41:57 -07:00
parent 0b73e9382a
commit 220e0570f0
5 changed files with 44 additions and 51 deletions

View File

@ -1,6 +1,6 @@
/* PR tree-optimization/21643 */ /* PR tree-optimization/21643 */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-reassoc1-details --param logical-op-non-short-circuit=1 -fno-bit-tests" } */ /* { dg-options "-O2 -fdump-tree-reassoc1-details --param logical-op-non-short-circuit=1" } */
int int
f1 (unsigned char c) f1 (unsigned char c)

View File

@ -39,4 +39,4 @@ int main(int argc, char **argv)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump "Condition chain" "iftoswitch" } } */ /* { dg-final { scan-tree-dump-not "Condition chain" "iftoswitch" } } */

View File

@ -107,4 +107,4 @@ int foo5 (int x)
} }
} }
/* { dg-final { scan-tree-dump ";; GIMPLE switch case clusters: BT:10-62 600-700 BT:1000-1021 111111" "switchlower1" } } */ /* { dg-final { scan-tree-dump ";; GIMPLE switch case clusters: BT:10-62 600-700 JT:1000-1021 111111" "switchlower1" } } */

View File

@ -1,5 +1,5 @@
/* { dg-do compile { target lp64 } } */ /* { dg-do compile { target lp64 } } */
/* { dg-options "-O2 -mbranch-protection=standard -fno-bit-tests" } */ /* { dg-options "-O2 -mbranch-protection=standard" } */
/* { dg-final { scan-assembler-times {bti j} 13 } } */ /* { dg-final { scan-assembler-times {bti j} 13 } } */
int a; int a;
int c(); int c();

View File

@ -1783,62 +1783,55 @@ bit_test_cluster::find_bit_tests (vec<cluster *> &clusters, int max_c)
return clusters.copy (); return clusters.copy ();
unsigned l = clusters.length (); unsigned l = clusters.length ();
vec<cluster *> output; auto_vec<min_cluster_item> min;
min.reserve (l + 1);
output.create (l); min.quick_push (min_cluster_item (0, 0, 0));
/* Look at sliding BITS_PER_WORD sized windows in the switch value space for (unsigned i = 1; i <= l; i++)
and determine if they are suitable for a bit test cluster. Worst case
this can examine every value BITS_PER_WORD-1 times. */
unsigned end;
for (unsigned i = 0; i < l; i += end)
{ {
HOST_WIDE_INT values = 0; /* Set minimal # of clusters with i-th item to infinite. */
hash_set<basic_block> targets; min.quick_push (min_cluster_item (INT_MAX, INT_MAX, INT_MAX));
cluster *start_cluster = clusters[i];
end = 0; for (unsigned j = 0; j < i; j++)
while (i + end < l)
{ {
cluster *end_cluster = clusters[i + end]; if (min[j].m_count + 1 < min[i].m_count
&& can_be_handled (clusters, j, i - 1))
/* Does value range fit into the BITS_PER_WORD window? */ min[i] = min_cluster_item (min[j].m_count + 1, j, INT_MAX);
HOST_WIDE_INT w = cluster::get_range (start_cluster->get_low (),
end_cluster->get_high ());
if (w == 0 || w > BITS_PER_WORD)
break;
/* Compute # of values tested for new case. */
HOST_WIDE_INT r = 1;
if (!end_cluster->is_single_value_p ())
r = cluster::get_range (end_cluster->get_low (),
end_cluster->get_high ());
if (r == 0)
break;
/* Check for max # of targets. */
if (targets.elements() == m_max_case_bit_tests
&& !targets.contains (end_cluster->m_case_bb))
break;
targets.add (end_cluster->m_case_bb);
values += r;
end++;
} }
if (is_beneficial (values, targets.elements ())) gcc_checking_assert (min[i].m_count != INT_MAX);
{
output.safe_push (new bit_test_cluster (clusters, i, i + end - 1,
i == 0 && end == l));
}
else
{
output.safe_push (clusters[i]);
/* ??? Might be able to skip more. */
end = 1;
}
} }
/* No result. */
if (min[l].m_count == l)
return clusters.copy ();
vec<cluster *> output;
output.create (4);
/* Find and build the clusters. */
for (unsigned end = l;;)
{
int start = min[end].m_start;
if (is_beneficial (clusters, start, end - 1))
{
bool entire = start == 0 && end == clusters.length ();
output.safe_push (new bit_test_cluster (clusters, start, end - 1,
entire));
}
else
for (int i = end - 1; i >= start; i--)
output.safe_push (clusters[i]);
end = start;
if (start <= 0)
break;
}
output.reverse ();
return output; return output;
} }