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]

Re: Fix computation of TYPE_CANONICAL of VECTOR_TYPE


On Tue, 24 Nov 2015, Jan Hubicka wrote:

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

Ok.

Thanks,
Richard.

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

-- 
Richard Biener <rguenther@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)


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