summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2000-04-18 01:32:43 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2000-04-18 01:32:43 +0000
commit65658d25c616ef7e72663d0a2529f4969ce58c9e (patch)
tree82f503a04671608956729a620929f00c37cfac07
parent5d9aceb4bd4967530683670528d8901548fdb3d9 (diff)
downloadgcc-65658d25c616ef7e72663d0a2529f4969ce58c9e.tar.gz
* bb-reorder.c (fixup_reorder_chain): Don't look up new block again.
(reorder_basic_blocks): If no epilogue in rtl, force last block last. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@33221 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/bb-reorder.c19
2 files changed, 23 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a3e285dba5f..326f168dc22 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2000-04-17 Richard Henderson <rth@cygnus.com>
+
+ * bb-reorder.c (fixup_reorder_chain): Don't look up new block again.
+ (reorder_basic_blocks): If no epilogue in rtl, force last block last.
+
2000-04-17 Mark Mitchell <mark@codesourcery.com>
* function.c (expand_function_start): Use hard_function_value to
@@ -123,7 +128,7 @@ Mon Apr 17 14:59:36 MET DST 2000 Jan Hubicka <jh@suse.cz>
(ASM_OUTPUT_ADDR_VEC_ELT, ASM_OUTPUT_ADDR_DIFF_ELT): Remove page check,
since vector in in the data CSECT.
(ASM_OUTPUT_REG_POP, ASM_OUTPUT_REG_PUSH): Restore to correct operation.
- * i370.md (Many patterns): Put the length in the XL directives.
+ * i370.md (Many patterns): Put the length in the XL directives.
(movdi): Put back STM and MVC in definition.
(floatsidf2): Correct TARGET_ELF_ABI pattern and add back the LE370
pattern using the TCA.
diff --git a/gcc/bb-reorder.c b/gcc/bb-reorder.c
index e2f40f1657e..5f2e178c032 100644
--- a/gcc/bb-reorder.c
+++ b/gcc/bb-reorder.c
@@ -690,8 +690,7 @@ fixup_reorder_chain ()
BASIC_BLOCK (nb->index)->local_set = 0;
nb->aux = xcalloc (1, sizeof (struct reorder_block_def));
- REORDER_BLOCK_INDEX (BASIC_BLOCK (n_basic_blocks - 1))
- = REORDER_BLOCK_INDEX (bbi) + 1;
+ REORDER_BLOCK_INDEX (nb) = REORDER_BLOCK_INDEX (bbi) + 1;
/* Relink to new block. */
nb->succ = bbi->succ;
nb->succ->src = nb;
@@ -835,6 +834,22 @@ reorder_basic_blocks ()
REORDER_BLOCK_EFF_HEAD (bbi) = NEXT_INSN (prev_eff_end);
}
}
+
+ /* If we've not got epilogue in RTL, we must fallthru to the exit.
+ Force the last block to be at the end. */
+ /* ??? Some ABIs (e.g. MIPS) require the return insn to be at the
+ end of the function for stack unwinding purposes. */
+
+#ifndef HAVE_epilogue
+#define HAVE_epilogue 0
+#endif
+
+ if (! HAVE_epilogue)
+ {
+ basic_block last = BASIC_BLOCK (n_basic_blocks - 1);
+ REORDER_BLOCK_INDEX (last) = n_basic_blocks - 1;
+ REORDER_BLOCK_FLAGS (last) |= REORDER_BLOCK_VISITED;
+ }
make_reorder_chain (BASIC_BLOCK (0));