diff options
Diffstat (limited to 'gcc/tree-outof-ssa.c')
-rw-r--r-- | gcc/tree-outof-ssa.c | 107 |
1 files changed, 47 insertions, 60 deletions
diff --git a/gcc/tree-outof-ssa.c b/gcc/tree-outof-ssa.c index c6aa812bc17..2eaa2713984 100644 --- a/gcc/tree-outof-ssa.c +++ b/gcc/tree-outof-ssa.c @@ -51,9 +51,7 @@ Boston, MA 02111-1307, USA. */ #define SSANORM_PERFORM_TER 0x1 #define SSANORM_COMBINE_TEMPS 0x2 -#define SSANORM_REMOVE_ALL_PHIS 0x4 -#define SSANORM_COALESCE_PARTITIONS 0x8 -#define SSANORM_USE_COALESCE_LIST 0x10 +#define SSANORM_COALESCE_PARTITIONS 0x4 /* Used to hold all the components required to do SSA PHI elimination. The node and pred/succ list is a simple linear list of nodes and @@ -697,10 +695,6 @@ coalesce_ssa_name (var_map map, int flags) if (num_var_partitions (map) <= 1) return NULL; - /* If no preference given, use cheap coalescing of all partitions. */ - if ((flags & (SSANORM_COALESCE_PARTITIONS | SSANORM_USE_COALESCE_LIST)) == 0) - flags |= SSANORM_COALESCE_PARTITIONS; - liveinfo = calculate_live_on_entry (map); calculate_live_on_exit (liveinfo); rv = root_var_init (map); @@ -708,51 +702,48 @@ coalesce_ssa_name (var_map map, int flags) /* Remove single element variable from the list. */ root_var_compact (rv); - if (flags & SSANORM_USE_COALESCE_LIST) + cl = create_coalesce_list (map); + + /* Add all potential copies via PHI arguments to the list. */ + FOR_EACH_BB (bb) { - cl = create_coalesce_list (map); - - /* Add all potential copies via PHI arguments to the list. */ - FOR_EACH_BB (bb) + for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi)) { - for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi)) + tree res = PHI_RESULT (phi); + int p = var_to_partition (map, res); + if (p == NO_PARTITION) + continue; + for (x = 0; x < (unsigned)PHI_NUM_ARGS (phi); x++) { - tree res = PHI_RESULT (phi); - int p = var_to_partition (map, res); - if (p == NO_PARTITION) + tree arg = PHI_ARG_DEF (phi, x); + int p2; + + if (TREE_CODE (arg) != SSA_NAME) continue; - for (x = 0; x < (unsigned)PHI_NUM_ARGS (phi); x++) - { - tree arg = PHI_ARG_DEF (phi, x); - int p2; - - if (TREE_CODE (arg) != SSA_NAME) - continue; - if (SSA_NAME_VAR (res) != SSA_NAME_VAR (arg)) - continue; - p2 = var_to_partition (map, PHI_ARG_DEF (phi, x)); - if (p2 != NO_PARTITION) - add_coalesce (cl, p, p2, 1); - } + if (SSA_NAME_VAR (res) != SSA_NAME_VAR (arg)) + continue; + p2 = var_to_partition (map, PHI_ARG_DEF (phi, x)); + if (p2 != NO_PARTITION) + add_coalesce (cl, p, p2, 1); } } + } - /* Coalesce all the result decls together. */ - var = NULL_TREE; - i = 0; - for (x = 0; x < num_var_partitions (map); x++) + /* Coalesce all the result decls together. */ + var = NULL_TREE; + i = 0; + for (x = 0; x < num_var_partitions (map); x++) + { + tree p = partition_to_var (map, x); + if (TREE_CODE (SSA_NAME_VAR(p)) == RESULT_DECL) { - tree p = partition_to_var (map, x); - if (TREE_CODE (SSA_NAME_VAR(p)) == RESULT_DECL) + if (var == NULL_TREE) { - if (var == NULL_TREE) - { - var = p; - i = x; - } - else - add_coalesce (cl, i, x, 1); + var = p; + i = x; } + else + add_coalesce (cl, i, x, 1); } } @@ -833,16 +824,14 @@ coalesce_ssa_name (var_map map, int flags) dump_var_map (dump_file, map); /* Coalesce partitions. */ - if (flags & SSANORM_USE_COALESCE_LIST) - coalesce_tpa_members (rv, graph, map, cl, - ((dump_flags & TDF_DETAILS) ? dump_file - : NULL)); + coalesce_tpa_members (rv, graph, map, cl, + ((dump_flags & TDF_DETAILS) ? dump_file + : NULL)); - if (flags & SSANORM_COALESCE_PARTITIONS) - coalesce_tpa_members (rv, graph, map, NULL, - ((dump_flags & TDF_DETAILS) ? dump_file - : NULL)); + coalesce_tpa_members (rv, graph, map, NULL, + ((dump_flags & TDF_DETAILS) ? dump_file + : NULL)); if (cl) delete_coalesce_list (cl); root_var_delete (rv); @@ -1260,8 +1249,8 @@ new_temp_expr_table (var_map map) t->partition_dep_list = xcalloc (num_var_partitions (map) + 1, sizeof (value_expr_p)); - t->replaceable = BITMAP_XMALLOC (); - t->partition_in_use = BITMAP_XMALLOC (); + t->replaceable = BITMAP_ALLOC (NULL); + t->partition_in_use = BITMAP_ALLOC (NULL); t->saw_replaceable = false; t->virtual_partition = num_var_partitions (map); @@ -1293,8 +1282,8 @@ free_temp_expr_table (temp_expr_table_p t) free (p); } - BITMAP_XFREE (t->partition_in_use); - BITMAP_XFREE (t->replaceable); + BITMAP_FREE (t->partition_in_use); + BITMAP_FREE (t->replaceable); free (t->partition_dep_list); if (t->saw_replaceable) @@ -2115,7 +2104,7 @@ analyze_edges_for_bb (basic_block bb, FILE *debug_file) { VARRAY_EDGE_INIT (edge_leader, 25, "edge_leader"); VARRAY_TREE_INIT (stmt_list, 25, "stmt_list"); - leader_has_match = BITMAP_XMALLOC (); + leader_has_match = BITMAP_ALLOC (NULL); } else { @@ -2261,7 +2250,7 @@ perform_edge_inserts (FILE *dump_file) /* Clear out any tables which were created. */ edge_leader = NULL; - BITMAP_XFREE (leader_has_match); + BITMAP_FREE (leader_has_match); if (changed) { @@ -2382,9 +2371,7 @@ remove_ssa_form (FILE *dump, var_map map, int flags) for (phi = phi_nodes (bb); phi; phi = next) { next = PHI_CHAIN (phi); - if ((flags & SSANORM_REMOVE_ALL_PHIS) - || var_to_partition (map, PHI_RESULT (phi)) != NO_PARTITION) - remove_phi_node (phi, NULL_TREE, bb); + remove_phi_node (phi, NULL_TREE, bb); } } @@ -2492,7 +2479,7 @@ rewrite_out_of_ssa (void) { var_map map; int var_flags = 0; - int ssa_flags = (SSANORM_REMOVE_ALL_PHIS | SSANORM_USE_COALESCE_LIST); + int ssa_flags = 0; /* If elimination of a PHI requires inserting a copy on a backedge, then we will have to split the backedge which has numerous |