diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/Makefile.in | 2 | ||||
-rw-r--r-- | gcc/cfg.c | 28 |
3 files changed, 29 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9c147c8e92b..22d2074e2e6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2001-09-19 Richard Henderson <rth@redhat.com> + * cfg.c (force_nonfallthru_and_redirect): Handle redirecting + to the exit block. + * Makefile.in (cfg.o): Depend on TM_P_H. + +2001-09-19 Richard Henderson <rth@redhat.com> + * config/alpha/alpha.c (local_symbol_p): Split out from ... (local_symbolic_operand): ... here. (small_symbolic_operand): Check mode. diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 8b7ceb8bec1..57f29c5c3cd 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1490,7 +1490,7 @@ flow.o : flow.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(TREE_H) flags.h insn-config.h function.h except.h $(EXPR_H) ssa.h $(GGC_H) $(TM_P_H) cfg.o : cfg.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) flags.h insn-config.h \ $(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h output.h toplev.h $(RECOG_H) \ - function.h except.h $(GGC_H) + function.h except.h $(GGC_H) $(TM_P_H) cfganal.o : cfganal.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) \ $(BASIC_BLOCK_H) hard-reg-set.h $(GGC_H) cfgbuild.o : cfgbuild.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) flags.h insn-config.h \ diff --git a/gcc/cfg.c b/gcc/cfg.c index 00645c221b8..9ba752d456e 100644 --- a/gcc/cfg.c +++ b/gcc/cfg.c @@ -64,9 +64,16 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "function.h" #include "except.h" #include "toplev.h" - +#include "tm_p.h" #include "obstack.h" + +/* Stubs in case we haven't got a return insn. */ +#ifndef HAVE_return +#define HAVE_return 0 +#define gen_return() NULL_RTX +#endif + /* The obstack on which the flow graph components are allocated. */ struct obstack flow_obstack; @@ -1249,7 +1256,6 @@ force_nonfallthru_and_redirect (e, target) basic_block jump_block, new_bb = NULL; rtx note; edge new_edge; - rtx label; if (e->flags & EDGE_ABNORMAL) abort (); @@ -1290,10 +1296,20 @@ force_nonfallthru_and_redirect (e, target) else jump_block = e->src; e->flags &= ~EDGE_FALLTHRU; - label = block_label (target); - emit_jump_insn_after (gen_jump (label), jump_block->end); - JUMP_LABEL (jump_block->end) = label; - LABEL_NUSES (label)++; + if (target == EXIT_BLOCK_PTR) + { + if (HAVE_return) + emit_jump_insn_after (gen_return (), jump_block->end); + else + abort (); + } + else + { + rtx label = block_label (target); + emit_jump_insn_after (gen_jump (label), jump_block->end); + JUMP_LABEL (jump_block->end) = label; + LABEL_NUSES (label)++; + } emit_barrier_after (jump_block->end); redirect_edge_succ_nodup (e, target); |