diff options
Diffstat (limited to 'gcc/tree-sra.c')
| -rw-r--r-- | gcc/tree-sra.c | 47 |
1 files changed, 38 insertions, 9 deletions
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index b933fbc..1ca629fe 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -1428,6 +1428,8 @@ decide_instantiations (void) } bitmap_clear (&done_head); + mark_set_for_renaming (sra_candidates); + if (dump_file) fputc ('\n', dump_file); } @@ -1439,7 +1441,7 @@ decide_instantiations (void) renaming. This becomes necessary when we modify all of a non-scalar. */ static void -mark_all_v_defs (tree stmt) +mark_all_v_defs_1 (tree stmt) { tree sym; ssa_op_iter iter; @@ -1450,10 +1452,28 @@ mark_all_v_defs (tree stmt) { if (TREE_CODE (sym) == SSA_NAME) sym = SSA_NAME_VAR (sym); - bitmap_set_bit (vars_to_rename, var_ann (sym)->uid); + mark_sym_for_renaming (sym); + } +} + + +/* Mark all the variables in virtual operands in all the statements in + LIST for renaming. */ + +static void +mark_all_v_defs (tree list) +{ + if (TREE_CODE (list) != STATEMENT_LIST) + mark_all_v_defs_1 (list); + else + { + tree_stmt_iterator i; + for (i = tsi_start (list); !tsi_end_p (i); tsi_next (&i)) + mark_all_v_defs_1 (tsi_stmt (i)); } } + /* Build a single level component reference to ELT rooted at BASE. */ static tree @@ -1706,7 +1726,7 @@ generate_element_init (struct sra_elt *elt, tree init, tree *list_p) new = num_referenced_vars; for (j = old; j < new; ++j) - bitmap_set_bit (vars_to_rename, j); + mark_sym_for_renaming (referenced_var (j)); } return ret; @@ -1820,7 +1840,7 @@ scalarize_use (struct sra_elt *elt, tree *expr_p, block_stmt_iterator *bsi, generate_copy_inout (elt, is_output, generate_element_ref (elt), &list); if (list == NULL) return; - mark_all_v_defs (expr_first (list)); + mark_all_v_defs (list); if (is_output) sra_insert_after (bsi, list); else @@ -1865,7 +1885,7 @@ scalarize_copy (struct sra_elt *lhs_elt, struct sra_elt *rhs_elt, generate_element_ref (rhs_elt), &list); if (list) { - mark_all_v_defs (expr_first (list)); + mark_all_v_defs (list); sra_insert_before (bsi, list); } @@ -1873,7 +1893,10 @@ scalarize_copy (struct sra_elt *lhs_elt, struct sra_elt *rhs_elt, generate_copy_inout (lhs_elt, true, generate_element_ref (lhs_elt), &list); if (list) - sra_insert_after (bsi, list); + { + mark_all_v_defs (list); + sra_insert_after (bsi, list); + } } else { @@ -1887,6 +1910,7 @@ scalarize_copy (struct sra_elt *lhs_elt, struct sra_elt *rhs_elt, list = NULL; generate_element_copy (lhs_elt, rhs_elt, &list); gcc_assert (list); + mark_all_v_defs (list); sra_replace (bsi, list); } } @@ -1936,7 +1960,7 @@ scalarize_init (struct sra_elt *lhs_elt, tree rhs, block_stmt_iterator *bsi) exposes constants to later optimizations. */ if (list) { - mark_all_v_defs (expr_first (list)); + mark_all_v_defs (list); sra_insert_after (bsi, list); } } @@ -1946,6 +1970,7 @@ scalarize_init (struct sra_elt *lhs_elt, tree rhs, block_stmt_iterator *bsi) replaces the original structure assignment. */ gcc_assert (list); mark_all_v_defs (bsi_stmt (*bsi)); + mark_all_v_defs (list); sra_replace (bsi, list); } } @@ -1996,6 +2021,7 @@ scalarize_ldst (struct sra_elt *elt, tree other, mark_all_v_defs (stmt); generate_copy_inout (elt, is_output, other, &list); + mark_all_v_defs (list); gcc_assert (list); /* Preserve EH semantics. */ @@ -2051,7 +2077,10 @@ scalarize_parms (void) } if (list) - insert_edge_copies (list, ENTRY_BLOCK_PTR); + { + insert_edge_copies (list, ENTRY_BLOCK_PTR); + mark_all_v_defs (list); + } } /* Entry point to phase 4. Update the function to match replacements. */ @@ -2154,7 +2183,7 @@ struct tree_opt_pass pass_sra = 0, /* properties_provided */ 0, /* properties_destroyed */ 0, /* todo_flags_start */ - TODO_dump_func | TODO_rename_vars + TODO_dump_func | TODO_update_ssa | TODO_ggc_collect | TODO_verify_ssa, /* todo_flags_finish */ 0 /* letter */ }; |
