diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1994-11-22 14:38:02 -0500 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1994-11-22 14:38:02 -0500 |
commit | dce39da65769c10426ca404119e346371963a190 (patch) | |
tree | d000c6d989dcf2f3376992128f811adcdec740ee /gcc | |
parent | 9fe0563affeb7e0a4048cce3b694eb2f409953fe (diff) | |
download | gcc-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.c | 15 |
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) |