[Bug lto/88140] [9 Regression] ICE: verify_gimple failed since r266325

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Nov 28 08:28:00 GMT 2018


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88140

--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Jan Hubicka from comment #5)
> > diff --git a/gcc/tree.c b/gcc/tree.c
> > index 39a92464414..a39e611292a 100644
> > --- a/gcc/tree.c
> > +++ b/gcc/tree.c
> > @@ -5201,6 +5201,15 @@ fld_process_array_type (tree t, tree t2, hash_map<tree,
> > tree> *map,
> >        array = build_array_type_1 (t2, TYPE_DOMAIN (t),
> >                                   TYPE_TYPELESS_STORAGE (t), false);
> >        TYPE_CANONICAL (array) = TYPE_CANONICAL (t);
> > +      /* Re-building the array via build_array_type_1 causes the C FE
> > +         special-handling of zero-length arrays to be dropped.  So
> > +        we copy back TYPE_SIZE[_UNIT] from the original type here
> > +        if layout_type decided the type is incomplete.  */
> > +      if (!TYPE_SIZE (array))
> > +       {
> > +         TYPE_SIZE (array) = TYPE_SIZE (t);
> > +         TYPE_SIZE_UNIT (array) = TYPE_SIZE_UNIT (t);
> 
> Makes sense to me, here.
> To get types merged, we want to build same array when structure was
> originally complete or incomplete. That means we should not copy real
> size of the element because it is unknown in the incomplete case.

Testing shows that this doesn't work fully.  Consider

 struct X { struct Y { ... }[1] *a; }

(seems to happen for __va_list_tag[] * as seen by verify_type ICEs)

The incomplete-type building builds an array type of incomplete member
types - that's of course not possible.  In C we'd decay to an array.
The verifier now ICEs because I force the array type to be complete
but then gimple_canonical_types_compatible_p returns false.  Previously
the check was guarded by COMPLETE_TYPE_P (t).

IMHO the cleanest fix for _that_ would be to not simplify the type.

I guess decaying A[] * to A ** might be possible as well but I'm not sure
what that ends up.. (will try that).

A workaround restoring previous behavior would be to guard my TYPE_SIZE
setting with COMPLETE_TYPE_P (t2) ...


More information about the Gcc-bugs mailing list