diff options
author | dehao <dehao@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-07-10 04:28:32 +0000 |
---|---|---|
committer | dehao <dehao@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-07-10 04:28:32 +0000 |
commit | b82a98eec632cc9cfe703de10d4501d678ef64c1 (patch) | |
tree | 9452b0caf38ccada7226e238193cb8e3a7344571 /gcc/tree-outof-ssa.c | |
parent | 7f974c5c0cee43758614070b943c43947c4fb9fd (diff) | |
download | gcc-b82a98eec632cc9cfe703de10d4501d678ef64c1.tar.gz |
2012-07-10 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@189402 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-outof-ssa.c')
-rw-r--r-- | gcc/tree-outof-ssa.c | 101 |
1 files changed, 76 insertions, 25 deletions
diff --git a/gcc/tree-outof-ssa.c b/gcc/tree-outof-ssa.c index f52b2603012..96d2ecd4e12 100644 --- a/gcc/tree-outof-ssa.c +++ b/gcc/tree-outof-ssa.c @@ -78,6 +78,9 @@ typedef struct _elim_graph { /* 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 @@ typedef struct _elim_graph { /* 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 @@ emit_partition_copy (rtx dest, rtx src, int unsignedsrcp, tree sizeexp) /* 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 @@ insert_partition_copy_on_edge (edge e, int dest, int src, source_location locus) 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 @@ insert_partition_copy_on_edge (edge e, int dest, int src, source_location locus) 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 @@ insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus) 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 @@ insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus) 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 @@ insert_rtx_to_part_on_edge (edge e, int dest, rtx src, int unsignedsrcp, 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 @@ insert_rtx_to_part_on_edge (edge e, int dest, rtx src, int unsignedsrcp, 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 @@ insert_part_to_rtx_on_edge (edge e, rtx dest, int src, source_location locus) 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 @@ new_elim_graph (int size) 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 @@ clear_elim_graph (elim_graph g) 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 @@ delete_elim_graph (elim_graph g) 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 @@ elim_graph_add_node (elim_graph g, int node) /* 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 @@ elim_graph_add_edge (elim_graph g, int pred, int succ, source_location locus) 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 @@ elim_graph_remove_succ_edge (elim_graph g, int node, source_location *locus) 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 @@ elim_graph_remove_succ_edge (elim_graph g, int node, source_location *locus) 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 @@ do { \ (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 @@ do { \ 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 @@ do { \ (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 @@ eliminate_build (elim_graph g) { 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 @@ eliminate_build (elim_graph g) 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 @@ eliminate_build (elim_graph g) 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_build (elim_graph g) { 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 @@ elim_forward (elim_graph g, int T) { 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 @@ elim_unvisited_predecessor (elim_graph g, int T) { 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 @@ elim_backward (elim_graph g, int T) { 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 @@ elim_create (elim_graph g, int T) { int P, S; source_location locus; + tree block; if (elim_unvisited_predecessor (g, T)) { @@ -631,23 +674,24 @@ elim_create (elim_graph g, int T) 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 @@ eliminate_phi (edge e, elim_graph g) 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 @@ eliminate_phi (edge e, elim_graph g) 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 @@ insert_backedge_copies (void) /* 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. */ |