aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJim Wilson <wilson@gcc.gnu.org>1993-07-21 14:44:07 -0700
committerJim Wilson <wilson@gcc.gnu.org>1993-07-21 14:44:07 -0700
commitca5c3ef417b37ef662d627ee9f1d5c8a3a31b6ff (patch)
treeb8faa69d54c38647e14273d8c3eea898a4ceef25 /gcc
parent6630a026139d10eba9665ba784b99d1cf03fe321 (diff)
downloadgcc-ca5c3ef417b37ef662d627ee9f1d5c8a3a31b6ff.zip
gcc-ca5c3ef417b37ef662d627ee9f1d5c8a3a31b6ff.tar.gz
gcc-ca5c3ef417b37ef662d627ee9f1d5c8a3a31b6ff.tar.bz2
(nonlocal_label_list): New variable.
(combine_instructions): Set it. (try_combine, distribute_links): CALL_INSN terminates a basic block if nonlocal_label_list is set. From-SVN: r4960
Diffstat (limited to 'gcc')
-rw-r--r--gcc/combine.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/gcc/combine.c b/gcc/combine.c
index 879f8c3..fa18f29 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -187,6 +187,11 @@ static int subst_low_cuid;
structures. */
static int previous_num_undos;
+
+/* This is non-zero if there exists at least one nonlocal_label in the
+ current function. This affects how basic block structure is determined. */
+
+static rtx nonlocal_label_list;
/* The next group of arrays allows the recording of the last value assigned
to (hard or pseudo) register n. We use this information to see if a
@@ -527,6 +532,8 @@ combine_instructions (f, nregs)
setup_incoming_promotions ();
+ nonlocal_label_list = nonlocal_label_rtx_list ();
+
for (insn = f; insn; insn = next ? next : NEXT_INSN (insn))
{
next = 0;
@@ -1875,6 +1882,8 @@ try_combine (i3, i2, i1)
for (insn = NEXT_INSN (i3);
insn && GET_CODE (insn) != CODE_LABEL
+ && (GET_CODE (PREV_INSN (insn)) != CALL_INSN
+ || nonlocal_label_list == 0)
&& GET_CODE (PREV_INSN (insn)) != JUMP_INSN;
insn = NEXT_INSN (insn))
{
@@ -2047,7 +2056,9 @@ try_combine (i3, i2, i1)
XEXP (link, 0) = i3;
if (GET_CODE (insn) == CODE_LABEL
- || GET_CODE (insn) == JUMP_INSN)
+ || GET_CODE (insn) == JUMP_INSN
+ || (GET_CODE (PREV_INSN (insn)) == CALL_INSN
+ && nonlocal_label_list != 0))
break;
}
}
@@ -10037,6 +10048,8 @@ distribute_links (links)
for (insn = NEXT_INSN (XEXP (link, 0));
(insn && GET_CODE (insn) != CODE_LABEL
+ && (GET_CODE (PREV_INSN (insn)) != CALL_INSN
+ || nonlocal_label_list == 0)
&& GET_CODE (PREV_INSN (insn)) != JUMP_INSN);
insn = NEXT_INSN (insn))
if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'