Mercurial > hg > CbC > CbC_gcc
diff gcc/reg-stack.c @ 67:f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
author | nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 22 Mar 2011 17:18:12 +0900 |
parents | b7f97abdc517 |
children | 04ced10e8804 |
line wrap: on
line diff
--- a/gcc/reg-stack.c Tue May 25 18:58:51 2010 +0900 +++ b/gcc/reg-stack.c Tue Mar 22 17:18:12 2011 +0900 @@ -1,6 +1,6 @@ /* Register to Stack convert for GNU compiler. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 Free Software Foundation, Inc. This file is part of GCC. @@ -156,14 +156,13 @@ #include "coretypes.h" #include "tm.h" #include "tree.h" -#include "rtl.h" +#include "rtl-error.h" #include "tm_p.h" #include "function.h" #include "insn-config.h" #include "regs.h" #include "hard-reg-set.h" #include "flags.h" -#include "toplev.h" #include "recog.h" #include "output.h" #include "basic-block.h" @@ -175,6 +174,7 @@ #include "target.h" #include "df.h" #include "vecprim.h" +#include "emit-rtl.h" /* FIXME: Can go away once crtl is moved to rtl.h. */ #ifdef STACK_REGS @@ -2876,9 +2876,10 @@ return (e1->src->index < e2->src->index) ? e1 : e2; } -/* Convert stack register references in one block. */ - -static void +/* Convert stack register references in one block. Return true if the CFG + has been modified in the process. */ + +static bool convert_regs_1 (basic_block block) { struct stack_def regstack; @@ -2886,6 +2887,7 @@ int reg; rtx insn, next; bool control_flow_insn_deleted = false; + bool cfg_altered = false; int debug_insns_with_starting_stack = 0; any_malformed_asm = false; @@ -3041,7 +3043,7 @@ place, still, but we don't have enough information at that time. */ if (control_flow_insn_deleted) - purge_dead_edges (block); + cfg_altered |= purge_dead_edges (block); /* Something failed if the stack lives don't match. If we had malformed asms, we zapped the instruction itself, but that didn't produce the @@ -3051,14 +3053,18 @@ || any_malformed_asm); bi->stack_out = regstack; bi->done = true; + + return cfg_altered; } -/* Convert registers in all blocks reachable from BLOCK. */ - -static void +/* Convert registers in all blocks reachable from BLOCK. Return true if the + CFG has been modified in the process. */ + +static bool convert_regs_2 (basic_block block) { basic_block *stack, *sp; + bool cfg_altered = false; /* We process the blocks in a top-down manner, in a way such that one block is only processed after all its predecessors. The number of predecessors @@ -3097,11 +3103,13 @@ *sp++ = e->dest; } - convert_regs_1 (block); + cfg_altered |= convert_regs_1 (block); } while (sp != stack); free (stack); + + return cfg_altered; } /* Traverse all basic blocks in a function, converting the register @@ -3111,6 +3119,7 @@ static void convert_regs (void) { + bool cfg_altered = false; int inserted; basic_block b; edge e; @@ -3129,7 +3138,7 @@ /* Process all blocks reachable from all entry points. */ FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs) - convert_regs_2 (e->dest); + cfg_altered |= convert_regs_2 (e->dest); /* ??? Process all unreachable blocks. Though there's no excuse for keeping these even when not optimizing. */ @@ -3138,7 +3147,7 @@ block_info bi = BLOCK_INFO (b); if (! bi->done) - convert_regs_2 (b); + cfg_altered |= convert_regs_2 (b); } inserted |= compensate_edges (); @@ -3149,6 +3158,9 @@ if (inserted) commit_edge_insertions (); + if (cfg_altered) + cleanup_cfg (0); + if (dump_file) fputc ('\n', dump_file); }