diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 22 | ||||
-rw-r--r-- | gcc/cgraphunit.c | 34 | ||||
-rw-r--r-- | gcc/gimple-iterator.c | 4 | ||||
-rw-r--r-- | gcc/gimple.c | 8 | ||||
-rw-r--r-- | gcc/tree-inline.c | 1 |
5 files changed, 41 insertions, 28 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index eb352d6..573ce95 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2010-06-22 Eric Botcazou <ebotcazou@adacore.com> + + * cgraphunit.c (cgraph_redirect_edge_call_stmt_to_callee): Chain the + new statement and adjust VDEF only if necessary. Remove superfluous + call to maybe_clean_or_replace_eh_stmt. + * gimple.c (gimple_call_copy_skip_args): Use gimple_call_copy_flags to + copy the flags. + * gimple-iterator.c (gsi_replace): Clear BB of old statement here... + * tree-inline.c (copy_bb): ...and not there. + 2010-06-22 Cary Coutant <ccoutant@google.com> * dwarf2out.c (is_nested_in_subprogram): New function. @@ -12,15 +22,17 @@ 2010-06-22 Jan Hubicka <jh@suse.cz> - * gimple.h (gimple_expr_code): Do checking on when gimple checking is enabled. + * gimple.h (gimple_expr_code): Do checking on when gimple checking is + enabled. 2010-06-22 Jan Hubicka <jh@suse.cz> - * df-problems.c (df_rd_confluence_n, df_lr_confluence_n, df_live_confluence_n, - df_byte_lr_confluence_n, df_md_confluence_n): Return true if something changed. + * df-problems.c (df_rd_confluence_n, df_lr_confluence_n, + df_live_confluence_n, df_byte_lr_confluence_n, df_md_confluence_n): + Return true if something changed. * df.h (df_confluence_function_n): Return bool. - * df-core.c (df_worklist_propagate_forward, df_worklist_propagate_backward): - track changes and ages. + * df-core.c (df_worklist_propagate_forward, + df_worklist_propagate_backward): Track changes and ages. (df_worklist_dataflow_doublequeue): Use bitmap iterator for main walk; track ages. * dse.c (dse_confluence_n): Return always true. diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 54752ed..0a1622e 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -2345,7 +2345,6 @@ cgraph_redirect_edge_call_stmt_to_callee (struct cgraph_edge *e) { tree decl = gimple_call_fndecl (e->call_stmt); gimple new_stmt; - gimple_stmt_iterator gsi; #ifdef ENABLE_CHECKING struct cgraph_node *node; #endif @@ -2367,29 +2366,34 @@ cgraph_redirect_edge_call_stmt_to_callee (struct cgraph_edge *e) cgraph_node_name (e->callee), e->callee->uid); print_gimple_stmt (cgraph_dump_file, e->call_stmt, 0, dump_flags); if (e->callee->clone.combined_args_to_skip) - { - fprintf (cgraph_dump_file, " combined args to skip: "); - dump_bitmap (cgraph_dump_file, e->callee->clone.combined_args_to_skip); + { + fprintf (cgraph_dump_file, " combined args to skip: "); + dump_bitmap (cgraph_dump_file, + e->callee->clone.combined_args_to_skip); } } if (e->callee->clone.combined_args_to_skip) - new_stmt = gimple_call_copy_skip_args (e->call_stmt, - e->callee->clone.combined_args_to_skip); + { + gimple_stmt_iterator gsi; + + new_stmt + = gimple_call_copy_skip_args (e->call_stmt, + e->callee->clone.combined_args_to_skip); + + if (gimple_vdef (new_stmt) + && TREE_CODE (gimple_vdef (new_stmt)) == SSA_NAME) + SSA_NAME_DEF_STMT (gimple_vdef (new_stmt)) = new_stmt; + + gsi = gsi_for_stmt (e->call_stmt); + gsi_replace (&gsi, new_stmt, true); + } else new_stmt = e->call_stmt; - if (gimple_vdef (new_stmt) - && TREE_CODE (gimple_vdef (new_stmt)) == SSA_NAME) - SSA_NAME_DEF_STMT (gimple_vdef (new_stmt)) = new_stmt; - gimple_call_set_fndecl (new_stmt, e->callee->decl); - gsi = gsi_for_stmt (e->call_stmt); - gsi_replace (&gsi, new_stmt, true); + gimple_call_set_fndecl (new_stmt, e->callee->decl); update_stmt (new_stmt); - /* Update EH information too, just in case. */ - maybe_clean_or_replace_eh_stmt (e->call_stmt, new_stmt); - cgraph_set_call_stmt_including_clones (e->caller, e->call_stmt, new_stmt); if (cgraph_dump_file) diff --git a/gcc/gimple-iterator.c b/gcc/gimple-iterator.c index 13b66b6..1402c0d 100644 --- a/gcc/gimple-iterator.c +++ b/gcc/gimple-iterator.c @@ -381,8 +381,12 @@ gsi_replace (gimple_stmt_iterator *gsi, gimple stmt, bool update_eh_info) maybe_clean_or_replace_eh_stmt (orig_stmt, stmt); gimple_duplicate_stmt_histograms (cfun, stmt, cfun, orig_stmt); + + /* Free all the data flow information for ORIG_STMT. */ + gimple_set_bb (orig_stmt, NULL); gimple_remove_stmt_histograms (cfun, orig_stmt); delink_stmt_imm_use (orig_stmt); + *gsi_stmt_ptr (gsi) = stmt; gimple_set_modified (stmt, true); update_modified_stmt (stmt); diff --git a/gcc/gimple.c b/gcc/gimple.c index 1a10f31..d82a93c 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -3085,14 +3085,8 @@ gimple_call_copy_skip_args (gimple stmt, bitmap args_to_skip) gimple_set_block (new_stmt, gimple_block (stmt)); if (gimple_has_location (stmt)) gimple_set_location (new_stmt, gimple_location (stmt)); - - /* Carry all the flags to the new GIMPLE_CALL. */ + gimple_call_copy_flags (new_stmt, stmt); gimple_call_set_chain (new_stmt, gimple_call_chain (stmt)); - gimple_call_set_tail (new_stmt, gimple_call_tail_p (stmt)); - gimple_call_set_cannot_inline (new_stmt, gimple_call_cannot_inline_p (stmt)); - gimple_call_set_return_slot_opt (new_stmt, gimple_call_return_slot_opt_p (stmt)); - gimple_call_set_from_thunk (new_stmt, gimple_call_from_thunk_p (stmt)); - gimple_call_set_va_arg_pack (new_stmt, gimple_call_va_arg_pack_p (stmt)); gimple_set_modified (new_stmt, true); diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index b241a21..0b6a7d2 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -1604,7 +1604,6 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale, gimple_call_set_lhs (new_call, gimple_call_lhs (stmt)); gsi_replace (©_gsi, new_call, false); - gimple_set_bb (stmt, NULL); stmt = new_call; } else if (is_gimple_call (stmt) |