> 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.
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. */