Fix thinko in early bail out in tree-switch-conversion.
2019-09-02 Martin Liska <mliska@suse.cz> * tree-switch-conversion.c (jump_table_cluster::find_jump_tables): Bail out when we'll end up with the same number of clusters as at the beginning. (bit_test_cluster::find_bit_tests): Likewise for bit tests. (jump_table_cluster::can_be_handled): Remove the guard as it's already handled in ::is_enabled. Allocate output after early bail out. From-SVN: r275293
This commit is contained in:
parent
ae0d3f6a59
commit
1acbaa7530
2 changed files with 18 additions and 10 deletions
|
@ -1,3 +1,13 @@
|
|||
2019-09-02 Martin Liska <mliska@suse.cz>
|
||||
|
||||
* tree-switch-conversion.c (jump_table_cluster::find_jump_tables):
|
||||
Bail out when we'll end up with the same number of clusters as
|
||||
at the beginning.
|
||||
(bit_test_cluster::find_bit_tests): Likewise for bit tests.
|
||||
(jump_table_cluster::can_be_handled): Remove the guard
|
||||
as it's already handled in ::is_enabled. Allocate output
|
||||
after early bail out.
|
||||
|
||||
2019-09-02 Martin Liska <mliska@suse.cz>
|
||||
|
||||
PR gcov-profile/91601
|
||||
|
|
|
@ -1214,14 +1214,14 @@ jump_table_cluster::find_jump_tables (vec<cluster *> &clusters)
|
|||
}
|
||||
|
||||
/* No result. */
|
||||
if (min[l].m_count == INT_MAX)
|
||||
if (min[l].m_count == l)
|
||||
return clusters.copy ();
|
||||
|
||||
vec<cluster *> output;
|
||||
output.create (4);
|
||||
|
||||
/* Find and build the clusters. */
|
||||
for (int end = l;;)
|
||||
for (unsigned int end = l;;)
|
||||
{
|
||||
int start = min[end].m_start;
|
||||
|
||||
|
@ -1258,11 +1258,9 @@ jump_table_cluster::can_be_handled (const vec<cluster *> &clusters,
|
|||
make a sequence of conditional branches instead of a dispatch.
|
||||
|
||||
The definition of "much bigger" depends on whether we are
|
||||
optimizing for size or for speed. */
|
||||
if (!flag_jump_tables)
|
||||
return false;
|
||||
optimizing for size or for speed.
|
||||
|
||||
/* For algorithm correctness, jump table for a single case must return
|
||||
For algorithm correctness, jump table for a single case must return
|
||||
true. We bail out in is_beneficial if it's called just for
|
||||
a single case. */
|
||||
if (start == end)
|
||||
|
@ -1312,9 +1310,6 @@ jump_table_cluster::is_beneficial (const vec<cluster *> &,
|
|||
vec<cluster *>
|
||||
bit_test_cluster::find_bit_tests (vec<cluster *> &clusters)
|
||||
{
|
||||
vec<cluster *> output;
|
||||
output.create (4);
|
||||
|
||||
unsigned l = clusters.length ();
|
||||
auto_vec<min_cluster_item> min;
|
||||
min.reserve (l + 1);
|
||||
|
@ -1337,9 +1332,12 @@ bit_test_cluster::find_bit_tests (vec<cluster *> &clusters)
|
|||
}
|
||||
|
||||
/* No result. */
|
||||
if (min[l].m_count == INT_MAX)
|
||||
if (min[l].m_count == l)
|
||||
return clusters.copy ();
|
||||
|
||||
vec<cluster *> output;
|
||||
output.create (4);
|
||||
|
||||
/* Find and build the clusters. */
|
||||
for (unsigned end = l;;)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue