X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fgimple-iterator.c;h=be5171bfc28a6f065274dc4591976c20bac0edc9;hb=dc8948dbb1c662516d86df1a9575194358c1890f;hp=47aed5ce4c9f3f7c2891b5a06cc1195c5afe1d36;hpb=7c41b799c2f728a56aa2ce4a23b4e7dc57e0cd4a;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/gimple-iterator.c b/gcc/gimple-iterator.c index 47aed5ce4c9..be5171bfc28 100644 --- a/gcc/gimple-iterator.c +++ b/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 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,31 +358,27 @@ 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); gimple_remove_stmt_histograms (cfun, orig_stmt); @@ -478,6 +474,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 +484,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); } @@ -667,10 +666,13 @@ gimple_find_edge_insert_loc (edge e, gimple_stmt_iterator *gsi, 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; } }