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; |
} |
} |