This fixes LTO profiledbootstrap by pruning locations at
tree_function_versioning time - there seems to be at least one
uncatched case in IPA opts.

LTO profilebootstrapped and tested on x86_64-unknown-linux-gnu.

I also had the extended lto-cgraph.c verification in-tree but do not
plan to commit that.

Does this look reasonable or should somebody (not me ;)) try to track
down the place where we fail to unshare?

Thanks,
Richard.

2013-01-14  Richard Biener  <rguent...@suse.de>

        PR bootstrap/55792
        * tree-inline.c (tree_function_versioning): Purge locations
        from replaced parameters.

Index: gcc/lto-cgraph.c
===================================================================
*** gcc/lto-cgraph.c    (revision 195144)
--- gcc/lto-cgraph.c    (working copy)
*************** output_edge_opt_summary (struct output_b
*** 1492,1497 ****
--- 1492,1513 ----
  {
  }
  
+ static tree
+ verify_no_location_r (tree *tp, int *walk_subtrees, void *)
+ {
+   if (EXPR_P (*tp))
+     gcc_assert (EXPR_LOCATION (*tp) == UNKNOWN_LOCATION);
+   else
+     *walk_subtrees = 0;
+   return NULL_TREE;
+ }
+ 
+ static void
+ verify_no_location (tree expr)
+ {
+   walk_tree (&expr, verify_no_location_r, NULL, NULL);
+ }
+ 
  /* Output optimization summary for NODE to OB.  */
  
  static void
*************** output_node_opt_summary (struct output_b
*** 1536,1542 ****
           mechanism to store function local declarations into summaries.  */
        gcc_assert (parm);
        streamer_write_uhwi (ob, parm_num);
!       gcc_assert (EXPR_LOCATION (map->new_tree) == UNKNOWN_LOCATION);
        stream_write_tree (ob, map->new_tree, true);
        bp = bitpack_create (ob->main_stream);
        bp_pack_value (&bp, map->replace_p, 1);
--- 1552,1560 ----
           mechanism to store function local declarations into summaries.  */
        gcc_assert (parm);
        streamer_write_uhwi (ob, parm_num);
! #ifdef ENABLE_CHECKING
!       verify_no_location (map->new_tree);
! #endif
        stream_write_tree (ob, map->new_tree, true);
        bp = bitpack_create (ob->main_stream);
        bp_pack_value (&bp, map->replace_p, 1);
Index: gcc/tree-inline.c
===================================================================
*** gcc/tree-inline.c   (revision 195144)
--- gcc/tree-inline.c   (working copy)
*************** tree_function_versioning (tree old_decl,
*** 5190,5196 ****
        replace_info = (*tree_map)[i];
        if (replace_info->replace_p)
          {
!           tree op = replace_info->new_tree;
            if (!replace_info->old_tree)
              {
                int i = replace_info->parm_num;
--- 5190,5196 ----
        replace_info = (*tree_map)[i];
        if (replace_info->replace_p)
          {
!           tree op = unshare_expr_without_location (replace_info->new_tree);
            if (!replace_info->old_tree)
              {
                int i = replace_info->parm_num;
*************** tree_function_versioning (tree old_decl,
*** 5199,5216 ****
                  i --;
                replace_info->old_tree = parm;
              }
-               
- 
-           STRIP_NOPS (op);
- 
-           if (TREE_CODE (op) == VIEW_CONVERT_EXPR)
-             op = TREE_OPERAND (op, 0);
- 
            gcc_assert (TREE_CODE (replace_info->old_tree) == PARM_DECL);
            init = setup_one_parameter (&id, replace_info->old_tree,
!                                       replace_info->new_tree, id.src_fn,
!                                       NULL,
!                                       &vars);
            if (init)
              init_stmts.safe_push (init);
          }
--- 5199,5208 ----
                  i --;
                replace_info->old_tree = parm;
              }
            gcc_assert (TREE_CODE (replace_info->old_tree) == PARM_DECL);
+ 
            init = setup_one_parameter (&id, replace_info->old_tree,
!                                       op, id.src_fn, NULL, &vars);
            if (init)
              init_stmts.safe_push (init);
          }

Reply via email to