From aec06f6fa8948de6eb8e23028b5ebf4e5fd3e36a Mon Sep 17 00:00:00 2001
From: Richard Biener <rguenther@suse.de>
Date: Fri, 12 Oct 2012 12:14:03 +0000
Subject: [PATCH] re PR lto/54898 (ICE in uniquify_nodes, at lto/lto.c:1898)

2012-10-12  Richard Biener  <rguenther@suse.de>

	PR lto/54898
	* lto.c (gimple_types_compatible_p_1): Also compare
	TYPE_MAIN_VARIANT.
	(iterative_hash_gimple_type): Also hash TYPE_MAIN_VARIANT.

From-SVN: r192397
---
 gcc/lto/ChangeLog |  7 +++++++
 gcc/lto/lto.c     | 15 +++++++++++++++
 2 files changed, 22 insertions(+)

diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog
index 265922f5d133..49b8af0235df 100644
--- a/gcc/lto/ChangeLog
+++ b/gcc/lto/ChangeLog
@@ -1,3 +1,10 @@
+2012-10-12  Richard Biener  <rguenther@suse.de>
+
+	PR lto/54898
+	* lto.c (gimple_types_compatible_p_1): Also compare
+	TYPE_MAIN_VARIANT.
+	(iterative_hash_gimple_type): Also hash TYPE_MAIN_VARIANT.
+
 2012-10-09  Tobias Burnus  <burnus@net-b.de>
 
 	* lto-lang.c (lto_register_builtin_type): Avoid useless
diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
index 2b9156aebbaa..7f64daee2192 100644
--- a/gcc/lto/lto.c
+++ b/gcc/lto/lto.c
@@ -581,6 +581,15 @@ gimple_types_compatible_p_1 (tree t1, tree t2, type_pair_t p,
   if (!compare_type_names_p (t1, t2))
     goto different_types;
 
+  /* The main variant of both types should compare equal.  */
+  if (TYPE_MAIN_VARIANT (t1) != t1
+      || TYPE_MAIN_VARIANT (t2) != t2)
+    {
+      if (!gtc_visit (TYPE_MAIN_VARIANT (t1), TYPE_MAIN_VARIANT (t2),
+		      state, sccstack, sccstate, sccstate_obstack))
+	goto different_types;
+    }
+
   /* We may not merge typedef types to the same type in different
      contexts.  */
   if (TYPE_NAME (t1)
@@ -1101,6 +1110,12 @@ iterative_hash_gimple_type (tree type, hashval_t val,
       && TYPE_P (DECL_CONTEXT (TYPE_NAME (type))))
     v = visit (DECL_CONTEXT (TYPE_NAME (type)), state, v,
 	       sccstack, sccstate, sccstate_obstack);
+
+  /* Factor in the variant structure.  */
+  if (TYPE_MAIN_VARIANT (type) != type)
+    v = visit (TYPE_MAIN_VARIANT (type), state, v,
+	       sccstack, sccstate, sccstate_obstack);
+
   v = iterative_hash_hashval_t (TREE_CODE (type), v);
   v = iterative_hash_hashval_t (TYPE_QUALS (type), v);
   v = iterative_hash_hashval_t (TREE_ADDRESSABLE (type), v);
-- 
GitLab