diff options
author | Jim Wilson <wilson@gcc.gnu.org> | 1993-07-21 14:44:07 -0700 |
---|---|---|
committer | Jim Wilson <wilson@gcc.gnu.org> | 1993-07-21 14:44:07 -0700 |
commit | ca5c3ef417b37ef662d627ee9f1d5c8a3a31b6ff (patch) | |
tree | b8faa69d54c38647e14273d8c3eea898a4ceef25 /gcc | |
parent | 6630a026139d10eba9665ba784b99d1cf03fe321 (diff) | |
download | gcc-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.c | 15 |
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' |