Fixup INTEGER_CST

Jan Hubicka hubicka@ucw.cz
Sun Oct 7 17:22:00 GMT 2012


> On Sun, Oct 7, 2012 at 5:15 PM, Jan Hubicka <hubicka@ucw.cz> wrote:
> > Hi,
> > I added a santy check that after fixup all types that lost in the merging are
> > really dead.  And it turns out we have some zombies around.
> >
> > INTEGER_CST needs special care because it is special cased by the streamer.  We also
> > do not want to do inplace modificaitons on it because that would corrupt the hashtable
> > used by tree.c's sharing code
> >
> > Bootstrapped/regtested x86_64-linux, OK?
> 
> No, I don't think we want to fixup INTEGER_CSTs this way.  Instead we
> want to fixup
> them where they end up used unfixed.

Erm, I think it is what the patch does?
It replaces pointers to integer_cst with type that did not survive by pointer
to new integer_cst. (with the optimization that INTEGER_CST with overflow
is changed in place because it is allowed to do so).

Honza
> 
> Richard.
> 
> >
> >         PR lto/54839
> >         * lto/lto.c (remember_with_vars): Also fixup INTEGER_CST.
> >         (fixup_integer_cst): New functoin.
> >         (lto_ft_type): Fixup BASETYPE of methods and offsets.
> > Index: lto/lto.c
> > ===================================================================
> > --- lto/lto.c   (revision 192164)
> > +++ lto/lto.c   (working copy)
> > @@ -1408,11 +1408,36 @@ remember_with_vars (tree t)
> >             (tt) = GIMPLE_REGISTER_TYPE (tt); \
> >           if (VAR_OR_FUNCTION_DECL_P (tt) && TREE_PUBLIC (tt)) \
> >             remember_with_vars (t); \
> > +         if (TREE_CODE (tt) == INTEGER_CST) \
> > +           (tt) = fixup_integer_cst (tt); \
> >         } \
> >      } while (0)
> >
> >  static void lto_fixup_types (tree);
> >
> > +/* Return integer_cst T with updated type.  */
> > +
> > +static tree
> > +fixup_integer_cst (tree t)
> > +{
> > +  tree type = GIMPLE_REGISTER_TYPE (TREE_TYPE (t));
> > +
> > +  if (type == TREE_TYPE (t))
> > +    return t;
> > +
> > +  /* If overflow was set, streamer_read_integer_cst
> > +     produced local copy of T. */
> > +  if (TREE_OVERFLOW (t))
> > +    {
> > +      TREE_TYPE (t) = type;
> > +      return t;
> > +    }
> > +  else
> > +  /* Otherwise produce new shared node for the new type.  */
> > +    return build_int_cst_wide (type, TREE_INT_CST_LOW (t),
> > +                              TREE_INT_CST_HIGH (t));
> > +}
> > +
> >  /* Fix up fields of a tree_typed T.  */
> >
> >  static void
> > @@ -1526,6 +1549,11 @@ lto_ft_type (tree t)
> >    LTO_FIXUP_TREE (t->type_non_common.binfo);
> >
> >    LTO_FIXUP_TREE (TYPE_CONTEXT (t));
> > +
> > +  if (TREE_CODE (t) == METHOD_TYPE)
> > +    TYPE_METHOD_BASETYPE (t);
> > +  if (TREE_CODE (t) == OFFSET_TYPE)
> > +    TYPE_OFFSET_BASETYPE (t);
> >  }
> >
> >  /* Fix up fields of a BINFO T.  */



More information about the Gcc-patches mailing list