| Index: gcc/gcc/gimple-iterator.c
|
| diff --git a/gcc/gcc/gimple-iterator.c b/gcc/gcc/gimple-iterator.c
|
| index a52c83072b44c950eadb5c3ea570702a70cbe1b0..cb911f7b25c19bd588840ea2538b4fec7cb30581 100644
|
| --- a/gcc/gcc/gimple-iterator.c
|
| +++ b/gcc/gcc/gimple-iterator.c
|
| @@ -1,5 +1,5 @@
|
| /* Iterator routines for GIMPLE statements.
|
| - Copyright (C) 2007, 2008 Free Software Foundation, Inc.
|
| + Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc.
|
| Contributed by Aldy Hernandez <aldy@quesejoda.com>
|
|
|
| This file is part of GCC.
|
| @@ -45,9 +45,9 @@ static void
|
| update_modified_stmts (gimple_seq seq)
|
| {
|
| gimple_stmt_iterator gsi;
|
| -
|
| +
|
| if (!ssa_operands_active ())
|
| - return;
|
| + return;
|
| for (gsi = gsi_start (seq); !gsi_end_p (gsi); gsi_next (&gsi))
|
| update_stmt_if_modified (gsi_stmt (gsi));
|
| }
|
| @@ -60,7 +60,7 @@ static void
|
| update_bb_for_stmts (gimple_seq_node first, basic_block bb)
|
| {
|
| gimple_seq_node n;
|
| -
|
| +
|
| for (n = first; n; n = n->next)
|
| gimple_set_bb (n->stmt, bb);
|
| }
|
| @@ -358,35 +358,35 @@ gsi_split_seq_before (gimple_stmt_iterator *i)
|
|
|
| /* Replace the statement pointed-to by GSI to STMT. If UPDATE_EH_INFO
|
| is true, the exception handling information of the original
|
| - statement is moved to the new statement. */
|
| + statement is moved to the new statement. Assignments must only be
|
| + replaced with assignments to the same LHS. */
|
|
|
| void
|
| gsi_replace (gimple_stmt_iterator *gsi, gimple stmt, bool update_eh_info)
|
| {
|
| - int eh_region;
|
| gimple orig_stmt = gsi_stmt (*gsi);
|
|
|
| if (stmt == orig_stmt)
|
| return;
|
|
|
| + gcc_assert (!gimple_has_lhs (orig_stmt)
|
| + || gimple_get_lhs (orig_stmt) == gimple_get_lhs (stmt));
|
| +
|
| gimple_set_location (stmt, gimple_location (orig_stmt));
|
| gimple_set_bb (stmt, gsi_bb (*gsi));
|
|
|
| /* Preserve EH region information from the original statement, if
|
| requested by the caller. */
|
| if (update_eh_info)
|
| - {
|
| - eh_region = lookup_stmt_eh_region (orig_stmt);
|
| - if (eh_region >= 0)
|
| - {
|
| - remove_stmt_from_eh_region (orig_stmt);
|
| - add_stmt_to_eh_region (stmt, eh_region);
|
| - }
|
| - }
|
| + 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);
|
| @@ -478,6 +478,9 @@ gsi_remove (gimple_stmt_iterator *i, bool remove_permanently)
|
| gimple_seq_node cur, next, prev;
|
| gimple stmt = gsi_stmt (*i);
|
|
|
| + if (gimple_code (stmt) != GIMPLE_PHI)
|
| + insert_debug_temps_for_defs (i);
|
| +
|
| /* Free all the data flow information for STMT. */
|
| gimple_set_bb (stmt, NULL);
|
| delink_stmt_imm_use (stmt);
|
| @@ -485,7 +488,7 @@ gsi_remove (gimple_stmt_iterator *i, bool remove_permanently)
|
|
|
| if (remove_permanently)
|
| {
|
| - remove_stmt_from_eh_region (stmt);
|
| + remove_stmt_from_eh_lp (stmt);
|
| gimple_remove_stmt_histograms (cfun, stmt);
|
| }
|
|
|
| @@ -604,7 +607,7 @@ gsi_insert_seq_on_edge (edge e, gimple_seq seq)
|
|
|
| In all cases, the returned *GSI points to the correct location. The
|
| return value is true if insertion should be done after the location,
|
| - or false if it should be done before the location. If new basic block
|
| + or false if it should be done before the location. If a new basic block
|
| has to be created, it is stored in *NEW_BB. */
|
|
|
| static bool
|
| @@ -623,9 +626,9 @@ gimple_find_edge_insert_loc (edge e, gimple_stmt_iterator *gsi,
|
| would have to examine the PHIs to prove that none of them used
|
| the value set by the statement we want to insert on E. That
|
| hardly seems worth the effort. */
|
| -restart:
|
| + restart:
|
| if (single_pred_p (dest)
|
| - && ! phi_nodes (dest)
|
| + && gimple_seq_empty_p (phi_nodes (dest))
|
| && dest != EXIT_BLOCK_PTR)
|
| {
|
| *gsi = gsi_start_bb (dest);
|
| @@ -667,10 +670,13 @@ restart:
|
| if (!stmt_ends_bb_p (tmp))
|
| return true;
|
|
|
| - if (gimple_code (tmp) == GIMPLE_RETURN)
|
| - {
|
| - gsi_prev (gsi);
|
| - return true;
|
| + switch (gimple_code (tmp))
|
| + {
|
| + case GIMPLE_RETURN:
|
| + case GIMPLE_RESX:
|
| + return false;
|
| + default:
|
| + break;
|
| }
|
| }
|
|
|
|
|