aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1994-11-22 14:38:02 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1994-11-22 14:38:02 -0500
commitdce39da65769c10426ca404119e346371963a190 (patch)
treed000c6d989dcf2f3376992128f811adcdec740ee /gcc
parent9fe0563affeb7e0a4048cce3b694eb2f409953fe (diff)
downloadgcc-dce39da65769c10426ca404119e346371963a190.zip
gcc-dce39da65769c10426ca404119e346371963a190.tar.gz
gcc-dce39da65769c10426ca404119e346371963a190.tar.bz2
(emit_no_conflict_block): Just emit the insns if the block contains
something not an INSN or has an embedded block. From-SVN: r8550
Diffstat (limited to 'gcc')
-rw-r--r--gcc/optabs.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c
index 724f36b..e5d9c17 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -2395,9 +2395,7 @@ emit_unop_insn (icode, target, op0, code)
INSNS is a block of code generated to perform the operation, not including
the CLOBBER and final copy. All insns that compute intermediate values
- are first emitted, followed by the block as described above. Only
- INSNs are allowed in the block; no library calls or jumps may be
- present.
+ are first emitted, followed by the block as described above.
TARGET, OP0, and OP1 are the output and inputs of the operations,
respectively. OP1 may be zero for a unary operation.
@@ -2406,7 +2404,8 @@ emit_unop_insn (icode, target, op0, code)
on the last insn.
If TARGET is not a register, INSNS is simply emitted with no special
- processing.
+ processing. Likewise if anything in INSNS is not an INSN or if
+ there is a libcall block inside INSNS.
The final insn emitted is returned. */
@@ -2421,6 +2420,11 @@ emit_no_conflict_block (insns, target, op0, op1, equiv)
if (GET_CODE (target) != REG || reload_in_progress)
return emit_insns (insns);
+ else
+ for (insn = insns; insn; insn = NEXT_INSN (insn))
+ if (GET_CODE (insn) != INSN
+ || find_reg_note (insn, REG_LIBCALL, NULL_RTX))
+ return emit_insns (insns);
/* First emit all insns that do not store into words of the output and remove
these from the list. */
@@ -2431,9 +2435,6 @@ emit_no_conflict_block (insns, target, op0, op1, equiv)
next = NEXT_INSN (insn);
- if (GET_CODE (insn) != INSN)
- abort ();
-
if (GET_CODE (PATTERN (insn)) == SET)
set = PATTERN (insn);
else if (GET_CODE (PATTERN (insn)) == PARALLEL)