]> git.ipfire.org Git - thirdparty/gcc.git/commit
gimple: Add limit after which slower switchlower algs are used [PR117091] [PR117352]
authorFilip Kastl <fkastl@suse.cz>
Wed, 11 Dec 2024 18:57:04 +0000 (19:57 +0100)
committerFilip Kastl <fkastl@suse.cz>
Wed, 11 Dec 2024 18:57:04 +0000 (19:57 +0100)
commit56946c801a7cf3a831a11870b7e11ba08bf9bd87
treed3b0154458a74d3b86a23025e3811cd2077e4927
parent337815c8bbd0fb5034223ad0e7899d1493e958a2
gimple: Add limit after which slower switchlower algs are used [PR117091] [PR117352]

This patch adds a limit on the number of cases of a switch.  When this
limit is exceeded, switch lowering decides to use faster but less
powerful algorithms.

In particular this means that for finding bit tests switch lowering
decides between the old dynamic programming O(n^2) algorithm and the
new greedy algorithm that Andi Kleen recently added but then reverted
due to PR117352.  It also means that switch lowering may bail out on
finding jump tables if the switch is too large  (Btw it also may not
bail!  It can happen that the greedy algorithms finds some bit tests
which then basically split the switch into multiple smaller switches and
those may be small enough to fit under the limit.)

The limit is implemented as --param switch-lower-slow-alg-max-cases.
Exceeding the limit is reported through -Wdisabled-optimization.

This patch fixes the issue with the greedy algorithm described in
PR117352.  The problem was incorrect usage of the is_beneficial()
heuristic.

gcc/ChangeLog:

PR middle-end/117091
PR middle-end/117352
* doc/invoke.texi: Add switch-lower-slow-alg-max-cases.
* params.opt: Add switch-lower-slow-alg-max-cases.
* tree-switch-conversion.cc (jump_table_cluster::find_jump_tables):
Note in a comment that we are looking for jump tables in
case sequences delimited by the already found bit tests.
(bit_test_cluster::find_bit_tests): Decide between
find_bit_tests_fast() and find_bit_tests_slow().
(bit_test_cluster::find_bit_tests_fast): New function.
(bit_test_cluster::find_bit_tests_slow): New function.
(switch_decision_tree::analyze_switch_statement): Report
exceeding the limit.
* tree-switch-conversion.h: Add find_bit_tests_fast() and
find_bit_tests_slow().

Co-Authored-By: Andi Kleen <ak@gcc.gnu.org>
Signed-off-by: Filip Kastl <fkastl@suse.cz>
gcc/doc/invoke.texi
gcc/params.opt
gcc/tree-switch-conversion.cc
gcc/tree-switch-conversion.h