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.


Ciao,
Michael.
------------
Index: lto-cgraph.c
===================================================================
--- lto-cgraph.c        (revision 190803)
+++ lto-cgraph.c        (working copy)
@@ -1373,6 +1373,7 @@ output_node_opt_summary (struct output_b
          mechanism to store function local declarations into summaries.  */
       gcc_assert (parm);
       streamer_write_uhwi (ob, parm_num);
+      gcc_assert (IS_UNKNOWN_LOCATION (EXPR_LOCATION (map->new_tree)));
       stream_write_tree (ob, map->new_tree, true);
       bp = bitpack_create (ob->main_stream);
       bp_pack_value (&bp, map->replace_p, 1);
Index: ipa-prop.c
===================================================================
--- ipa-prop.c  (revision 190803)
+++ ipa-prop.c  (working copy)
@@ -1378,7 +1378,11 @@ ipa_compute_jump_functions_for_edge (str
       tree arg = gimple_call_arg (call, n);
 
       if (is_gimple_ip_invariant (arg))
-       ipa_set_jf_constant (jfunc, arg);
+       {
+         arg = unshare_expr (arg);
+         SET_EXPR_LOCATION (arg, UNKNOWN_LOCATION);
+         ipa_set_jf_constant (jfunc, arg);
+       }
       else if (!is_gimple_reg_type (TREE_TYPE (arg))
               && TREE_CODE (arg) == PARM_DECL)
        {
@@ -3154,6 +3158,7 @@ ipa_write_jump_function (struct output_b
       stream_write_tree (ob, jump_func->value.known_type.component_type, true);
       break;
     case IPA_JF_CONST:
+      gcc_assert (IS_UNKNOWN_LOCATION (EXPR_LOCATION 
(jump_func->value.constant)));
       stream_write_tree (ob, jump_func->value.constant, true);
       break;
     case IPA_JF_PASS_THROUGH:

Reply via email to