X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Ftree-ssa-loop-ch.c;h=2b3094622d71c8ffdb1a02aad9de300f35ff5a91;hb=fed0a860dc619d09bef1d8e52754e61728865066;hp=5a16822c844106f0c57dfb25928a2aecbd598d99;hpb=ea091dfdfe023dacb0c7c2af37bdd75e23c530f4;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/tree-ssa-loop-ch.c b/gcc/tree-ssa-loop-ch.c index 5a16822c844..2b3094622d7 100644 --- a/gcc/tree-ssa-loop-ch.c +++ b/gcc/tree-ssa-loop-ch.c @@ -1,5 +1,5 @@ /* Loop header copying on trees. - Copyright (C) 2004 Free Software Foundation, Inc. + Copyright (C) 2004, 2005 Free Software Foundation, Inc. This file is part of GCC. @@ -15,8 +15,8 @@ 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, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ +Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301, USA. */ #include "config.h" #include "system.h" @@ -127,14 +127,14 @@ copy_loop_headers (void) unsigned i; struct loop *loop; basic_block header; - edge exit; - basic_block *bbs; + edge exit, entry; + basic_block *bbs, *copied_bbs; unsigned n_bbs; + unsigned bbs_size; loops = loop_optimizer_init (dump_file); if (!loops) return; - rewrite_into_loop_closed_ssa (NULL); /* We do not try to keep the information about irreducible regions up-to-date. */ @@ -145,6 +145,8 @@ copy_loop_headers (void) #endif bbs = xmalloc (sizeof (basic_block) * n_basic_blocks); + copied_bbs = xmalloc (sizeof (basic_block) * n_basic_blocks); + bbs_size = n_basic_blocks; for (i = 1; i < loops->num; i++) { @@ -180,6 +182,7 @@ copy_loop_headers (void) else exit = EDGE_SUCC (header, 1); bbs[n_bbs++] = header; + gcc_assert (bbs_size > n_bbs); header = exit->dest; } @@ -194,10 +197,11 @@ copy_loop_headers (void) /* Ensure that the header will have just the latch as a predecessor inside the loop. */ if (!single_pred_p (exit->dest)) - exit = single_succ_edge (loop_split_edge_with (exit, NULL)); + exit = single_pred_edge (loop_split_edge_with (exit, NULL)); - if (!tree_duplicate_sese_region (loop_preheader_edge (loop), exit, - bbs, n_bbs, NULL)) + entry = loop_preheader_edge (loop); + + if (!tree_duplicate_sese_region (entry, exit, bbs, n_bbs, copied_bbs)) { fprintf (dump_file, "Duplication failed.\n"); continue; @@ -210,10 +214,7 @@ copy_loop_headers (void) } free (bbs); - -#ifdef ENABLE_CHECKING - verify_loop_closed_ssa (); -#endif + free (copied_bbs); loop_optimizer_finalize (loops, NULL); }