summaryrefslogtreecommitdiff
path: root/gcc/tree-outof-ssa.c
diff options
context:
space:
mode:
authordehao <dehao@138bc75d-0d04-0410-961f-82ee72b054a4>2012-07-10 04:28:32 +0000
committerdehao <dehao@138bc75d-0d04-0410-961f-82ee72b054a4>2012-07-10 04:28:32 +0000
commitb82a98eec632cc9cfe703de10d4501d678ef64c1 (patch)
tree9452b0caf38ccada7226e238193cb8e3a7344571 /gcc/tree-outof-ssa.c
parent7f974c5c0cee43758614070b943c43947c4fb9fd (diff)
downloadgcc-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.c101
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. */