flow.c (make_edges): Handle casesi that jump to default branch.
authorRichard Earnshaw <rearnsha@arm.com>
Sat, 6 Mar 1999 17:19:39 +0000 (17:19 +0000)
committerRichard Henderson <rth@gcc.gnu.org>
Sat, 6 Mar 1999 17:19:39 +0000 (09:19 -0800)
        * 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

gcc/ChangeLog
gcc/flow.c

index 28761f7e4c1eb9ed9bbfcff78f7b1e9cadb6637a..02eac6ea4b0956ea6b15c0e7703272cfc1a17841 100644 (file)
@@ -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, 
index 4f661560dcc61d6c46b940e54b1f6bee94269052..5b72509732a0828b2a7d6049751488c0d19777a5 100644 (file)
@@ -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);
        }
     }