Hi, On Wed, Sep 12, 2012 at 04:17:45PM +0200, Michael Matz wrote: > Hi, > > On Wed, 12 Sep 2012, Michael Matz wrote: > > > > Hm, but we shouldn't end up streaming any BLOCKs at this point (nor > > > local TYPE_DECLs). Those are supposed to be in the local function > > > sections only where no fixup for prevailing decls happens. > > > > That's true, something is fishy with the patch, will try to investigate. > > ipa-prop creates the problem. Its tree mapping can contain expressions, > expressions can have locations, locations now have blocks. The tree maps > are stored as part of jump functions, and hence as part of node summaries. > Node summaries are global, hence blocks, and therefore block vars can be > placed in the global blob. > > That's not supposed to happen. The patch below fixes this instance of the > problem and makes the testcase work with Dehaos patch with the > LTO_NO_PREVAIL call added back in. >
The following patch implements the unsharing and location pruning at all required places in a way that passes bootstrap and testing on an x86_64-linux. Honza pre-approved it on IRC so unless there are any objections within a few hours I'm going to commit it. (The patch does not introduce any of the asserts Michael's patch had because, as far as I my grep told me, IS_UNKNOWN_LOCATION is not in trunk yet and I suppose the pre-approval does not cover introducing things like that.) Thanks, Martin 2012-09-18 Martin Jambor <mjam...@suse.cz> * ipa-prop.c (prune_expression_for_jf): New function. (ipa_set_jf_constant): Use it. (ipa_set_jf_arith_pass_through): Likewise. (determine_known_aggregate_parts): Likewise. Index: src/gcc/ipa-prop.c =================================================================== --- src.orig/gcc/ipa-prop.c +++ src/gcc/ipa-prop.c @@ -287,6 +287,19 @@ ipa_print_all_jump_functions (FILE *f) } } +/* Return the expression tree EXPR unshared and with location stripped off. */ + +static tree +prune_expression_for_jf (tree exp) +{ + if (EXPR_P (exp)) + { + exp = unshare_expr (exp); + SET_EXPR_LOCATION (exp, UNKNOWN_LOCATION); + } + return exp; +} + /* Set JFUNC to be a known type jump function. */ static void @@ -305,7 +318,7 @@ static void ipa_set_jf_constant (struct ipa_jump_func *jfunc, tree constant) { jfunc->type = IPA_JF_CONST; - jfunc->value.constant = constant; + jfunc->value.constant = prune_expression_for_jf (constant); } /* Set JFUNC to be a simple pass-through jump function. */ @@ -327,7 +340,7 @@ ipa_set_jf_arith_pass_through (struct ip tree operand, enum tree_code operation) { jfunc->type = IPA_JF_PASS_THROUGH; - jfunc->value.pass_through.operand = operand; + jfunc->value.pass_through.operand = prune_expression_for_jf (operand); jfunc->value.pass_through.formal_id = formal_id; jfunc->value.pass_through.operation = operation; jfunc->value.pass_through.agg_preserved = false; @@ -1344,7 +1357,7 @@ determine_known_aggregate_parts (gimple { struct ipa_agg_jf_item item; item.offset = list->offset - arg_offset; - item.value = list->constant; + item.value = prune_expression_for_jf (list->constant); VEC_quick_push (ipa_agg_jf_item_t, jfunc->agg.items, item); } list = list->next;