From: Martin Liska Date: Fri, 22 Jun 2018 11:32:20 +0000 (+0200) Subject: Fix emission of jump tables (PR tree-optimization/86263). X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5885a1bd530e77cbe82578d07c59771e59a87c28;p=gcc.git Fix emission of jump tables (PR tree-optimization/86263). 2018-06-22 Martin Liska 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. From-SVN: r261886 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7cd1cc57ca5..58729e76dbb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2018-06-22 Martin Liska + + 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. + 2018-06-22 Jan Hubicka * lto-streamer-out.c (DFS::DFS_write_tree_body): Do not stream diff --git a/gcc/tree-switch-conversion.c b/gcc/tree-switch-conversion.c index 62ae8849474..029ce8c363f 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 jump_table_cluster::find_jump_tables (vec &clusters) { + if (!is_enabled ()) + return clusters.copy (); + unsigned l = clusters.length (); auto_vec 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