* 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
* Re: Fix computation of TYPE_CANONICAL of VECTOR_TYPE
2015-11-24 4:02 Fix computation of TYPE_CANONICAL of VECTOR_TYPE Jan Hubicka
@ 2015-11-24 9:16 ` Richard Biener
0 siblings, 0 replies; 2+ messages in thread
From: Richard Biener @ 2015-11-24 9:16 UTC (permalink / raw)
To: Jan Hubicka; +Cc: gcc-patches
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)
^ 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).