This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] Add block debug info to phi_arg_d


On Thu, Jul 5, 2012 at 11:08 AM, Dehao Chen <dehao@google.com> wrote:
> Hi,
>
> This patch added block field to phi_arg_d to make sure the associated
> source locus is consistent with its block info.
>
> Bootstrapped and passed gcc regression tests.
>
> OK for trunk?

Hum - makes me want a location like we have on RTL (which maps to
location plus block ...).  But oh well ...

struct GTY(()) phi_arg_d {
  /* imm_use MUST be the first element in struct because we do some
     pointer arithmetic with it.  See phi_arg_index_from_use.  */
  struct ssa_use_operand_d imm_use;
location_t locus;
+  tree block;
 };

please place block before locus though.

Ok with that change.

Thanks,
Richard.

> Thanks,
> Dehao
>
> http://codereview.appspot.com/6349075
>
> gcc/ChangeLog
>
> 2012-07-05  Dehao Chen  <dehao@google.com>
>
>         * tree.h (phi_arg_d): New field.
>         * tree-flow-inline.h (gimple_phi_arg_block): New function.
>         (gimple_phi_arg_block_from_edge): New function.
>         (gimple_phi_arg_set_block): New function.
>         (gimple_phi_arg_has_block): New function.
>         (redirect_edge_var_map_block): New function.
>         * tree-flow.h (_edge_var_map): New field.
>         * tree-ssa-live.c (remove_unused_locals): Mark phi_arg's block
>         as used.
>         * tree-eh.c (cleanup_empty_eh_merge_phis): Add block debug info for
>         redirect_edge_var_map_add.
>         * tree-outof-ssa.c (_elim_graph): New field.
>         (insert_partition_copy_on_edge): New parameter.
>         (insert_value_copy_on_edge): New parameter.
>         (insert_rtx_to_part_on_edge): New parameter.
>         (insert_part_to_rtx_on_edge): New parameter.
>         (elim_graph_add_edge): New parameter.
>         (elim_graph_remove_succ_edge): New parameter.
>         (FOR_EACH_ELIM_GRAPH_SUCC): New parameter.
>         (FOR_EACH_ELIM_GRAPH_PRED): New parameter.
>         (new_elim_graph): Add block debug info.
>         (clear_elim_graph): Likewise.
>         (delete_elim_graph): Likewise.
>         (elim_graph_add_node): Likewise.
>         (elim_graph_add_edge): Likewise.
>         (elim_graph_remove_succ_edge): Likewise.
>         (eliminate_build): Likewise.
>         (elim_forward): Likewise.
>         (elim_unvisited_predecessor): Likewise.
>         (elim_backward): Likewise.
>         (elim_create): Likewise.
>         (eliminate_phi): Likewise.
>         (insert_backedge_copies): Likewise.
>         * tree-into-ssa.c (insert_phi_nodes_for): Add block debug info for
>         add_phi_arg.
>         (rewrite_add_phi_arguments): Likewise.
>         * tree-ssa-loop-im.c (execute_sm_if_changed): Likewise.
>         * tree-ssa-tail-merge.c (replace_block_by): Likewise.
>         * tree-ssa-threadupdate.c (copy_phi_args): Likewise.
>         * tree-loop-distribution.c (update_phis_for_loop_copy): Likewise.
>         * tree-ssa-loop-manip.c (create_iv): Likewise.
>         (add_exit_phis_edge): Likewise.
>         (split_loop_exit_edge): Likewise.
>         (copy_phi_node_args): Likewise.
>         (tree_transform_and_unroll_loop): Likewise.
>         * value-prof.c (gimple_ic): Likewise.
>         (gimple_stringop_fixed_value): Likewise.
>         * tree-tailcall.c (add_successor_phi_arg): Likewise.
>         (eliminate_tail_call): Likewise.
>         (create_tailcall_accumulator): Likewise.
>         (tree_optimize_tail_calls_1): Likewise.
>         * tree-phinodes.c (add_phi_arg): Likewise.
>         (make_phi_node): Likewise.
>         (resize_phi_node): Likewise.
>         (remove_phi_arg_num): Likewise.
>         * omp-low.c (expand_parallel_call): Likewise.
>         (expand_omp_for_static_chunk): Likewise.
>         * tree-vect-loop-manip.c (slpeel_update_phis_for_duplicate_loop):
>         Likewise.
>         (slpeel_update_phi_nodes_for_guard1): Likewise.
>         (slpeel_update_phi_nodes_for_guard2): Likewise.
>         (slpeel_tree_duplicate_loop_to_edge_cfg): Likewise.
>         (set_prologue_iterations): Likewise.
>         (slpeel_tree_peel_loop_to_edge): Likewise.
>         (vect_loop_versioning): Likewise.
>         * tree-parloops.c (create_phi_for_local_result): Likewise.
>         (transform_to_exit_first_loop): Likewise.
>         (create_parallel_loop): Likewise.
>         * ipa-split.c (split_function): Likewise.
>         * tree-vect-loop.c (get_initial_def_for_induction): Likewise.
>         (vect_create_epilog_for_reduction): Likewise.
>         * tree-vect-data-refs.c (vect_setup_realignment): Likewise.
>         * graphite-scop-detection.c (canonicalize_loop_closed_ssa): Likewise.
>         * tree-ssa-phiopt.c (cond_store_replacement): Likewise.
>         (cond_if_else_store_replacement_1): Likewise.
>         * tree-cfgcleanup.c (remove_forwarder_block): Likewise.
>         (remove_forwarder_block_with_phi): Likewise.
>         * tree-ssa-pre.c (insert_into_preds_of_block): Likewise.
>         * tree-predcom.c (initialize_root_vars): Likewise.
>         (initialize_root_vars_lm): Likewise.
>         * sese.c (sese_add_exit_phis_edge): Likewise.
>         * tree-ssa-dce.c (forward_edge_to_pdom): Likewise.
>         * tree-ssa.c (flush_pending_stmts): Likewise.
>         (redirect_edge_var_map_add): Likewise.
>         (ssa_redirect_edge): Likewise.
>         * gimple-streamer-in.c (input_phi): Likewise.
>         * tree-vect-stmts.c (vectorizable_load): Likewise.
>         * tree-inline.c (copy_phis_for_bb): Likewise.
>         * tree-ssa-phiprop.c (phiprop_insert_phi): Likewise.
>         * tree-switch-conversion.c (fix_phi_nodes): Likewise.
>         * tree-cfg.c (reinstall_phi_args): Likewise.
>         (gimple_make_forwarder_block): Likewise.
>         (add_phi_args_after_copy_edge): Likewise.
>         (gimple_duplicate_sese_tail): Likewise.
>
> Index: gcc/tree-into-ssa.c
> ===================================================================
> --- gcc/tree-into-ssa.c (revision 189246)
> +++ gcc/tree-into-ssa.c (working copy)
> @@ -1119,7 +1119,7 @@
>              renamer will use the symbol on the LHS to get its
>              reaching definition.  */
>           FOR_EACH_EDGE (e, ei, bb->preds)
> -           add_phi_arg (phi, var, e, UNKNOWN_LOCATION);
> +           add_phi_arg (phi, var, e, UNKNOWN_LOCATION, NULL);
>         }
>        else
>         {
> @@ -1474,7 +1474,8 @@
>           phi = gsi_stmt (gsi);
>           currdef = get_reaching_def (SSA_NAME_VAR (gimple_phi_result (phi)));
>           stmt = SSA_NAME_DEF_STMT (currdef);
> -         add_phi_arg (phi, currdef, e, gimple_location (stmt));
> +         add_phi_arg (phi, currdef, e, gimple_location (stmt),
> +                      gimple_block (stmt));
>         }
>      }
>  }
> Index: gcc/tree-ssa-loop-im.c
> ===================================================================
> --- gcc/tree-ssa-loop-im.c      (revision 189246)
> +++ gcc/tree-ssa-loop-im.c      (working copy)
> @@ -2086,7 +2086,7 @@
>           if (gimple_phi_arg_edge (phi, i)->src == new_bb)
>             {
>               tree arg = gimple_phi_arg_def (phi, i);
> -             add_phi_arg (phi, arg, then_old_edge, UNKNOWN_LOCATION);
> +             add_phi_arg (phi, arg, then_old_edge, UNKNOWN_LOCATION, NULL);
>               update_stmt (phi);
>             }
>        }
> Index: gcc/tree-ssa-tail-merge.c
> ===================================================================
> --- gcc/tree-ssa-tail-merge.c   (revision 189246)
> +++ gcc/tree-ssa-tail-merge.c   (working copy)
> @@ -1458,7 +1458,7 @@
>        bb2_phi = vop_phi (bb2);
>
>        add_phi_arg (bb2_phi, SSA_NAME_VAR (gimple_phi_result (bb2_phi)),
> -                  pred_edge, UNKNOWN_LOCATION);
> +                  pred_edge, UNKNOWN_LOCATION, NULL);
>      }
>
>    bb2->frequency += bb1->frequency;
> Index: gcc/tree-ssa-threadupdate.c
> ===================================================================
> --- gcc/tree-ssa-threadupdate.c (revision 189246)
> +++ gcc/tree-ssa-threadupdate.c (working copy)
> @@ -316,7 +316,9 @@
>      {
>        gimple phi = gsi_stmt (gsi);
>        source_location locus = gimple_phi_arg_location (phi, src_indx);
> -      add_phi_arg (phi, gimple_phi_arg_def (phi, src_indx), tgt_e, locus);
> +      tree block = gimple_phi_arg_block (phi, src_indx);
> +      add_phi_arg (phi, gimple_phi_arg_def (phi, src_indx), tgt_e, locus,
> +                  block);
>      }
>  }
>
> Index: gcc/tree-loop-distribution.c
> ===================================================================
> --- gcc/tree-loop-distribution.c        (revision 189246)
> +++ gcc/tree-loop-distribution.c        (working copy)
> @@ -171,6 +171,7 @@
>      {
>        tree def;
>        source_location locus;
> +      tree block;
>        gimple phi_new = gsi_stmt (si_new);
>        gimple phi_orig = gsi_stmt (si_orig);
>
> @@ -178,12 +179,14 @@
>          associated with the entry of NEW_LOOP)  */
>        def = PHI_ARG_DEF_FROM_EDGE (phi_orig, orig_entry_e);
>        locus = gimple_phi_arg_location_from_edge (phi_orig, orig_entry_e);
> -      add_phi_arg (phi_new, def, new_loop_entry_e, locus);
> +      block = gimple_phi_arg_block_from_edge (phi_orig, orig_entry_e);
> +      add_phi_arg (phi_new, def, new_loop_entry_e, locus, block);
>
>        /* Add the second phi argument for the phi in NEW_LOOP (the one
>          associated with the latch of NEW_LOOP)  */
>        def = PHI_ARG_DEF_FROM_EDGE (phi_orig, orig_loop_latch);
>        locus = gimple_phi_arg_location_from_edge (phi_orig, orig_loop_latch);
> +      block = gimple_phi_arg_block_from_edge (phi_orig, orig_loop_latch);
>
>        if (TREE_CODE (def) == SSA_NAME)
>         {
> @@ -198,7 +201,8 @@
>         /* Could be an integer.  */
>         new_ssa_name = def;
>
> -      add_phi_arg (phi_new, new_ssa_name, loop_latch_edge (new_loop), locus);
> +      add_phi_arg (phi_new, new_ssa_name, loop_latch_edge (new_loop), locus,
> +                  block);
>      }
>  }
>
> Index: gcc/tree-ssa-loop-manip.c
> ===================================================================
> --- gcc/tree-ssa-loop-manip.c   (revision 189246)
> +++ gcc/tree-ssa-loop-manip.c   (working copy)
> @@ -121,8 +121,9 @@
>
>    stmt = create_phi_node (vb, loop->header);
>    SSA_NAME_DEF_STMT (vb) = stmt;
> -  add_phi_arg (stmt, initial, loop_preheader_edge (loop), UNKNOWN_LOCATION);
> -  add_phi_arg (stmt, va, loop_latch_edge (loop), UNKNOWN_LOCATION);
> +  add_phi_arg (stmt, initial, loop_preheader_edge (loop), UNKNOWN_LOCATION,
> +              NULL);
> +  add_phi_arg (stmt, va, loop_latch_edge (loop), UNKNOWN_LOCATION, NULL);
>  }
>
>  /* Add exit phis for the USE on EXIT.  */
> @@ -152,7 +153,7 @@
>    create_new_def_for (gimple_phi_result (phi), phi,
>                       gimple_phi_result_ptr (phi));
>    FOR_EACH_EDGE (e, ei, exit->preds)
> -    add_phi_arg (phi, use, e, UNKNOWN_LOCATION);
> +    add_phi_arg (phi, use, e, UNKNOWN_LOCATION, NULL);
>  }
>
>  /* Add exit phis for VAR that is used in LIVEIN.
> @@ -485,12 +486,14 @@
>    use_operand_p op_p;
>    gimple_stmt_iterator psi;
>    source_location locus;
> +  tree block;
>
>    for (psi = gsi_start_phis (dest); !gsi_end_p (psi); gsi_next (&psi))
>      {
>        phi = gsi_stmt (psi);
>        op_p = PHI_ARG_DEF_PTR_FROM_EDGE (phi, single_succ_edge (bb));
>        locus = gimple_phi_arg_location_from_edge (phi, single_succ_edge (bb));
> +      block = gimple_phi_arg_block_from_edge (phi, single_succ_edge (bb));
>
>        name = USE_FROM_PTR (op_p);
>
> @@ -504,7 +507,7 @@
>        new_name = duplicate_ssa_name (name, NULL);
>        new_phi = create_phi_node (new_name, bb);
>        SSA_NAME_DEF_STMT (new_name) = new_phi;
> -      add_phi_arg (new_phi, name, exit, locus);
> +      add_phi_arg (new_phi, name, exit, locus, block);
>        SET_USE (op_p, new_name);
>      }
>
> @@ -1024,8 +1027,8 @@
>        phi_rest = create_phi_node (new_init, rest);
>        SSA_NAME_DEF_STMT (new_init) = phi_rest;
>
> -      add_phi_arg (phi_rest, init, precond_edge, UNKNOWN_LOCATION);
> -      add_phi_arg (phi_rest, next, new_exit, UNKNOWN_LOCATION);
> +      add_phi_arg (phi_rest, init, precond_edge, UNKNOWN_LOCATION, NULL);
> +      add_phi_arg (phi_rest, next, new_exit, UNKNOWN_LOCATION, NULL);
>        SET_USE (op, new_init);
>      }
>
> Index: gcc/value-prof.c
> ===================================================================
> --- gcc/value-prof.c    (revision 189246)
> +++ gcc/value-prof.c    (working copy)
> @@ -1245,10 +1245,12 @@
>        SSA_NAME_DEF_STMT (result) = phi;
>        gimple_call_set_lhs (icall_stmt,
>                            make_ssa_name (SSA_NAME_VAR (result), icall_stmt));
> -      add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
> +      add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION,
> +                  NULL);
>        gimple_call_set_lhs (dcall_stmt,
>                            make_ssa_name (SSA_NAME_VAR (result), dcall_stmt));
> -      add_phi_arg (phi, gimple_call_lhs (dcall_stmt), e_dj, UNKNOWN_LOCATION);
> +      add_phi_arg (phi, gimple_call_lhs (dcall_stmt), e_dj, UNKNOWN_LOCATION,
> +                  NULL);
>      }
>
>    /* Build an EH edge for the direct call if necessary.  */
> @@ -1476,10 +1478,12 @@
>        SSA_NAME_DEF_STMT (result) = phi;
>        gimple_call_set_lhs (vcall_stmt,
>                            make_ssa_name (SSA_NAME_VAR (result), vcall_stmt));
> -      add_phi_arg (phi, gimple_call_lhs (vcall_stmt), e_vj, UNKNOWN_LOCATION);
> +      add_phi_arg (phi, gimple_call_lhs (vcall_stmt), e_vj, UNKNOWN_LOCATION,
> +                  NULL);
>        gimple_call_set_lhs (icall_stmt,
>                            make_ssa_name (SSA_NAME_VAR (result), icall_stmt));
> -      add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
> +      add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION,
> +                  NULL);
>      }
>
>    /* Because these are all string op builtins, they're all nothrow.  */
> Index: gcc/tree-tailcall.c
> ===================================================================
> --- gcc/tree-tailcall.c (revision 189246)
> +++ gcc/tree-tailcall.c (working copy)
> @@ -597,7 +597,7 @@
>        break;
>
>    gcc_assert (!gsi_end_p (gsi));
> -  add_phi_arg (gsi_stmt (gsi), phi_arg, e, UNKNOWN_LOCATION);
> +  add_phi_arg (gsi_stmt (gsi), phi_arg, e, UNKNOWN_LOCATION, NULL);
>  }
>
>  /* Creates a GIMPLE statement which computes the operation specified by
> @@ -853,7 +853,7 @@
>        phi = gsi_stmt (gsi);
>        gcc_assert (param == SSA_NAME_VAR (PHI_RESULT (phi)));
>
> -      add_phi_arg (phi, arg, e, gimple_location (stmt));
> +      add_phi_arg (phi, arg, e, gimple_location (stmt), gimple_block (stmt));
>        gsi_next (&gsi);
>      }
>
> @@ -948,7 +948,7 @@
>    phi = create_phi_node (tmp, bb);
>    /* RET_TYPE can be a float when -ffast-maths is enabled.  */
>    add_phi_arg (phi, fold_convert (ret_type, init), single_pred_edge (bb),
> -              UNKNOWN_LOCATION);
> +              UNKNOWN_LOCATION, NULL);
>    return PHI_RESULT (phi);
>  }
>
> @@ -1012,7 +1012,7 @@
>                 phi = create_phi_node (name, first);
>                 SSA_NAME_DEF_STMT (name) = phi;
>                 add_phi_arg (phi, new_name, single_pred_edge (first),
> -                            EXPR_LOCATION (param));
> +                            EXPR_LOCATION (param), NULL);
>               }
>           phis_constructed = true;
>         }
> Index: gcc/tree.h
> ===================================================================
> --- gcc/tree.h  (revision 189246)
> +++ gcc/tree.h  (working copy)
> @@ -2036,6 +2036,7 @@
>    struct ssa_use_operand_d imm_use;
>    tree def;
>    location_t locus;
> +  tree block;
>  };
>
>
> Index: gcc/tree-phinodes.c
> ===================================================================
> --- gcc/tree-phinodes.c (revision 189246)
> +++ gcc/tree-phinodes.c (working copy)
> @@ -205,6 +205,7 @@
>        use_operand_p  imm;
>
>        gimple_phi_arg_set_location (phi, i, UNKNOWN_LOCATION);
> +      gimple_phi_arg_set_block (phi, i ,NULL);
>        imm = gimple_phi_arg_imm_use_ptr (phi, i);
>        imm->use = gimple_phi_arg_def_ptr (phi, i);
>        imm->prev = NULL;
> @@ -275,6 +276,7 @@
>        use_operand_p imm;
>
>        gimple_phi_arg_set_location (new_phi, i, UNKNOWN_LOCATION);
> +      gimple_phi_arg_set_block (new_phi, i, NULL);
>        imm = gimple_phi_arg_imm_use_ptr (new_phi, i);
>        imm->use = gimple_phi_arg_def_ptr (new_phi, i);
>        imm->prev = NULL;
> @@ -362,7 +364,7 @@
>     PHI points to the reallocated phi node when we return.  */
>
>  void
> -add_phi_arg (gimple phi, tree def, edge e, source_location locus)
> +add_phi_arg (gimple phi, tree def, edge e, source_location locus, tree block)
>  {
>    basic_block bb = e->dest;
>
> @@ -386,6 +388,7 @@
>
>    SET_PHI_ARG_DEF (phi, e->dest_idx, def);
>    gimple_phi_arg_set_location (phi, e->dest_idx, locus);
> +  gimple_phi_arg_set_block (phi, e->dest_idx, block);
>  }
>
>
> @@ -417,6 +420,8 @@
>        /* Move the location as well.  */
>        gimple_phi_arg_set_location (phi, i,
>                                    gimple_phi_arg_location (phi, num_elem - 1));
> +      gimple_phi_arg_set_block (phi, i,
> +                               gimple_phi_arg_block (phi, num_elem - 1));
>      }
>
>    /* Shrink the vector and return.  Note that we do not have to clear
> Index: gcc/omp-low.c
> ===================================================================
> --- gcc/omp-low.c       (revision 189246)
> +++ gcc/omp-low.c       (working copy)
> @@ -3061,8 +3061,8 @@
>             {
>               gimple phi = create_phi_node (tmp_join, bb);
>               SSA_NAME_DEF_STMT (tmp_join) = phi;
> -             add_phi_arg (phi, tmp_then, e_then, UNKNOWN_LOCATION);
> -             add_phi_arg (phi, tmp_else, e_else, UNKNOWN_LOCATION);
> +             add_phi_arg (phi, tmp_then, e_then, UNKNOWN_LOCATION, NULL);
> +             add_phi_arg (phi, tmp_else, e_else, UNKNOWN_LOCATION, NULL);
>             }
>
>           val = tmp_join;
> @@ -4597,6 +4597,7 @@
>         {
>           gimple nphi;
>           source_location locus;
> +         tree block;
>
>           phi = gsi_stmt (psi);
>           t = gimple_phi_result (phi);
> @@ -4606,14 +4607,16 @@
>
>           t = PHI_ARG_DEF_FROM_EDGE (phi, se);
>           locus = gimple_phi_arg_location_from_edge (phi, se);
> +         block = gimple_phi_arg_block_from_edge (phi, se);
>
>           /* A special case -- fd->loop.v is not yet computed in
>              iter_part_bb, we need to use v_extra instead.  */
>           if (t == fd->loop.v)
>             t = v_extra;
> -         add_phi_arg (nphi, t, ene, locus);
> +         add_phi_arg (nphi, t, ene, locus, block);
>           locus = redirect_edge_var_map_location (vm);
> -         add_phi_arg (nphi, redirect_edge_var_map_def (vm), re, locus);
> +         block = redirect_edge_var_map_block (vm);
> +         add_phi_arg (nphi, redirect_edge_var_map_def (vm), re, locus, block);
>         }
>        gcc_assert (!gsi_end_p (psi) && i == VEC_length (edge_var_map, head));
>        redirect_edge_var_map_clear (re);
> @@ -4629,9 +4632,9 @@
>        phi = create_phi_node (trip_main, iter_part_bb);
>        SSA_NAME_DEF_STMT (trip_main) = phi;
>        add_phi_arg (phi, trip_back, single_succ_edge (trip_update_bb),
> -                  UNKNOWN_LOCATION);
> +                  UNKNOWN_LOCATION, NULL);
>        add_phi_arg (phi, trip_init, single_succ_edge (entry_bb),
> -                  UNKNOWN_LOCATION);
> +                  UNKNOWN_LOCATION, NULL);
>      }
>
>    set_immediate_dominator (CDI_DOMINATORS, trip_update_bb, cont_bb);
> Index: gcc/tree-vect-loop-manip.c
> ===================================================================
> --- gcc/tree-vect-loop-manip.c  (revision 189246)
> +++ gcc/tree-vect-loop-manip.c  (working copy)
> @@ -294,13 +294,15 @@
>         gsi_next (&gsi_new), gsi_next (&gsi_orig))
>      {
>        source_location locus;
> +      tree block;
>        phi_new = gsi_stmt (gsi_new);
>        phi_orig = gsi_stmt (gsi_orig);
>
>        /* step 1.  */
>        def = PHI_ARG_DEF_FROM_EDGE (phi_orig, entry_arg_e);
>        locus = gimple_phi_arg_location_from_edge (phi_orig, entry_arg_e);
> -      add_phi_arg (phi_new, def, new_loop_entry_e, locus);
> +      block = gimple_phi_arg_block_from_edge (phi_orig, entry_arg_e);
> +      add_phi_arg (phi_new, def, new_loop_entry_e, locus, block);
>
>        /* step 2.  */
>        def = PHI_ARG_DEF_FROM_EDGE (phi_orig, orig_loop_latch);
> @@ -317,7 +319,8 @@
>         }
>
>        /* An ordinary ssa name defined in the loop.  */
> -      add_phi_arg (phi_new, new_ssa_name, loop_latch_edge (new_loop), locus);
> +      add_phi_arg (phi_new, new_ssa_name, loop_latch_edge (new_loop), locus,
> +                  block);
>
>        /* Drop any debug references outside the loop, if they would
>          become ill-formed SSA.  */
> @@ -512,6 +515,7 @@
>         gsi_next (&gsi_orig), gsi_next (&gsi_update))
>      {
>        source_location loop_locus, guard_locus;
> +      tree loop_block, guard_block;
>        orig_phi = gsi_stmt (gsi_orig);
>        update_phi = gsi_stmt (gsi_update);
>
> @@ -527,13 +531,19 @@
>        loop_locus = gimple_phi_arg_location_from_edge (orig_phi,
>                                                       EDGE_SUCC (loop->latch,
>                                                                  0));
> +      loop_block = gimple_phi_arg_block_from_edge (orig_phi,
> +                                                  EDGE_SUCC (loop->latch,
> +                                                             0));
> +
>        guard_arg = PHI_ARG_DEF_FROM_EDGE (orig_phi, loop_preheader_edge (loop));
>        guard_locus
>         = gimple_phi_arg_location_from_edge (orig_phi,
>                                              loop_preheader_edge (loop));
> +      guard_block = gimple_phi_arg_block_from_edge (orig_phi,
> +                                                   loop_preheader_edge (loop));
>
> -      add_phi_arg (new_phi, loop_arg, new_exit_e, loop_locus);
> -      add_phi_arg (new_phi, guard_arg, guard_edge, guard_locus);
> +      add_phi_arg (new_phi, loop_arg, new_exit_e, loop_locus, loop_block);
> +      add_phi_arg (new_phi, guard_arg, guard_edge, guard_locus, guard_block);
>
>        /* 1.3. Update phi in successor block.  */
>        gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi, e) == loop_arg
> @@ -552,7 +562,7 @@
>                                   *new_exit_bb);
>
>        /* 2.2. NEW_EXIT_BB has one incoming edge: the exit-edge of the loop.  */
> -      add_phi_arg (new_phi, loop_arg, single_exit (loop), loop_locus);
> +      add_phi_arg (new_phi, loop_arg, single_exit (loop), loop_locus,
> loop_block);
>
>        /* 2.3. Update phi in successor of NEW_EXIT_BB:  */
>        gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi2, new_exit_e) == loop_arg);
> @@ -680,8 +690,8 @@
>        if (new_name2)
>          guard_arg = new_name2;
>
> -      add_phi_arg (new_phi, loop_arg, new_exit_e, UNKNOWN_LOCATION);
> -      add_phi_arg (new_phi, guard_arg, guard_edge, UNKNOWN_LOCATION);
> +      add_phi_arg (new_phi, loop_arg, new_exit_e, UNKNOWN_LOCATION, NULL);
> +      add_phi_arg (new_phi, guard_arg, guard_edge, UNKNOWN_LOCATION, NULL);
>
>        /* 1.3. Update phi in successor block.  */
>        gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi, e) == orig_def);
> @@ -696,7 +706,8 @@
>                                   *new_exit_bb);
>
>        /* 2.2. NEW_EXIT_BB has one incoming edge: the exit-edge of the loop.  */
> -      add_phi_arg (new_phi, loop_arg, single_exit (loop), UNKNOWN_LOCATION);
> +      add_phi_arg (new_phi, loop_arg, single_exit (loop), UNKNOWN_LOCATION,
> +                  NULL);
>
>        /* 2.3. Update phi in successor of NEW_EXIT_BB:  */
>        gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi2, new_exit_e) == loop_arg);
> @@ -733,7 +744,7 @@
>        /* 3.3. GUARD_BB has one incoming edge:  */
>        gcc_assert (EDGE_COUNT (guard_edge->src->preds) == 1);
>        add_phi_arg (new_phi, arg, EDGE_PRED (guard_edge->src, 0),
> -                  UNKNOWN_LOCATION);
> +                  UNKNOWN_LOCATION, NULL);
>
>        /* 3.4. Update phi in successor of GUARD_BB:  */
>        gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi2, guard_edge)
> @@ -859,14 +870,16 @@
>         {
>           edge new_loop_exit_edge;
>           source_location locus;
> +         tree block;
>
>           locus = gimple_phi_arg_location_from_edge (phi, single_exit (loop));
> +         block = gimple_phi_arg_block_from_edge (phi, single_exit (loop));
>           if (EDGE_SUCC (new_loop->header, 0)->dest == new_loop->latch)
>             new_loop_exit_edge = EDGE_SUCC (new_loop->header, 1);
>           else
>             new_loop_exit_edge = EDGE_SUCC (new_loop->header, 0);
>
> -         add_phi_arg (phi, phi_arg, new_loop_exit_edge, locus);
> +         add_phi_arg (phi, phi_arg, new_loop_exit_edge, locus, block);
>         }
>      }
>
> @@ -905,7 +918,8 @@
>           phi_arg = PHI_ARG_DEF_FROM_EDGE (phi, entry_e);
>           if (phi_arg)
>             add_phi_arg (phi, phi_arg, new_exit_e,
> -                        gimple_phi_arg_location_from_edge (phi, entry_e));
> +                        gimple_phi_arg_location_from_edge (phi, entry_e),
> +                        gimple_phi_arg_block_from_edge (phi, entry_e));
>         }
>
>        redirect_edge_and_branch_force (entry_e, new_loop->header);
> @@ -1089,8 +1103,8 @@
>
>    newphi = create_phi_node (var, bb_before_first_loop);
>    add_phi_arg (newphi, prologue_after_cost_adjust_name, e_fallthru,
> -              UNKNOWN_LOCATION);
> -  add_phi_arg (newphi, *first_niters, e_false, UNKNOWN_LOCATION);
> +              UNKNOWN_LOCATION, NULL);
> +  add_phi_arg (newphi, *first_niters, e_false, UNKNOWN_LOCATION, NULL);
>
>    *first_niters = PHI_RESULT (newphi);
>  }
> @@ -1193,7 +1207,7 @@
>                                           new_phi);
>             use_operand_p use_p;
>
> -           add_phi_arg (new_phi, vop, exit_e, UNKNOWN_LOCATION);
> +           add_phi_arg (new_phi, vop, exit_e, UNKNOWN_LOCATION, NULL);
>             gimple_phi_set_result (new_phi, new_vop);
>             FOR_EACH_IMM_USE_STMT (stmt, imm_iter, vop)
>               if (stmt != new_phi && gimple_bb (stmt) != loop->header)
> @@ -2551,7 +2565,8 @@
>                                   new_exit_bb);
>        arg = PHI_ARG_DEF_FROM_EDGE (orig_phi, e);
>        add_phi_arg (new_phi, arg, new_exit_e,
> -                  gimple_phi_arg_location_from_edge (orig_phi, e));
> +                  gimple_phi_arg_location_from_edge (orig_phi, e),
> +                  gimple_phi_arg_block_from_edge (orig_phi, e));
>        adjust_phi_and_debug_stmts (orig_phi, e, PHI_RESULT (new_phi));
>      }
>
> Index: gcc/tree-parloops.c
> ===================================================================
> --- gcc/tree-parloops.c (revision 189246)
> +++ gcc/tree-parloops.c (working copy)
> @@ -998,6 +998,7 @@
>    basic_block store_bb;
>    tree local_res;
>    source_location locus;
> +  tree block;
>
>    /* STORE_BB is the block where the phi
>       should be stored.  It is the destination of the loop exit.
> @@ -1017,11 +1018,12 @@
>      = make_ssa_name (SSA_NAME_VAR (gimple_assign_lhs (reduc->reduc_stmt)),
>                      NULL);
>    locus = gimple_location (reduc->reduc_stmt);
> +  block = gimple_block (reduc->reduc_stmt);
>    new_phi = create_phi_node (local_res, store_bb);
>    SSA_NAME_DEF_STMT (local_res) = new_phi;
> -  add_phi_arg (new_phi, reduc->init, e, locus);
> +  add_phi_arg (new_phi, reduc->init, e, locus, block);
>    add_phi_arg (new_phi, gimple_assign_lhs (reduc->reduc_stmt),
> -              FALLTHRU_EDGE (loop->latch), locus);
> +              FALLTHRU_EDGE (loop->latch), locus, block);
>    reduc->new_phi = new_phi;
>
>    return 1;
> @@ -1500,7 +1502,7 @@
>        SET_PHI_RESULT (phi, t);
>        nphi = create_phi_node (res, orig_header);
>        SSA_NAME_DEF_STMT (res) = nphi;
> -      add_phi_arg (nphi, t, hpred, UNKNOWN_LOCATION);
> +      add_phi_arg (nphi, t, hpred, UNKNOWN_LOCATION, NULL);
>
>        if (res == control)
>         {
> @@ -1656,6 +1658,7 @@
>    for (gsi = gsi_start_phis (ex_bb); !gsi_end_p (gsi); gsi_next (&gsi))
>      {
>        source_location locus;
> +      tree block;
>        tree def;
>        phi = gsi_stmt (gsi);
>        stmt = SSA_NAME_DEF_STMT (PHI_ARG_DEF_FROM_EDGE (phi, exit));
> @@ -1663,11 +1666,14 @@
>        def = PHI_ARG_DEF_FROM_EDGE (stmt, loop_preheader_edge (loop));
>        locus = gimple_phi_arg_location_from_edge (stmt,
>                                                  loop_preheader_edge (loop));
> -      add_phi_arg (phi, def, guard, locus);
> +      block = gimple_phi_arg_block_from_edge (stmt,
> +                                             loop_preheader_edge (loop));
> +      add_phi_arg (phi, def, guard, locus, block);
>
>        def = PHI_ARG_DEF_FROM_EDGE (stmt, loop_latch_edge (loop));
>        locus = gimple_phi_arg_location_from_edge (stmt, loop_latch_edge (loop));
> -      add_phi_arg (phi, def, end, locus);
> +      block = gimple_phi_arg_block_from_edge (stmt, loop_latch_edge (loop));
> +      add_phi_arg (phi, def, end, locus, block);
>      }
>    e = redirect_edge_and_branch (exit, nexit->dest);
>    PENDING_STMT (e) = NULL;
> Index: gcc/tree-eh.c
> ===================================================================
> --- gcc/tree-eh.c       (revision 189246)
> +++ gcc/tree-eh.c       (working copy)
> @@ -3853,13 +3853,15 @@
>           FOR_EACH_EDGE (e, ei, old_bb->preds)
>             {
>               location_t oloc;
> +             tree oblock;
>               tree oop;
>
>               if ((e->flags & EDGE_EH) == 0)
>                 continue;
>               oop = gimple_phi_arg_def (ophi, e->dest_idx);
>               oloc = gimple_phi_arg_location (ophi, e->dest_idx);
> -             redirect_edge_var_map_add (e, nresult, oop, oloc);
> +             oblock = gimple_phi_arg_block (ophi, e->dest_idx);
> +             redirect_edge_var_map_add (e, nresult, oop, oloc, oblock);
>             }
>         }
>        /* If we didn't find the PHI, but it's a VOP, remember to rename
> @@ -3874,8 +3876,9 @@
>         {
>           location_t nloc
>             = gimple_phi_arg_location (nphi, old_bb_out->dest_idx);
> +         tree nblock = gimple_phi_arg_block (nphi, old_bb_out->dest_idx);
>           FOR_EACH_EDGE (e, ei, old_bb->preds)
> -           redirect_edge_var_map_add (e, nresult, nop, nloc);
> +           redirect_edge_var_map_add (e, nresult, nop, nloc, nblock);
>         }
>      }
>
> Index: gcc/ipa-split.c
> ===================================================================
> --- gcc/ipa-split.c     (revision 189246)
> +++ gcc/ipa-split.c     (working copy)
> @@ -1286,7 +1286,8 @@
>                   /* When there is PHI, just update its value.  */
>                   if (TREE_CODE (retval) == SSA_NAME
>                       && !gsi_end_p (psi))
> -                   add_phi_arg (gsi_stmt (psi), retval, e, UNKNOWN_LOCATION);
> +                   add_phi_arg (gsi_stmt (psi), retval, e, UNKNOWN_LOCATION,
> +                                NULL);
>                   /* Otherwise update the return BB itself.
>                      find_return_bb allows at most one assignment to return value,
>                      so update first statement.  */
> Index: gcc/tree-vect-loop.c
> ===================================================================
> --- gcc/tree-vect-loop.c        (revision 189246)
> +++ gcc/tree-vect-loop.c        (working copy)
> @@ -3131,9 +3131,9 @@
>                                                     NULL));
>
>    /* Set the arguments of the phi node:  */
> -  add_phi_arg (induction_phi, vec_init, pe, UNKNOWN_LOCATION);
> +  add_phi_arg (induction_phi, vec_init, pe, UNKNOWN_LOCATION, NULL);
>    add_phi_arg (induction_phi, vec_def, loop_latch_edge (iv_loop),
> -              UNKNOWN_LOCATION);
> +              UNKNOWN_LOCATION, NULL);
>
>
>    /* In case that vectorization factor (VF) is bigger than the number
> @@ -3617,13 +3617,13 @@
>          {
>            /* Set the loop-entry arg of the reduction-phi.  */
>            add_phi_arg (phi, vec_init_def, loop_preheader_edge (loop),
> -                       UNKNOWN_LOCATION);
> +                       UNKNOWN_LOCATION, NULL);
>
>            /* Set the loop-latch arg for the reduction-phi.  */
>            if (j > 0)
>              def = vect_get_vec_def_for_stmt_copy (vect_unknown_def_type, def);
>
> -          add_phi_arg (phi, def, loop_latch_edge (loop), UNKNOWN_LOCATION);
> +          add_phi_arg (phi, def, loop_latch_edge (loop),
> UNKNOWN_LOCATION, NULL);
>
>            if (vect_print_dump_info (REPORT_DETAILS))
>              {
> @@ -4241,9 +4241,10 @@
>                    /* Update phi node arguments with vs0 and vs2.  */
>                    add_phi_arg (vect_phi, vect_phi_init,
>                                 loop_preheader_edge (outer_loop),
> -                               UNKNOWN_LOCATION);
> +                               UNKNOWN_LOCATION, NULL);
>                    add_phi_arg (vect_phi, PHI_RESULT (inner_phi),
> -                               loop_latch_edge (outer_loop), UNKNOWN_LOCATION);
> +                               loop_latch_edge (outer_loop), UNKNOWN_LOCATION,
> +                              NULL);
>                    if (vect_print_dump_info (REPORT_DETAILS))
>                      {
>                        fprintf (vect_dump, "created double reduction phi "
> Index: gcc/tree-flow-inline.h
> ===================================================================
> --- gcc/tree-flow-inline.h      (revision 189246)
> +++ gcc/tree-flow-inline.h      (working copy)
> @@ -483,6 +483,22 @@
>    return gimple_phi_arg (gs, e->dest_idx)->locus;
>  }
>
> +/* Return the block location of gimple argument I of phi node GS.  */
> +
> +static inline tree
> +gimple_phi_arg_block (gimple gs, size_t i)
> +{
> +  return gimple_phi_arg (gs, i)->block;
> +}
> +
> +/* Return the block location of the argument on edge E of phi node GS.  */
> +
> +static inline tree
> +gimple_phi_arg_block_from_edge (gimple gs, edge e)
> +{
> +  return gimple_phi_arg (gs, e->dest_idx)->block;
> +}
> +
>  /* Set the source location of gimple argument I of phi node GS to LOC.  */
>
>  static inline void
> @@ -491,6 +507,14 @@
>    gimple_phi_arg (gs, i)->locus = loc;
>  }
>
> +/* Set the block location of gimple argument I of phi node GS to BLOCK.  */
> +
> +static inline void
> +gimple_phi_arg_set_block (gimple gs, size_t i, tree block)
> +{
> +  gimple_phi_arg (gs, i)->block = block;
> +}
> +
>  /* Return TRUE if argument I of phi node GS has a location record.  */
>
>  static inline bool
> @@ -499,6 +523,13 @@
>    return gimple_phi_arg_location (gs, i) != UNKNOWN_LOCATION;
>  }
>
> +/* Return TRUE if argument I of phi node GS has a location record.  */
> +
> +static inline bool
> +gimple_phi_arg_has_block (gimple gs, size_t i)
> +{
> +  return gimple_phi_arg_block (gs, i) != NULL;
> +}
>
>  /* Return the PHI nodes for basic block BB, or NULL if there are no
>     PHI nodes.  */
> @@ -1217,6 +1248,13 @@
>    return v->locus;
>  }
>
> +/* Given an edge_var_map V, return the PHI arg location.  */
> +
> +static inline tree
> +redirect_edge_var_map_block (edge_var_map *v)
> +{
> +  return v->block;
> +}
>
>  /* Return an SSA_NAME node for variable VAR defined in statement STMT
>     in function cfun.  */
> Index: gcc/tree-vect-data-refs.c
> ===================================================================
> --- gcc/tree-vect-data-refs.c   (revision 189246)
> +++ gcc/tree-vect-data-refs.c   (working copy)
> @@ -4407,7 +4407,7 @@
>    msq = make_ssa_name (vec_dest, NULL);
>    phi_stmt = create_phi_node (msq, containing_loop->header);
>    SSA_NAME_DEF_STMT (msq) = phi_stmt;
> -  add_phi_arg (phi_stmt, msq_init, pe, UNKNOWN_LOCATION);
> +  add_phi_arg (phi_stmt, msq_init, pe, UNKNOWN_LOCATION, NULL);
>
>    return msq;
>  }
> Index: gcc/graphite-scop-detection.c
> ===================================================================
> --- gcc/graphite-scop-detection.c       (revision 189246)
> +++ gcc/graphite-scop-detection.c       (working copy)
> @@ -1331,7 +1331,7 @@
>                                           gimple_phi_result_ptr (close_phi));
>                 add_phi_arg (close_phi, arg,
>                              gimple_phi_arg_edge (close_phi, 0),
> -                            UNKNOWN_LOCATION);
> +                            UNKNOWN_LOCATION, NULL);
>                 use_p = gimple_phi_arg_imm_use_ptr (phi, i);
>                 replace_exp (use_p, res);
>                 update_stmt (phi);
> Index: gcc/tree-ssa-phiopt.c
> ===================================================================
> --- gcc/tree-ssa-phiopt.c       (revision 189246)
> +++ gcc/tree-ssa-phiopt.c       (working copy)
> @@ -1454,6 +1454,7 @@
>    gimple newphi, new_stmt;
>    gimple_stmt_iterator gsi;
>    source_location locus;
> +  tree block;
>
>    /* Check if middle_bb contains of only one store.  */
>    if (!assign
> @@ -1461,6 +1462,7 @@
>      return false;
>
>    locus = gimple_location (assign);
> +  block = gimple_block (assign);
>    lhs = gimple_assign_lhs (assign);
>    rhs = gimple_assign_rhs1 (assign);
>    if (TREE_CODE (lhs) != MEM_REF
> @@ -1494,14 +1496,15 @@
>    name = make_ssa_name (condstoretemp, new_stmt);
>    gimple_assign_set_lhs (new_stmt, name);
>    gimple_set_location (new_stmt, locus);
> +  gimple_set_block (new_stmt, block);
>    gsi_insert_on_edge (e1, new_stmt);
>
>    /* 4) Create a PHI node at the join block, with one argument
>          holding the old RHS, and the other holding the temporary
>          where we stored the old memory contents.  */
>    newphi = create_phi_node (condstoretemp, join_bb);
> -  add_phi_arg (newphi, rhs, e0, locus);
> -  add_phi_arg (newphi, name, e1, locus);
> +  add_phi_arg (newphi, rhs, e0, locus, block);
> +  add_phi_arg (newphi, name, e1, locus, block);
>
>    lhs = unshare_expr (lhs);
>    new_stmt = gimple_build_assign (lhs, PHI_RESULT (newphi));
> @@ -1528,6 +1531,7 @@
>  {
>    tree lhs_base, lhs, then_rhs, else_rhs;
>    source_location then_locus, else_locus;
> +  tree then_block, else_block;
>    gimple_stmt_iterator gsi;
>    gimple newphi, new_stmt;
>
> @@ -1553,6 +1557,8 @@
>    else_rhs = gimple_assign_rhs1 (else_assign);
>    then_locus = gimple_location (then_assign);
>    else_locus = gimple_location (else_assign);
> +  then_block = gimple_block (then_assign);
> +  else_block = gimple_block (else_assign);
>
>    /* Now we've checked the constraints, so do the transformation:
>       1) Remove the stores.  */
> @@ -1576,8 +1582,10 @@
>         holding the old RHS, and the other holding the temporary
>         where we stored the old memory contents.  */
>    newphi = create_phi_node (condstoretemp, join_bb);
> -  add_phi_arg (newphi, then_rhs, EDGE_SUCC (then_bb, 0), then_locus);
> -  add_phi_arg (newphi, else_rhs, EDGE_SUCC (else_bb, 0), else_locus);
> +  add_phi_arg (newphi, then_rhs, EDGE_SUCC (then_bb, 0), then_locus,
> +              then_block);
> +  add_phi_arg (newphi, else_rhs, EDGE_SUCC (else_bb, 0), else_locus,
> +              else_block);
>
>    new_stmt = gimple_build_assign (lhs, PHI_RESULT (newphi));
>
> Index: gcc/tree-cfgcleanup.c
> ===================================================================
> --- gcc/tree-cfgcleanup.c       (revision 189246)
> +++ gcc/tree-cfgcleanup.c       (working copy)
> @@ -444,7 +444,9 @@
>             {
>               gimple phi = gsi_stmt (gsi);
>               source_location l = gimple_phi_arg_location_from_edge (phi, succ);
> -             add_phi_arg (phi, gimple_phi_arg_def (phi, succ->dest_idx), s, l);
> +             tree b = gimple_phi_arg_block_from_edge (phi, succ);
> +             add_phi_arg (phi, gimple_phi_arg_def (phi, succ->dest_idx), s, l,
> +                          b);
>             }
>         }
>      }
> @@ -871,6 +873,7 @@
>           gimple phi = gsi_stmt (gsi);
>           tree def = gimple_phi_arg_def (phi, succ->dest_idx);
>           source_location locus = gimple_phi_arg_location_from_edge (phi, succ);
> +         tree block = gimple_phi_arg_block_from_edge (phi, succ);
>
>           if (TREE_CODE (def) == SSA_NAME)
>             {
> @@ -891,12 +894,13 @@
>                     {
>                       def = new_arg;
>                       locus = redirect_edge_var_map_location (vm);
> +                     block = redirect_edge_var_map_block (vm);
>                       break;
>                     }
>                 }
>             }
>
> -         add_phi_arg (phi, def, s, locus);
> +         add_phi_arg (phi, def, s, locus, block);
>         }
>
>        redirect_edge_var_map_clear (e);
> Index: gcc/tree-ssa-pre.c
> ===================================================================
> --- gcc/tree-ssa-pre.c  (revision 189246)
> +++ gcc/tree-ssa-pre.c  (working copy)
> @@ -3403,10 +3403,10 @@
>        gcc_assert (get_expr_type (ae) == type
>                   || useless_type_conversion_p (type, get_expr_type (ae)));
>        if (ae->kind == CONSTANT)
> -       add_phi_arg (phi, PRE_EXPR_CONSTANT (ae), pred, UNKNOWN_LOCATION);
> +       add_phi_arg (phi, PRE_EXPR_CONSTANT (ae), pred, UNKNOWN_LOCATION, NULL);
>        else
>         add_phi_arg (phi, PRE_EXPR_NAME (avail[pred->src->index]), pred,
> -                    UNKNOWN_LOCATION);
> +                    UNKNOWN_LOCATION, NULL);
>      }
>
>    newphi = get_or_alloc_expr_for_name (gimple_phi_result (phi));
> Index: gcc/tree-ssa-live.c
> ===================================================================
> --- gcc/tree-ssa-live.c (revision 189246)
> +++ gcc/tree-ssa-live.c (working copy)
> @@ -765,6 +765,10 @@
>            FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_ALL_USES)
>              {
>               tree arg = USE_FROM_PTR (arg_p);
> +             int index = PHI_ARG_INDEX_FROM_USE (arg_p);
> +             tree block = gimple_phi_arg_block (phi, index);
> +             if (block != NULL)
> +               TREE_USED (block) = true;
>               mark_all_vars_used (&arg, global_unused_vars);
>              }
>          }
> Index: gcc/tree-predcom.c
> ===================================================================
> --- gcc/tree-predcom.c  (revision 189246)
> +++ gcc/tree-predcom.c  (working copy)
> @@ -1531,8 +1531,8 @@
>
>        phi = create_phi_node (var, loop->header);
>        SSA_NAME_DEF_STMT (var) = phi;
> -      add_phi_arg (phi, init, entry, UNKNOWN_LOCATION);
> -      add_phi_arg (phi, next, latch, UNKNOWN_LOCATION);
> +      add_phi_arg (phi, init, entry, UNKNOWN_LOCATION, NULL);
> +      add_phi_arg (phi, next, latch, UNKNOWN_LOCATION, NULL);
>      }
>  }
>
> @@ -1595,8 +1595,8 @@
>        next = VEC_index (tree, *vars, 1);
>        phi = create_phi_node (var, loop->header);
>        SSA_NAME_DEF_STMT (var) = phi;
> -      add_phi_arg (phi, init, entry, UNKNOWN_LOCATION);
> -      add_phi_arg (phi, next, latch, UNKNOWN_LOCATION);
> +      add_phi_arg (phi, init, entry, UNKNOWN_LOCATION, NULL);
> +      add_phi_arg (phi, next, latch, UNKNOWN_LOCATION, NULL);
>      }
>    else
>      {
> Index: gcc/sese.c
> ===================================================================
> --- gcc/sese.c  (revision 189246)
> +++ gcc/sese.c  (working copy)
> @@ -349,8 +349,8 @@
>
>    create_new_def_for (gimple_phi_result (phi), phi,
>                       gimple_phi_result_ptr (phi));
> -  add_phi_arg (phi, use, false_e, UNKNOWN_LOCATION);
> -  add_phi_arg (phi, use, true_e, UNKNOWN_LOCATION);
> +  add_phi_arg (phi, use, false_e, UNKNOWN_LOCATION, NULL);
> +  add_phi_arg (phi, use, true_e, UNKNOWN_LOCATION, NULL);
>  }
>
>  /* Insert in the block BB phi nodes for variables defined in REGION
> Index: gcc/tree-ssa-dce.c
> ===================================================================
> --- gcc/tree-ssa-dce.c  (revision 189246)
> +++ gcc/tree-ssa-dce.c  (working copy)
> @@ -1129,6 +1129,7 @@
>           gimple phi = gsi_stmt (gsi);
>           tree op;
>           source_location locus;
> +         tree block;
>
>           /* PHIs for virtuals have no control dependency relation on them.
>              We are lost here and must force renaming of the symbol.  */
> @@ -1148,7 +1149,8 @@
>
>           op = gimple_phi_arg_def (phi, e2->dest_idx);
>           locus = gimple_phi_arg_location (phi, e2->dest_idx);
> -         add_phi_arg (phi, op, e, locus);
> +         block = gimple_phi_arg_block (phi, e2->dest_idx);
> +         add_phi_arg (phi, op, e, locus, block);
>           /* The resulting PHI if not dead can only be degenerate.  */
>           gcc_assert (degenerate_phi_p (phi));
>           gsi_next (&gsi);
> Index: gcc/tree-ssa.c
> ===================================================================
> --- gcc/tree-ssa.c      (revision 189246)
> +++ gcc/tree-ssa.c      (working copy)
> @@ -51,7 +51,8 @@
>  /* Add a mapping with PHI RESULT and PHI DEF associated with edge E.  */
>
>  void
> -redirect_edge_var_map_add (edge e, tree result, tree def,
> source_location locus)
> +redirect_edge_var_map_add (edge e, tree result, tree def,
> source_location locus,
> +                          tree block)
>  {
>    void **slot;
>    edge_var_map_vector old_head, head;
> @@ -70,6 +71,7 @@
>    new_node.def = def;
>    new_node.result = result;
>    new_node.locus = locus;
> +  new_node.block = block;
>
>    VEC_safe_push (edge_var_map, heap, head, &new_node);
>    if (old_head != head)
> @@ -193,15 +195,17 @@
>      {
>        tree def;
>        source_location locus ;
> +      tree block;
>
>        phi = gsi_stmt (gsi);
>        def = gimple_phi_arg_def (phi, e->dest_idx);
>        locus = gimple_phi_arg_location (phi, e->dest_idx);
> +      block = gimple_phi_arg_block (phi, e->dest_idx);
>
>        if (def == NULL_TREE)
>         continue;
>
> -      redirect_edge_var_map_add (e, gimple_phi_result (phi), def, locus);
> +      redirect_edge_var_map_add (e, gimple_phi_result (phi), def,
> locus, block);
>      }
>
>    e = redirect_edge_succ_nodup (e, dest);
> @@ -234,7 +238,8 @@
>
>        phi = gsi_stmt (gsi);
>        def = redirect_edge_var_map_def (vm);
> -      add_phi_arg (phi, def, e, redirect_edge_var_map_location (vm));
> +      add_phi_arg (phi, def, e, redirect_edge_var_map_location (vm),
> +                  redirect_edge_var_map_block (vm));
>      }
>
>    redirect_edge_var_map_clear (e);
> Index: gcc/gimple-streamer-in.c
> ===================================================================
> --- gcc/gimple-streamer-in.c    (revision 189246)
> +++ gcc/gimple-streamer-in.c    (working copy)
> @@ -67,7 +67,7 @@
>             break;
>           }
>
> -      add_phi_arg (result, def, e, arg_loc);
> +      add_phi_arg (result, def, e, arg_loc, NULL);
>      }
>
>    return result;
> Index: gcc/tree-vect-stmts.c
> ===================================================================
> --- gcc/tree-vect-stmts.c       (revision 189246)
> +++ gcc/tree-vect-stmts.c       (working copy)
> @@ -5117,7 +5117,7 @@
>                       if (i == vec_num - 1 && j == ncopies - 1)
>                         add_phi_arg (phi, lsq,
>                                      loop_latch_edge (containing_loop),
> -                                    UNKNOWN_LOCATION);
> +                                    UNKNOWN_LOCATION, NULL);
>                       msq = lsq;
>                     }
>                 }
> Index: gcc/tree-inline.c
> ===================================================================
> --- gcc/tree-inline.c   (revision 189246)
> +++ gcc/tree-inline.c   (working copy)
> @@ -2019,6 +2019,7 @@
>               tree arg;
>               tree new_arg;
>               tree block = id->block;
> +             tree arg_block, *n;
>               edge_iterator ei2;
>
>               /* When doing partial cloning, we allow PHIs on the entry block
> @@ -2046,8 +2047,15 @@
>                   gsi_insert_seq_on_edge (new_edge, stmts);
>                   inserted = true;
>                 }
> +             n = (tree *) pointer_map_contains (id->decl_map,
> +               gimple_phi_arg_block_from_edge (phi, old_edge));
> +             if (n)
> +               arg_block = *n;
> +             else
> +               arg_block = NULL;
>               add_phi_arg (new_phi, new_arg, new_edge,
> -                          gimple_phi_arg_location_from_edge (phi, old_edge));
> +                          gimple_phi_arg_location_from_edge (phi, old_edge),
> +                          arg_block);
>             }
>         }
>      }
> Index: gcc/tree-ssa-phiprop.c
> ===================================================================
> --- gcc/tree-ssa-phiprop.c      (revision 189246)
> +++ gcc/tree-ssa-phiprop.c      (working copy)
> @@ -159,9 +159,11 @@
>        tree old_arg, new_var;
>        gimple tmp;
>        source_location locus;
> +      tree block;
>
>        old_arg = PHI_ARG_DEF_FROM_EDGE (phi, e);
>        locus = gimple_phi_arg_location_from_edge (phi, e);
> +      block = gimple_phi_arg_block_from_edge (phi, e);
>        while (TREE_CODE (old_arg) == SSA_NAME
>              && (SSA_NAME_VERSION (old_arg) >= n
>                  || phivn[SSA_NAME_VERSION (old_arg)].value == NULL_TREE))
> @@ -169,6 +171,7 @@
>           gimple def_stmt = SSA_NAME_DEF_STMT (old_arg);
>           old_arg = gimple_assign_rhs1 (def_stmt);
>           locus = gimple_location (def_stmt);
> +         block = gimple_block (def_stmt);
>         }
>
>        if (TREE_CODE (old_arg) == SSA_NAME)
> @@ -203,6 +206,7 @@
>           new_var = make_ssa_name (new_var, tmp);
>           gimple_assign_set_lhs (tmp, new_var);
>           gimple_set_location (tmp, locus);
> +         gimple_set_block (tmp, block);
>
>           gsi_insert_on_edge (e, tmp);
>           update_stmt (tmp);
> @@ -216,7 +220,7 @@
>             }
>         }
>
> -      add_phi_arg (new_phi, new_var, e, locus);
> +      add_phi_arg (new_phi, new_var, e, locus, block);
>      }
>
>    update_stmt (new_phi);
> Index: gcc/tree-outof-ssa.c
> ===================================================================
> --- gcc/tree-outof-ssa.c        (revision 189246)
> +++ gcc/tree-outof-ssa.c        (working copy)
> @@ -78,6 +78,9 @@
>    /* Source locus on each edge */
>    VEC(source_location,heap) *edge_locus;
>
> +  /* Block location on each edge.  */
> +  VEC(tree,heap) *edge_block;
> +
>    /* Visited vector.  */
>    sbitmap visited;
>
> @@ -96,6 +99,9 @@
>
>    /* Source locations for any constant copies.  */
>    VEC(source_location,heap) *copy_locus;
> +
> +  /* Block locations for any constant copies.  */
> +  VEC(tree,heap) *copy_block;
>  } *elim_graph;
>
>
> @@ -174,7 +180,8 @@
>  /* Insert a copy instruction from partition SRC to DEST onto edge E.  */
>
>  static void
> -insert_partition_copy_on_edge (edge e, int dest, int src,
> source_location locus)
> +insert_partition_copy_on_edge (edge e, int dest, int src,
> source_location locus,
> +                              tree block)
>  {
>    tree var;
>    rtx seq;
> @@ -194,7 +201,10 @@
>    set_location_for_edge (e);
>    /* If a locus is provided, override the default.  */
>    if (locus)
> -    set_curr_insn_source_location (locus);
> +    {
> +      set_curr_insn_source_location (locus);
> +      set_curr_insn_block (block);
> +    }
>
>    var = partition_to_var (SA.map, src);
>    seq = emit_partition_copy (SA.partition_to_pseudo[dest],
> @@ -209,7 +219,8 @@
>     onto edge E.  */
>
>  static void
> -insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus)
> +insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus,
> +                          tree block)
>  {
>    rtx seq, x;
>    enum machine_mode dest_mode, src_mode;
> @@ -231,7 +242,10 @@
>    set_location_for_edge (e);
>    /* If a locus is provided, override the default.  */
>    if (locus)
> -    set_curr_insn_source_location (locus);
> +    {
> +      set_curr_insn_source_location (locus);
> +      set_curr_insn_block (block);
> +    }
>
>    start_sequence ();
>
> @@ -269,7 +283,7 @@
>
>  static void
>  insert_rtx_to_part_on_edge (edge e, int dest, rtx src, int unsignedsrcp,
> -                           source_location locus)
> +                           source_location locus, tree block)
>  {
>    rtx seq;
>    if (dump_file && (dump_flags & TDF_DETAILS))
> @@ -287,7 +301,10 @@
>    set_location_for_edge (e);
>    /* If a locus is provided, override the default.  */
>    if (locus)
> -    set_curr_insn_source_location (locus);
> +    {
> +      set_curr_insn_source_location (locus);
> +      set_curr_insn_block (block);
> +    }
>
>    /* We give the destination as sizeexp in case src/dest are BLKmode
>       mems.  Usually we give the source.  As we result from SSA names
> @@ -304,7 +321,8 @@
>     onto edge E.  */
>
>  static void
> -insert_part_to_rtx_on_edge (edge e, rtx dest, int src, source_location locus)
> +insert_part_to_rtx_on_edge (edge e, rtx dest, int src, source_location locus,
> +                           tree block)
>  {
>    tree var;
>    rtx seq;
> @@ -323,7 +341,10 @@
>    set_location_for_edge (e);
>    /* If a locus is provided, override the default.  */
>    if (locus)
> -    set_curr_insn_source_location (locus);
> +    {
> +      set_curr_insn_source_location (locus);
> +      set_curr_insn_block (block);
> +    }
>
>    var = partition_to_var (SA.map, src);
>    seq = emit_partition_copy (dest,
> @@ -347,8 +368,10 @@
>    g->const_dests = VEC_alloc (int, heap, 20);
>    g->const_copies = VEC_alloc (tree, heap, 20);
>    g->copy_locus = VEC_alloc (source_location, heap, 10);
> +  g->copy_block = VEC_alloc (tree, heap, 10);
>    g->edge_list = VEC_alloc (int, heap, 20);
>    g->edge_locus = VEC_alloc (source_location, heap, 10);
> +  g->edge_block = VEC_alloc (tree, heap, 10);
>    g->stack = VEC_alloc (int, heap, 30);
>
>    g->visited = sbitmap_alloc (size);
> @@ -365,6 +388,7 @@
>    VEC_truncate (int, g->nodes, 0);
>    VEC_truncate (int, g->edge_list, 0);
>    VEC_truncate (source_location, g->edge_locus, 0);
> +  VEC_truncate (tree, g->edge_block, 0);
>  }
>
>
> @@ -380,7 +404,9 @@
>    VEC_free (int, heap, g->const_dests);
>    VEC_free (int, heap, g->nodes);
>    VEC_free (source_location, heap, g->copy_locus);
> +  VEC_free (tree, heap, g->copy_block);
>    VEC_free (source_location, heap, g->edge_locus);
> +  VEC_free (tree, heap, g->edge_block);
>
>    free (g);
>  }
> @@ -413,11 +439,13 @@
>  /* Add the edge PRED->SUCC to graph G.  */
>
>  static inline void
> -elim_graph_add_edge (elim_graph g, int pred, int succ, source_location locus)
> +elim_graph_add_edge (elim_graph g, int pred, int succ, source_location locus,
> +                    tree block)
>  {
>    VEC_safe_push (int, heap, g->edge_list, pred);
>    VEC_safe_push (int, heap, g->edge_list, succ);
>    VEC_safe_push (source_location, heap, g->edge_locus, locus);
> +  VEC_safe_push (tree, heap, g->edge_block, block);
>  }
>
>
> @@ -425,7 +453,8 @@
>     return the successor node.  -1 is returned if there is no such edge.  */
>
>  static inline int
> -elim_graph_remove_succ_edge (elim_graph g, int node, source_location *locus)
> +elim_graph_remove_succ_edge (elim_graph g, int node, source_location *locus,
> +                            tree *block)
>  {
>    int y;
>    unsigned x;
> @@ -437,9 +466,12 @@
>         VEC_replace (int, g->edge_list, x + 1, -1);
>         *locus = VEC_index (source_location, g->edge_locus, x / 2);
>         VEC_replace (source_location, g->edge_locus, x / 2, UNKNOWN_LOCATION);
> +       *block = VEC_index (tree, g->edge_block, x / 2);
> +       VEC_replace (tree, g->edge_block, x / 2, NULL);
>         return y;
>        }
>    *locus = UNKNOWN_LOCATION;
> +  *block = NULL;
>    return -1;
>  }
>
> @@ -448,7 +480,7 @@
>     edge list.  VAR will hold the partition number found.  CODE is the
>     code fragment executed for every node found.  */
>
> -#define FOR_EACH_ELIM_GRAPH_SUCC(GRAPH, NODE, VAR, LOCUS, CODE)                \
> +#define FOR_EACH_ELIM_GRAPH_SUCC(GRAPH, NODE, VAR, LOCUS, BLOCK, CODE) \
>  do {                                                                   \
>    unsigned x_;                                                         \
>    int y_;                                                              \
> @@ -460,6 +492,8 @@
>        (void) ((VAR) = VEC_index (int, (GRAPH)->edge_list, x_ + 1));    \
>        (void) ((LOCUS) = VEC_index (source_location,                    \
>                                    (GRAPH)->edge_locus, x_ / 2));       \
> +      (void) ((BLOCK) = VEC_index (tree,                               \
> +                                  (GRAPH)->edge_block, x_ / 2));       \
>        CODE;                                                            \
>      }                                                                  \
>  } while (0)
> @@ -469,7 +503,7 @@
>     GRAPH.  VAR will hold the partition number found.  CODE is the
>     code fragment executed for every node found.  */
>
> -#define FOR_EACH_ELIM_GRAPH_PRED(GRAPH, NODE, VAR, LOCUS, CODE)                \
> +#define FOR_EACH_ELIM_GRAPH_PRED(GRAPH, NODE, VAR, LOCUS, BLOCK, CODE) \
>  do {                                                                   \
>    unsigned x_;                                                         \
>    int y_;                                                              \
> @@ -481,6 +515,8 @@
>        (void) ((VAR) = VEC_index (int, (GRAPH)->edge_list, x_));                \
>        (void) ((LOCUS) = VEC_index (source_location,                    \
>                                    (GRAPH)->edge_locus, x_ / 2));       \
> +      (void) ((BLOCK) = VEC_index (tree,                               \
> +                                  (GRAPH)->edge_block, x_ / 2));       \
>        CODE;                                                            \
>      }                                                                  \
>  } while (0)
> @@ -511,6 +547,7 @@
>      {
>        gimple phi = gsi_stmt (gsi);
>        source_location locus;
> +      tree block;
>
>        p0 = var_to_partition (g->map, gimple_phi_result (phi));
>        /* Ignore results which are not in partitions.  */
> @@ -519,6 +556,7 @@
>
>        Ti = PHI_ARG_DEF (phi, g->e->dest_idx);
>        locus = gimple_phi_arg_location_from_edge (phi, g->e);
> +      block = gimple_phi_arg_block_from_edge (phi, g->e);
>
>        /* If this argument is a constant, or a SSA_NAME which is being
>          left in SSA form, just queue a copy to be emitted on this
> @@ -532,6 +570,7 @@
>           VEC_safe_push (int, heap, g->const_dests, p0);
>           VEC_safe_push (tree, heap, g->const_copies, Ti);
>           VEC_safe_push (source_location, heap, g->copy_locus, locus);
> +         VEC_safe_push (tree, heap, g->copy_block, block);
>         }
>        else
>          {
> @@ -540,7 +579,7 @@
>             {
>               eliminate_name (g, p0);
>               eliminate_name (g, pi);
> -             elim_graph_add_edge (g, p0, pi, locus);
> +             elim_graph_add_edge (g, p0, pi, locus, block);
>             }
>         }
>      }
> @@ -554,9 +593,10 @@
>  {
>    int S;
>    source_location locus;
> +  tree block;
>
>    SET_BIT (g->visited, T);
> -  FOR_EACH_ELIM_GRAPH_SUCC (g, T, S, locus,
> +  FOR_EACH_ELIM_GRAPH_SUCC (g, T, S, locus, block,
>      {
>        if (!TEST_BIT (g->visited, S))
>          elim_forward (g, S);
> @@ -572,8 +612,9 @@
>  {
>    int P;
>    source_location locus;
> +  tree block;
>
> -  FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus,
> +  FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus, block,
>      {
>        if (!TEST_BIT (g->visited, P))
>          return 1;
> @@ -588,14 +629,15 @@
>  {
>    int P;
>    source_location locus;
> +  tree block;
>
>    SET_BIT (g->visited, T);
> -  FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus,
> +  FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus, block,
>      {
>        if (!TEST_BIT (g->visited, P))
>          {
>           elim_backward (g, P);
> -         insert_partition_copy_on_edge (g->e, P, T, locus);
> +         insert_partition_copy_on_edge (g->e, P, T, locus, block);
>         }
>      });
>  }
> @@ -624,6 +666,7 @@
>  {
>    int P, S;
>    source_location locus;
> +  tree block;
>
>    if (elim_unvisited_predecessor (g, T))
>      {
> @@ -631,23 +674,24 @@
>        rtx U = get_temp_reg (var);
>        int unsignedsrcp = TYPE_UNSIGNED (TREE_TYPE (var));
>
> -      insert_part_to_rtx_on_edge (g->e, U, T, UNKNOWN_LOCATION);
> -      FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus,
> +      insert_part_to_rtx_on_edge (g->e, U, T, UNKNOWN_LOCATION, NULL);
> +      FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus, block,
>         {
>           if (!TEST_BIT (g->visited, P))
>             {
>               elim_backward (g, P);
> -             insert_rtx_to_part_on_edge (g->e, P, U, unsignedsrcp, locus);
> +             insert_rtx_to_part_on_edge (g->e, P, U, unsignedsrcp, locus,
> +                                         block);
>             }
>         });
>      }
>    else
>      {
> -      S = elim_graph_remove_succ_edge (g, T, &locus);
> +      S = elim_graph_remove_succ_edge (g, T, &locus, &block);
>        if (S != -1)
>         {
>           SET_BIT (g->visited, T);
> -         insert_partition_copy_on_edge (g->e, T, S, locus);
> +         insert_partition_copy_on_edge (g->e, T, S, locus, block);
>         }
>      }
>  }
> @@ -662,6 +706,7 @@
>
>    gcc_assert (VEC_length (tree, g->const_copies) == 0);
>    gcc_assert (VEC_length (source_location, g->copy_locus) == 0);
> +  gcc_assert (VEC_length (tree, g->copy_block) == 0);
>
>    /* Abnormal edges already have everything coalesced.  */
>    if (e->flags & EDGE_ABNORMAL)
> @@ -699,11 +744,13 @@
>        int dest;
>        tree src;
>        source_location locus;
> +      tree block;
>
>        src = VEC_pop (tree, g->const_copies);
>        dest = VEC_pop (int, g->const_dests);
>        locus = VEC_pop (source_location, g->copy_locus);
> -      insert_value_copy_on_edge (e, dest, src, locus);
> +      block = VEC_pop (tree, g->copy_block);
> +      insert_value_copy_on_edge (e, dest, src, locus, block);
>      }
>  }
>
> @@ -1088,8 +1135,12 @@
>
>                   /* copy location if present.  */
>                   if (gimple_phi_arg_has_location (phi, i))
> -                   gimple_set_location (stmt,
> -                                        gimple_phi_arg_location (phi, i));
> +                   {
> +                     gimple_set_location (stmt,
> +                                          gimple_phi_arg_location (phi, i));
> +                     gimple_set_block (stmt,
> +                                       gimple_phi_arg_block (phi, i));
> +                   }
>
>                   /* Insert the new statement into the block and update
>                      the PHI node.  */
> Index: gcc/tree-flow.h
> ===================================================================
> --- gcc/tree-flow.h     (revision 189246)
> +++ gcc/tree-flow.h     (working copy)
> @@ -506,7 +506,7 @@
>  extern void reserve_phi_args_for_new_edge (basic_block);
>  extern void add_phi_node_to_bb (gimple phi, basic_block bb);
>  extern gimple create_phi_node (tree, basic_block);
> -extern void add_phi_arg (gimple, tree, edge, source_location);
> +extern void add_phi_arg (gimple, tree, edge, source_location, tree);
>  extern void remove_phi_args (edge);
>  extern void remove_phi_node (gimple_stmt_iterator *, bool);
>  extern void remove_phi_nodes (basic_block);
> @@ -530,6 +530,7 @@
>    tree result;                 /* PHI result.  */
>    tree def;                    /* PHI arg definition.  */
>    source_location locus;        /* PHI arg location.  */
> +  tree block;                  /* PHI arg block.  */
>  };
>  typedef struct _edge_var_map edge_var_map;
>
> @@ -540,7 +541,7 @@
>  typedef VEC(edge_var_map, heap) *edge_var_map_vector;
>
>  extern void init_tree_ssa (struct function *);
> -extern void redirect_edge_var_map_add (edge, tree, tree, source_location);
> +extern void redirect_edge_var_map_add (edge, tree, tree,
> source_location, tree);
>  extern void redirect_edge_var_map_clear (edge);
>  extern void redirect_edge_var_map_dup (edge, edge);
>  extern edge_var_map_vector redirect_edge_var_map_vector (edge);
> Index: gcc/tree-switch-conversion.c
> ===================================================================
> --- gcc/tree-switch-conversion.c        (revision 189246)
> +++ gcc/tree-switch-conversion.c        (working copy)
> @@ -1189,8 +1189,10 @@
>         !gsi_end_p (gsi); gsi_next (&gsi), i++)
>      {
>        gimple phi = gsi_stmt (gsi);
> -      add_phi_arg (phi, info->target_inbound_names[i], e1f, UNKNOWN_LOCATION);
> -      add_phi_arg (phi, info->target_outbound_names[i], e2f, UNKNOWN_LOCATION);
> +      add_phi_arg (phi, info->target_inbound_names[i], e1f, UNKNOWN_LOCATION,
> +                  NULL);
> +      add_phi_arg (phi, info->target_outbound_names[i], e2f, UNKNOWN_LOCATION,
> +                  NULL);
>      }
>  }
>
> Index: gcc/tree-cfg.c
> ===================================================================
> --- gcc/tree-cfg.c      (revision 189246)
> +++ gcc/tree-cfg.c      (working copy)
> @@ -2554,7 +2554,8 @@
>
>        gcc_assert (result == gimple_phi_result (phi));
>
> -      add_phi_arg (phi, arg, new_edge, redirect_edge_var_map_location (vm));
> +      add_phi_arg (phi, arg, new_edge, redirect_edge_var_map_location (vm),
> +                  redirect_edge_var_map_block (vm));
>      }
>
>    redirect_edge_var_map_clear (old_edge);
> @@ -5014,7 +5015,7 @@
>        SSA_NAME_DEF_STMT (var) = new_phi;
>        gimple_phi_set_result (phi, make_ssa_name (SSA_NAME_VAR (var), phi));
>        add_phi_arg (new_phi, gimple_phi_result (phi), fallthru,
> -                  UNKNOWN_LOCATION);
> +                  UNKNOWN_LOCATION, NULL);
>      }
>
>    /* Add the arguments we have stored on edges.  */
> @@ -5475,7 +5476,8 @@
>        phi_copy = gsi_stmt (psi_copy);
>        def = PHI_ARG_DEF_FROM_EDGE (phi, e);
>        add_phi_arg (phi_copy, def, e_copy,
> -                  gimple_phi_arg_location_from_edge (phi, e));
> +                  gimple_phi_arg_location_from_edge (phi, e),
> +                  gimple_phi_arg_block_from_edge (phi, e));
>      }
>  }
>
> @@ -5850,7 +5852,8 @@
>           {
>             phi = gsi_stmt (psi);
>             def = PHI_ARG_DEF (phi, nexits[0]->dest_idx);
> -           add_phi_arg (phi, def, e, gimple_phi_arg_location_from_edge (phi, e));
> +           add_phi_arg (phi, def, e, gimple_phi_arg_location_from_edge (phi, e),
> +                        gimple_phi_arg_block_from_edge (phi, e));
>           }
>        }
>    e = redirect_edge_and_branch (nexits[1], nexits[0]->dest);
> @@ -7426,7 +7429,8 @@
>        phi1 = gsi_stmt (psi1);
>        phi2 = gsi_stmt (psi2);
>        def = PHI_ARG_DEF (phi2, e2->dest_idx);
> -      add_phi_arg (phi1, def, e, gimple_phi_arg_location_from_edge (phi2, e2));
> +      add_phi_arg (phi1, def, e, gimple_phi_arg_location_from_edge (phi2, e2),
> +                  gimple_phi_arg_block_from_edge (phi2, e2));
>      }
>  }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]