This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix emission of jump tables (PR tree-optimization/86263).
- From: Martin Liška <mliska at suse dot cz>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Jeff Law <law at redhat dot com>
- Date: Fri, 22 Jun 2018 11:21:47 +0200
- Subject: [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