From dce39da65769c10426ca404119e346371963a190 Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Tue, 22 Nov 1994 14:38:02 -0500 Subject: [PATCH] (emit_no_conflict_block): Just emit the insns if the block contains something not an INSN or has an embedded block. From-SVN: r8550 --- gcc/optabs.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/gcc/optabs.c b/gcc/optabs.c index 724f36b58cb..e5d9c177b21 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) -- 2.30.2