public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* Fix computation of TYPE_CANONICAL of VECTOR_TYPE
@ 2015-11-24  4:02 Jan Hubicka
  2015-11-24  9:16 ` Richard Biener
  0 siblings, 1 reply; 2+ messages in thread
From: Jan Hubicka @ 2015-11-24  4:02 UTC (permalink / raw)
  To: gcc-patches, rguenther

Hi,
this patch fixes ICE triggered by extra sanity check I added while fixing
another type checking ICE during Ada bootstrap.

The canonical types of verctor typs are not constructed correctly.  If
make_vector_type is called with INNERTYPE being a variant (say const char),
it builds first the main variant (i.e. vector for char) but when it does
canonical type of it, it recurses for vector of TYPE_CANONICAL(const char)
instead of TYPE_CANONICAL (char). Se we end up with vector of char while
TYPE_CANONICAL is vector of const char

With the new sanity check I added to type verifier this now reproduces as
several ICEs in the vectorizer testuiste.

Bootstrapped/regtested x86_64-linux, OK?

	* tree.c (make_vector_type): Properly compute canonical type of the
	main variant.
	(verify_type): Verify that TYPE_CANONICAl of TYPE_MAIN_VARIANT is
	a main variant.
Index: tree.c
===================================================================
--- tree.c	(revision 230783)
+++ tree.c	(working copy)
@@ -9843,19 +9844,21 @@ make_vector_type (tree innertype, int nu
 {
   tree t;
   inchash::hash hstate;
+  tree mv_innertype = TYPE_MAIN_VARIANT (innertype);
 
   t = make_node (VECTOR_TYPE);
-  TREE_TYPE (t) = TYPE_MAIN_VARIANT (innertype);
+  TREE_TYPE (t) = mv_innertype;
   SET_TYPE_VECTOR_SUBPARTS (t, nunits);
   SET_TYPE_MODE (t, mode);
 
-  if (TYPE_STRUCTURAL_EQUALITY_P (innertype))
+  if (TYPE_STRUCTURAL_EQUALITY_P (mv_innertype))
     SET_TYPE_STRUCTURAL_EQUALITY (t);
-  else if ((TYPE_CANONICAL (innertype) != innertype
+  else if ((TYPE_CANONICAL (mv_innertype) != mv_innertype
 	    || mode != VOIDmode)
 	   && !VECTOR_BOOLEAN_TYPE_P (t))
     TYPE_CANONICAL (t)
-      = make_vector_type (TYPE_CANONICAL (innertype), nunits, VOIDmode);
+      = make_vector_type (TYPE_CANONICAL (mv_innertype),
+			  nunits, VOIDmode);
 
   layout_type (t);
 
@@ -13522,6 +13525,13 @@ verify_type (const_tree t)
       debug_tree (ct);
       error_found = true;
     }
+  if (TYPE_MAIN_VARIANT (t) == t && ct && TYPE_MAIN_VARIANT (ct) != ct)
+   {
+      error ("TYPE_CANONICAL of main variant is not main variant");
+      debug_tree (ct);
+      debug_tree (TYPE_MAIN_VARIANT (ct));
+      error_found = true;
+   }
 
 
   /* Check various uses of TYPE_MINVAL.  */

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-11-24  9:01 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-11-24  4:02 Fix computation of TYPE_CANONICAL of VECTOR_TYPE Jan Hubicka
2015-11-24  9:16 ` Richard Biener

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).