On Wed, 15 Feb 2012, Eric Botcazou wrote: > > This fixes PR52178, the failure to bootstrap Ada with LTO (well, > > until you hit the next problem). A self-referential DECL_QUALIFIER > > makes us think that a QUAL_UNION_TYPE type is of variable-size which > > makes us stream that type locally, wrecking type merging and later > > ICEing in the type verifier. While it looks that variably_modified_type_p > > should not inspect DECL_QUALIFIER a less intrusive patch for 4.7 > > notices that DECL_QUALIFIER is unused after gimplification and thus > > clears it and does not stream it instead. > > Thanks for fixing the hard part. Here is the easy one: the compiler aborts > during the CDDCE2 pass of LTRANS when it is trying to redirect an edge from a > dead control statement to the immediate post-dominator of the BB. > > It turns out that the control statement isn't dead at all, but its two edges > point to fallthrough (empty) basic blocks which have sticky abnormal edges > to another block. > > The blocks used to contain a call statement: > > <bb 1584>: > D.57021_4455 = sinfo__etype (this_formal_84(ab)); > > which was replaced by FRE with an assignment: > > <bb 1567>: > D.57021_4455 = D.57006_4425; > > which was eventually eliminated by DCE1. > > FRE has all the machinery to deal with this case and purge the dead abnormal > edges. But there is a hitch: the CFG may have changed between the time the > need for the cleanup is detected and the time it is performed, which fools > the logic. The issue has been latent for years and becomes visible only now > because we have both EH and AB edges in gnat1 (thanks to TREE_CLOBBER_P). > > Bootstrapped/regtested on x86_64-suse-linux, applied on the mainline as > obvious > (together with the no-op patchlet to gimple.c we discussed in the PR).
Thanks for hunting this down! Richard. > 2012-02-14 Eric Botcazou <ebotca...@adacore.com> > > PR lto/52178 > * gimple.c (iterative_hash_gimple_type): Use RECORD_OR_UNION_TYPE_P. > (iterative_hash_canonical_type): Likewise. > * tree-ssa-pre.c (fini_pre): Clean up the CFG only after purging all > the dead edges.