This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix emission of jump tables (PR tree-optimization/86263).


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  <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.
---
 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]