X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fgimple-iterator.c;h=c3ca0e37501baf56db86193c6cf6a196bc6507a3;hb=f96d34f19f87467b4ca672d423857405c2913bc6;hp=666b47b47a8531e90109a8ad0d6cfe8d2af91ecb;hpb=3d400f58692dd7eb565f25ca266ea9e7439f9ed8;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/gimple-iterator.c b/gcc/gimple-iterator.c index 666b47b47a8..c3ca0e37501 100644 --- a/gcc/gimple-iterator.c +++ b/gcc/gimple-iterator.c @@ -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,8 @@ gsi_remove (gimple_stmt_iterator *i, bool remove_permanently) gimple_seq_node cur, next, prev; gimple stmt = gsi_stmt (*i); + 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 +483,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); } @@ -623,9 +621,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 +665,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; } }