aboutsummaryrefslogtreecommitdiff
path: root/gcc/flow.c
diff options
context:
space:
mode:
authorRichard Earnshaw <rearnsha@arm.com>1999-03-06 17:19:39 +0000
committerRichard Henderson <rth@gcc.gnu.org>1999-03-06 09:19:39 -0800
commit4b523fc4951bf74a441c9a4c08bd4ab1428b3e3c (patch)
tree02cafb62ef987938d8bc0e26fbfd9114eb2b2648 /gcc/flow.c
parent8e1f2d4c56e3d43c878a6ffe5e5c4aa6409fa035 (diff)
downloadgcc-4b523fc4951bf74a441c9a4c08bd4ab1428b3e3c.zip
gcc-4b523fc4951bf74a441c9a4c08bd4ab1428b3e3c.tar.gz
gcc-4b523fc4951bf74a441c9a4c08bd4ab1428b3e3c.tar.bz2
flow.c (make_edges): Handle casesi that jump to default branch.
* flow.c (make_edges): Handle casesi that jump to default branch. If CASE_DROPS_THROUGH, force fallthru to block after casesi. Co-Authored-By: Richard Henderson <rth@cygnus.com> From-SVN: r25617
Diffstat (limited to 'gcc/flow.c')
-rw-r--r--gcc/flow.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/gcc/flow.c b/gcc/flow.c
index 4f66156..5b72509 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -871,6 +871,7 @@ make_edges (label_value_list, bb_eh_end)
basic_block bb = BASIC_BLOCK (i);
rtx insn, x, eh_list;
enum rtx_code code;
+ int force_fallthru = 0;
/* If we have asynchronous exceptions, scan the notes for all exception
regions active in the block. In the normal case, we only need the
@@ -915,6 +916,21 @@ make_edges (label_value_list, bb_eh_end)
for (j = GET_NUM_ELEM (vec) - 1; j >= 0; --j)
make_label_edge (bb, XEXP (RTVEC_ELT (vec, j), 0), 0);
+
+ /* Some targets (eg, ARM) emit a conditional jump that also
+ contains the out-of-range target. Scan for these and
+ add an edge if necessary. */
+ if ((tmp = single_set (insn)) != NULL
+ && SET_DEST (tmp) == pc_rtx
+ && GET_CODE (SET_SRC (tmp)) == IF_THEN_ELSE
+ && GET_CODE (XEXP (SET_SRC (tmp), 2)) == LABEL_REF)
+ make_label_edge (bb, XEXP (XEXP (SET_SRC (tmp), 2), 0), 0);
+
+#ifdef CASE_DROPS_THROUGH
+ /* Silly VAXen. The ADDR_VEC is going to be in the way of
+ us naturally detecting fallthru into the next block. */
+ force_fallthru = 1;
+#endif
}
/* If this is a computed jump, then mark it as reaching
@@ -1015,14 +1031,14 @@ make_edges (label_value_list, bb_eh_end)
/* Find out if we can drop through to the next block. */
insn = next_nonnote_insn (insn);
- if (!insn)
+ if (!insn || (i + 1 == n_basic_blocks && force_fallthru))
make_edge (bb, EXIT_BLOCK_PTR, EDGE_FALLTHRU);
else if (i + 1 < n_basic_blocks)
{
rtx tmp = BLOCK_HEAD (i + 1);
if (GET_CODE (tmp) == NOTE)
tmp = next_nonnote_insn (tmp);
- if (insn == tmp)
+ if (force_fallthru || insn == tmp)
make_edge (bb, BASIC_BLOCK (i + 1), EDGE_FALLTHRU);
}
}