diff options
author | Richard Earnshaw <rearnsha@arm.com> | 1999-03-06 17:19:39 +0000 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 1999-03-06 09:19:39 -0800 |
commit | 4b523fc4951bf74a441c9a4c08bd4ab1428b3e3c (patch) | |
tree | 02cafb62ef987938d8bc0e26fbfd9114eb2b2648 /gcc | |
parent | 8e1f2d4c56e3d43c878a6ffe5e5c4aa6409fa035 (diff) | |
download | gcc-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')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/flow.c | 20 |
2 files changed, 24 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 28761f7..02eac6e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +Sat Mar 6 17:18:44 1999 Richard Earnshaw (rearnsha@arm.com) + Richard Henderson <rth@cygnus.com> + + * flow.c (make_edges): Handle casesi that jump to default branch. + If CASE_DROPS_THROUGH, force fallthru to block after casesi. + Sat Mar 6 07:49:23 1999 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> * c-aux-info.c (data_type, affix_data_type, gen_decl, @@ -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); } } |