aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2018-06-22 13:32:20 +0200
committerMartin Liska <marxin@gcc.gnu.org>2018-06-22 11:32:20 +0000
commit5885a1bd530e77cbe82578d07c59771e59a87c28 (patch)
treee89d27c1e190e257cf552b7f620e9ceed9a09243
parent0c172706f4c49a3015ecd248b90ddbbb62dbedec (diff)
downloadgcc-5885a1bd530e77cbe82578d07c59771e59a87c28.zip
gcc-5885a1bd530e77cbe82578d07c59771e59a87c28.tar.gz
gcc-5885a1bd530e77cbe82578d07c59771e59a87c28.tar.bz2
Fix emission of jump tables (PR tree-optimization/86263).
2018-06-22 Martin Liska <mliska@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. From-SVN: r261886
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/tree-switch-conversion.c3
-rw-r--r--gcc/tree-switch-conversion.h20
3 files changed, 32 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7cd1cc5..58729e7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2018-06-22 Martin Liska <mliska@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.
+
2018-06-22 Jan Hubicka <hubicka@ucw.cz>
* 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 62ae884..029ce8c 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 0335283..79a1320 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