aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>2000-04-15 15:20:58 +0000
committerRichard Kenner <kenner@gcc.gnu.org>2000-04-15 11:20:58 -0400
commitc29ea88a1dafb892b521501f36bd11871bcdce98 (patch)
tree821e1bef737bb762147038f329cc098df7dca708 /gcc
parenta46c7e85d8324ee8946c255fbd1a547a6b4d2b8c (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/flow.c49
-rw-r--r--gcc/optabs.c24
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
diff --git a/gcc/flow.c b/gcc/flow.c
index c0583e8..9f7537e 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -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