Commit ca5c3ef4 by Jim Wilson

(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
parent 6630a026
...@@ -187,6 +187,11 @@ static int subst_low_cuid; ...@@ -187,6 +187,11 @@ static int subst_low_cuid;
structures. */ structures. */
static int previous_num_undos; 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 /* 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 to (hard or pseudo) register n. We use this information to see if a
...@@ -527,6 +532,8 @@ combine_instructions (f, nregs) ...@@ -527,6 +532,8 @@ combine_instructions (f, nregs)
setup_incoming_promotions (); setup_incoming_promotions ();
nonlocal_label_list = nonlocal_label_rtx_list ();
for (insn = f; insn; insn = next ? next : NEXT_INSN (insn)) for (insn = f; insn; insn = next ? next : NEXT_INSN (insn))
{ {
next = 0; next = 0;
...@@ -1875,6 +1882,8 @@ try_combine (i3, i2, i1) ...@@ -1875,6 +1882,8 @@ try_combine (i3, i2, i1)
for (insn = NEXT_INSN (i3); for (insn = NEXT_INSN (i3);
insn && GET_CODE (insn) != CODE_LABEL insn && GET_CODE (insn) != CODE_LABEL
&& (GET_CODE (PREV_INSN (insn)) != CALL_INSN
|| nonlocal_label_list == 0)
&& GET_CODE (PREV_INSN (insn)) != JUMP_INSN; && GET_CODE (PREV_INSN (insn)) != JUMP_INSN;
insn = NEXT_INSN (insn)) insn = NEXT_INSN (insn))
{ {
...@@ -2047,7 +2056,9 @@ try_combine (i3, i2, i1) ...@@ -2047,7 +2056,9 @@ try_combine (i3, i2, i1)
XEXP (link, 0) = i3; XEXP (link, 0) = i3;
if (GET_CODE (insn) == CODE_LABEL 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; break;
} }
} }
...@@ -10037,6 +10048,8 @@ distribute_links (links) ...@@ -10037,6 +10048,8 @@ distribute_links (links)
for (insn = NEXT_INSN (XEXP (link, 0)); for (insn = NEXT_INSN (XEXP (link, 0));
(insn && GET_CODE (insn) != CODE_LABEL (insn && GET_CODE (insn) != CODE_LABEL
&& (GET_CODE (PREV_INSN (insn)) != CALL_INSN
|| nonlocal_label_list == 0)
&& GET_CODE (PREV_INSN (insn)) != JUMP_INSN); && GET_CODE (PREV_INSN (insn)) != JUMP_INSN);
insn = NEXT_INSN (insn)) insn = NEXT_INSN (insn))
if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment