diff options
author | Richard Kenner <kenner@vlsi1.ultra.nyu.edu> | 2000-04-15 15:20:58 +0000 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 2000-04-15 11:20:58 -0400 |
commit | c29ea88a1dafb892b521501f36bd11871bcdce98 (patch) | |
tree | 821e1bef737bb762147038f329cc098df7dca708 /gcc | |
parent | a46c7e85d8324ee8946c255fbd1a547a6b4d2b8c (diff) | |
download | gcc-c29ea88a1dafb892b521501f36bd11871bcdce98.zip gcc-c29ea88a1dafb892b521501f36bd11871bcdce98.tar.gz gcc-c29ea88a1dafb892b521501f36bd11871bcdce98.tar.bz2 |
flow.c (count_basic_blocks, [...]): Remove last change.
* flow.c (count_basic_blocks, find_basic_blocks_1): Remove last change.
* optabs.c (emit_libcall_block): If have REG_EHG_REGION, update
region number to -1.
From-SVN: r33164
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/flow.c | 49 | ||||
-rw-r--r-- | gcc/optabs.c | 24 |
3 files changed, 35 insertions, 44 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7d752a6..2c8a972 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +Sat Apr 15 10:59:19 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * flow.c (count_basic_blocks, find_basic_blocks_1): Remove last change. + * optabs.c (emit_libcall_block): If have REG_EHG_REGION, update + region number to -1. + 2000-04-15 Richard Earnshaw (rearnsah@arm.com) * emit-rtl.c (unshare_all_rtl_again): Unmark everything, then @@ -462,7 +462,6 @@ count_basic_blocks (f) register int count = 0; int eh_region = 0; int call_had_abnormal_edge = 0; - int in_libcall = 0; prev_code = JUMP_INSN; for (insn = f; insn; insn = NEXT_INSN (insn)) @@ -473,17 +472,9 @@ count_basic_blocks (f) || (GET_RTX_CLASS (code) == 'i' && (prev_code == JUMP_INSN || prev_code == BARRIER - || (prev_code == CALL_INSN - && call_had_abnormal_edge && in_libcall == 0)))) + || (prev_code == CALL_INSN && call_had_abnormal_edge)))) count++; - /* Track whether or not we are in a LIBCALL block. These must - all be within the same basic block. */ - if (find_reg_note (insn, REG_LIBCALL, NULL_RTX) != 0) - in_libcall++; - else if (find_reg_note (insn, REG_RETVAL, NULL_RTX) != 0) - in_libcall--; - /* Record whether this call created an edge. */ if (code == CALL_INSN) { @@ -538,7 +529,6 @@ find_basic_blocks_1 (f) rtx label_value_list = NULL_RTX; rtx head = NULL_RTX; rtx end = NULL_RTX; - int in_libcall = 0; /* We process the instructions in a slightly different way than we did previously. This is so that we see a NOTE_BASIC_BLOCK after we have @@ -671,9 +661,8 @@ find_basic_blocks_1 (f) call_has_abnormal_edge = 1; /* A basic block ends at a call that can either throw or - do a non-local goto. LIBCALLs must reside totally in one - basic block, so don't end a block after them. */ - if (call_has_abnormal_edge && in_libcall == 0) + do a non-local goto. */ + if (call_has_abnormal_edge) { new_bb_inclusive: if (head == NULL_RTX) @@ -713,27 +702,21 @@ find_basic_blocks_1 (f) we know isn't part of any otherwise visible control flow. */ for (note = REG_NOTES (insn); note; note = XEXP (note, 1)) - { - if (REG_NOTE_KIND (note) == REG_LABEL) - { - rtx lab = XEXP (note, 0), next; + if (REG_NOTE_KIND (note) == REG_LABEL) + { + rtx lab = XEXP (note, 0), next; - if (lab == eh_return_stub_label) - ; - else if ((next = next_nonnote_insn (lab)) != NULL - && GET_CODE (next) == JUMP_INSN - && (GET_CODE (PATTERN (next)) == ADDR_VEC - || GET_CODE (PATTERN (next)) == ADDR_DIFF_VEC)) + if (lab == eh_return_stub_label) ; - else - label_value_list - = alloc_EXPR_LIST (0, XEXP (note, 0), label_value_list); - } - else if (REG_NOTE_KIND (note) == REG_LIBCALL) - in_libcall++; - else if (REG_NOTE_KIND (note) == REG_RETVAL) - in_libcall--; - } + else if ((next = next_nonnote_insn (lab)) != NULL + && GET_CODE (next) == JUMP_INSN + && (GET_CODE (PATTERN (next)) == ADDR_VEC + || GET_CODE (PATTERN (next)) == ADDR_DIFF_VEC)) + ; + else + label_value_list + = alloc_EXPR_LIST (0, XEXP (note, 0), label_value_list); + } } } diff --git a/gcc/optabs.c b/gcc/optabs.c index 85bb24e..5f2a76a 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -2758,19 +2758,21 @@ emit_libcall_block (insns, target, result, equiv) rtx prev, next, first, last, insn; /* look for any CALL_INSNs in this sequence, and attach a REG_EH_REGION - reg note to indicate that this call cannot throw. (Unless there is - already a REG_EH_REGION note.) */ + reg note to indicate that this call cannot throw or execute a nonlocal + goto. (Unless there is already a REG_EH_REGION note, in which case + we update it.) */ for (insn = insns; insn; insn = NEXT_INSN (insn)) - { - if (GET_CODE (insn) == CALL_INSN) - { - rtx note = find_reg_note (insn, REG_EH_REGION, NULL_RTX); - if (note == NULL_RTX) - REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EH_REGION, GEN_INT (-1), - REG_NOTES (insn)); - } - } + if (GET_CODE (insn) == CALL_INSN) + { + rtx note = find_reg_note (insn, REG_EH_REGION, NULL_RTX); + + if (note != 0) + XEXP (note, 0) = GEN_INT (-1); + else + REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EH_REGION, GEN_INT (-1), + REG_NOTES (insn)); + } /* First emit all insns that set pseudos. Remove them from the list as we go. Avoid insns that set pseudos which were referenced in previous |