+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
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);
/* 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
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