On Sun, Oct 7, 2012 at 5:15 PM, Jan Hubicka <hubi...@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. 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. */