From 4b523fc4951bf74a441c9a4c08bd4ab1428b3e3c Mon Sep 17 00:00:00 2001 From: Richard Earnshaw Date: Sat, 6 Mar 1999 17:19:39 +0000 Subject: [PATCH] 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 From-SVN: r25617 --- gcc/ChangeLog | 6 ++++++ gcc/flow.c | 20 ++++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 28761f7e4c1..02eac6ea4b0 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 + + * 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 * c-aux-info.c (data_type, affix_data_type, gen_decl, diff --git a/gcc/flow.c b/gcc/flow.c index 4f661560dcc..5b72509732a 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); } } -- 2.30.2