Hello. Quite obvious patch where I accidentally removed check for: if (!targetm.have_casesi () && !targetm.have_tablejump ())
Patch can bootstrap on ppc64le-redhat-linux and survives regression tests. Ready to be installed? Martin gcc/ChangeLog: 2018-06-21 Martin Liska <mli...@suse.cz> PR tree-optimization/86263 * tree-switch-conversion.c (jump_table_cluster::find_jump_tables): Bail out if is_enabled is false. * tree-switch-conversion.h (jump_table_cluster::is_enabled): New declaration. (jump_table_cluster::is_enabled): New function. --- gcc/tree-switch-conversion.c | 3 +++ gcc/tree-switch-conversion.h | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+)
diff --git a/gcc/tree-switch-conversion.c b/gcc/tree-switch-conversion.c index 5048a6cb951..ddd8cba7b98 100644 --- a/gcc/tree-switch-conversion.c +++ b/gcc/tree-switch-conversion.c @@ -1094,6 +1094,9 @@ jump_table_cluster::emit (tree index_expr, tree, vec<cluster *> jump_table_cluster::find_jump_tables (vec<cluster *> &clusters) { + if (!is_enabled ()) + return clusters.copy (); + unsigned l = clusters.length (); auto_vec<min_cluster_item> min; min.reserve (l + 1); diff --git a/gcc/tree-switch-conversion.h b/gcc/tree-switch-conversion.h index 03352832cb4..79a1320c448 100644 --- a/gcc/tree-switch-conversion.h +++ b/gcc/tree-switch-conversion.h @@ -254,6 +254,9 @@ struct jump_table_cluster: public group_cluster /* Return the smallest number of different values for which it is best to use a jump-table instead of a tree of conditional branches. */ static inline unsigned int case_values_threshold (void); + + /* Return whether jump table expansion is allowed. */ + static bool is_enabled (void); }; /* A GIMPLE switch statement can be expanded to a short sequence of bit-wise @@ -450,6 +453,23 @@ jump_table_cluster::case_values_threshold (void) return threshold; } +/* Return whether jump table expansion is allowed. */ +bool jump_table_cluster::is_enabled (void) +{ + /* If neither casesi or tablejump is available, or flag_jump_tables + over-ruled us, we really have no choice. */ + if (!targetm.have_casesi () && !targetm.have_tablejump ()) + return false; + if (!flag_jump_tables) + return false; +#ifndef ASM_OUTPUT_ADDR_DIFF_ELT + if (flag_pic) + return false; +#endif + + return true; +} + /* A case_bit_test represents a set of case nodes that may be selected from using a bit-wise comparison. HI and LO hold the integer to be tested against, TARGET_EDGE contains the