X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fmode-switching.c;h=5df61c890a266a6692f6bbd3b89e89674473dc77;hb=d3832055fda2ca4c70c534b5638eb8f018ea3225;hp=3fdb2b4137e2f9c6b62cfbae18cafbb698627ce0;hpb=4629257b39062d7c7759eea44f265bbbabbd7cb3;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/mode-switching.c b/gcc/mode-switching.c index 3fdb2b4137e..5df61c890a2 100644 --- a/gcc/mode-switching.c +++ b/gcc/mode-switching.c @@ -1,12 +1,12 @@ /* CPU mode switching - Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007 - Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, + 2009 Free Software Foundation, Inc. This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later +Software Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY @@ -15,9 +15,8 @@ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301, USA. */ +along with GCC; see the file COPYING3. If not see +. */ #include "config.h" #include "system.h" @@ -94,7 +93,7 @@ static sbitmap *comp; static struct seginfo * new_seginfo (int, rtx, int, HARD_REG_SET); static void add_seginfo (struct bb_info *, struct seginfo *); static void reg_dies (rtx, HARD_REG_SET *); -static void reg_becomes_live (rtx, rtx, void *); +static void reg_becomes_live (rtx, const_rtx, void *); static void make_preds_opaque (basic_block, int); @@ -177,7 +176,7 @@ reg_dies (rtx reg, HARD_REG_SET *live) This is called via note_stores. */ static void -reg_becomes_live (rtx reg, rtx setter ATTRIBUTE_UNUSED, void *live) +reg_becomes_live (rtx reg, const_rtx setter ATTRIBUTE_UNUSED, void *live) { int regno; @@ -246,6 +245,17 @@ create_pre_exit (int n_entities, int *entity_map, const int *num_modes) if (INSN_P (return_copy)) { + /* When using SJLJ exceptions, the call to the + unregister function is inserted between the + clobber of the return value and the copy. + We do not want to split the block before this + or any other call; if we have not found the + copy yet, the copy must have been deleted. */ + if (CALL_P (return_copy)) + { + short_block = 1; + break; + } return_copy_pat = PATTERN (return_copy); switch (GET_CODE (return_copy_pat)) { @@ -575,7 +585,7 @@ optimize_mode_switching (void) for (i = 0; i < max_num_modes; i++) { int current_mode[N_ENTITIES]; - sbitmap *delete; + sbitmap *del; sbitmap *insert; /* Set the anticipatable and computing arrays. */ @@ -602,7 +612,7 @@ optimize_mode_switching (void) FOR_EACH_BB (bb) sbitmap_not (kill[bb->index], transp[bb->index]); edge_list = pre_edge_lcm (n_entities, transp, comp, antic, - kill, &insert, &delete); + kill, &insert, &del); for (j = n_entities - 1; j >= 0; j--) { @@ -653,7 +663,7 @@ optimize_mode_switching (void) } FOR_EACH_BB_REVERSE (bb) - if (TEST_BIT (delete[bb->index], j)) + if (TEST_BIT (del[bb->index], j)) { make_preds_opaque (bb, j); /* Cancel the 'deleted' mode set. */ @@ -661,7 +671,7 @@ optimize_mode_switching (void) } } - sbitmap_vector_free (delete); + sbitmap_vector_free (del); sbitmap_vector_free (insert); clear_aux_for_edges (); free_edge_list (edge_list); @@ -746,9 +756,11 @@ rest_of_handle_mode_switching (void) } -struct tree_opt_pass pass_mode_switching = +struct rtl_opt_pass pass_mode_switching = { - "mode-sw", /* name */ + { + RTL_PASS, + "mode_sw", /* name */ gate_mode_switching, /* gate */ rest_of_handle_mode_switching, /* execute */ NULL, /* sub */ @@ -759,7 +771,7 @@ struct tree_opt_pass pass_mode_switching = 0, /* properties_provided */ 0, /* properties_destroyed */ 0, /* todo_flags_start */ - TODO_df_finish | - TODO_dump_func, /* todo_flags_finish */ - 0 /* letter */ + TODO_df_finish | TODO_verify_rtl_sharing | + TODO_dump_func /* todo_flags_finish */ + } };