bool gsi_replace (gimple_stmt_iterator *gsi, gimple *stmt, bool update_eh_info) { gimple *orig_stmt = gsi_stmt (*gsi); bool require_eh_edge_purge = false; if (stmt == orig_stmt) return false; gcc_assert (!gimple_has_lhs (orig_stmt) || !gimple_has_lhs (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) require_eh_edge_purge = 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_set_stmt (gsi, stmt); gimple_set_modified (stmt, true); update_modified_stmt (stmt); return require_eh_edge_purge; }
static void tidy_after_forward_propagate_addr (gimple stmt) { /* We may have turned a trapping insn into a non-trapping insn. */ if (maybe_clean_or_replace_eh_stmt (stmt, stmt) && gimple_purge_dead_eh_edges (gimple_bb (stmt))) cfg_changed = true; if (TREE_CODE (gimple_assign_rhs1 (stmt)) == ADDR_EXPR) recompute_tree_invariant_for_addr_expr (gimple_assign_rhs1 (stmt)); }
static void tidy_after_forward_propagate_addr (tree stmt) { mark_new_vars_to_rename (stmt); /* We may have turned a trapping insn into a non-trapping insn. */ if (maybe_clean_or_replace_eh_stmt (stmt, stmt) && tree_purge_dead_eh_edges (bb_for_stmt (stmt))) cfg_changed = true; if (TREE_CODE (TREE_OPERAND (stmt, 1)) == ADDR_EXPR) recompute_tree_invarant_for_addr_expr (TREE_OPERAND (stmt, 1)); update_stmt (stmt); }