Fix emission of jump tables (PR tree-optimization/86263).
authorMartin Liska <mliska@suse.cz>
Fri, 22 Jun 2018 11:32:20 +0000 (13:32 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Fri, 22 Jun 2018 11:32:20 +0000 (11:32 +0000)
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

gcc/ChangeLog
gcc/tree-switch-conversion.c
gcc/tree-switch-conversion.h

index 7cd1cc57ca5c2936e1f0e7ce774112e02c9dc839..58729e76dbbde995429195443b9e41733bde116a 100644 (file)
@@ -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
index 62ae884947499a39341ae113c7a20d1f8f210a55..029ce8c363f9fc2dfa2c395e3d631ff46d050e22 100644 (file)
@@ -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);
index 03352832cb46d35b6138b4dc38c72d87685dba18..79a1320c4483f884dca22d444bd97e16c1bc85dd 100644 (file)
@@ -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