aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Schwinge <thomas@codesourcery.com>2016-10-19 12:48:46 +0200
committerThomas Schwinge <tschwinge@gcc.gnu.org>2016-10-19 12:48:46 +0200
commit3b834a2e0161ace8a7b494dfc6794d61ba200706 (patch)
treecac09dcff81f9e30d164873c8d71e870e48397c9
parentaff98801acf8f627d317c1f30cd6f59af55dbf79 (diff)
downloadgcc-3b834a2e0161ace8a7b494dfc6794d61ba200706.zip
gcc-3b834a2e0161ace8a7b494dfc6794d61ba200706.tar.gz
gcc-3b834a2e0161ace8a7b494dfc6794d61ba200706.tar.bz2
[PR lto/77458] Avoid ICE in offloading with differing _FloatN, _FloatNx types
gcc/ PR lto/77458 * tree-core.h (enum tree_index): Put the complex types after their component types. * tree-streamer.c (verify_common_node_recorded): New function. (preload_common_nodes) <TREE_CODE (node) == COMPLEX_TYPE>: Use it. From-SVN: r241338
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/tree-core.h31
-rw-r--r--gcc/tree-streamer.c32
3 files changed, 56 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 59b00d16..b50e2e4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2016-10-19 Thomas Schwinge <thomas@codesourcery.com>
+
+ PR lto/77458
+ * tree-core.h (enum tree_index): Put the complex types after their
+ component types.
+ * tree-streamer.c (verify_common_node_recorded): New function.
+ (preload_common_nodes) <TREE_CODE (node) == COMPLEX_TYPE>: Use it.
+
2016-10-19 Martin Liska <mliska@suse.cz>
* cgraph.h (cgraph_edge::binds_to_current_def_p):
diff --git a/gcc/tree-core.h b/gcc/tree-core.h
index 1bfe682..3e3f31e 100644
--- a/gcc/tree-core.h
+++ b/gcc/tree-core.h
@@ -556,20 +556,6 @@ enum tree_index {
TI_BOOLEAN_FALSE,
TI_BOOLEAN_TRUE,
- TI_COMPLEX_INTEGER_TYPE,
- TI_COMPLEX_FLOAT_TYPE,
- TI_COMPLEX_DOUBLE_TYPE,
- TI_COMPLEX_LONG_DOUBLE_TYPE,
-
- TI_COMPLEX_FLOAT16_TYPE,
- TI_COMPLEX_FLOATN_NX_TYPE_FIRST = TI_COMPLEX_FLOAT16_TYPE,
- TI_COMPLEX_FLOAT32_TYPE,
- TI_COMPLEX_FLOAT64_TYPE,
- TI_COMPLEX_FLOAT128_TYPE,
- TI_COMPLEX_FLOAT32X_TYPE,
- TI_COMPLEX_FLOAT64X_TYPE,
- TI_COMPLEX_FLOAT128X_TYPE,
-
TI_FLOAT_TYPE,
TI_DOUBLE_TYPE,
TI_LONG_DOUBLE_TYPE,
@@ -599,6 +585,23 @@ enum tree_index {
- TI_FLOATN_NX_TYPE_FIRST \
+ 1)
+ /* Put the complex types after their component types, so that in (sequential)
+ tree streaming we can assert that their component types have already been
+ handled (see tree-streamer.c:record_common_node). */
+ TI_COMPLEX_INTEGER_TYPE,
+ TI_COMPLEX_FLOAT_TYPE,
+ TI_COMPLEX_DOUBLE_TYPE,
+ TI_COMPLEX_LONG_DOUBLE_TYPE,
+
+ TI_COMPLEX_FLOAT16_TYPE,
+ TI_COMPLEX_FLOATN_NX_TYPE_FIRST = TI_COMPLEX_FLOAT16_TYPE,
+ TI_COMPLEX_FLOAT32_TYPE,
+ TI_COMPLEX_FLOAT64_TYPE,
+ TI_COMPLEX_FLOAT128_TYPE,
+ TI_COMPLEX_FLOAT32X_TYPE,
+ TI_COMPLEX_FLOAT64X_TYPE,
+ TI_COMPLEX_FLOAT128X_TYPE,
+
TI_FLOAT_PTR_TYPE,
TI_DOUBLE_PTR_TYPE,
TI_LONG_DOUBLE_PTR_TYPE,
diff --git a/gcc/tree-streamer.c b/gcc/tree-streamer.c
index 2139e96..70054b1 100644
--- a/gcc/tree-streamer.c
+++ b/gcc/tree-streamer.c
@@ -248,6 +248,32 @@ streamer_tree_cache_lookup (struct streamer_tree_cache_d *cache, tree t,
}
+/* Verify that NODE is in CACHE. */
+
+static void
+verify_common_node_recorded (struct streamer_tree_cache_d *cache, tree node)
+{
+ /* Restrict this to flag_checking only because in general violating it is
+ harmless plus we never know what happens on all targets/frontend/flag(!)
+ combinations. */
+ if (!flag_checking)
+ return;
+
+ if (cache->node_map)
+ gcc_assert (streamer_tree_cache_lookup (cache, node, NULL));
+ else
+ {
+ bool found = false;
+ gcc_assert (cache->nodes.exists ());
+ /* Linear search... */
+ for (unsigned i = 0; !found && i < cache->nodes.length (); ++i)
+ if (cache->nodes[i] == node)
+ found = true;
+ gcc_assert (found);
+ }
+}
+
+
/* Record NODE in CACHE. */
static void
@@ -293,11 +319,15 @@ record_common_node (struct streamer_tree_cache_d *cache, tree node)
/* No recursive trees. */
break;
case ARRAY_TYPE:
- case COMPLEX_TYPE:
case POINTER_TYPE:
case REFERENCE_TYPE:
record_common_node (cache, TREE_TYPE (node));
break;
+ case COMPLEX_TYPE:
+ /* Verify that a complex type's component type (node_type) has been
+ handled already (and we thus don't need to recurse here). */
+ verify_common_node_recorded (cache, TREE_TYPE (node));
+ break;
case RECORD_TYPE:
/* The FIELD_DECLs of structures should be shared, so that every
COMPONENT_REF uses the same tree node when referencing a field.