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 <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)