diff options
author | kkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-11-13 03:28:13 +0000 |
---|---|---|
committer | kkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-11-13 03:28:13 +0000 |
commit | 778725bb221f705d653fb669367eeefd42445df6 (patch) | |
tree | 59971702035ebe1fb851b935b3c42eccd90dded2 /gcc | |
parent | 3bac43389144650f404ecf26f86f722641a82994 (diff) | |
download | gcc-778725bb221f705d653fb669367eeefd42445df6.tar.gz |
* genemit.c (gen_insn): Call gen_exp with a non-null used
when handling multiple insns.
(gen_expand): Likewise.
* reorg.c (emit_delay_sequence): Copy the delay slot insn.
* config/sh/sh.md (ashrsi2_31+1): Copy operands[0].
(movsi_const_16bit+1): Copy operands[1].
(call_pcrel): Copy the call_site pattern.
(call_value_pcrel, sibcall_pcrel, GOTaddr2picreg): Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@118746 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/config/sh/sh.md | 16 | ||||
-rw-r--r-- | gcc/genemit.c | 12 | ||||
-rw-r--r-- | gcc/reorg.c | 2 |
4 files changed, 30 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2a0318a78c0..6865d8220de 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2006-11-12 Kaz Kojima <kkojima@gcc.gnu.org> + + * genemit.c (gen_insn): Call gen_exp with a non-null used + when handling multiple insns. + (gen_expand): Likewise. + * reorg.c (emit_delay_sequence): Copy the delay slot insn. + * config/sh/sh.md (ashrsi2_31+1): Copy operands[0]. + (movsi_const_16bit+1): Copy operands[1]. + (call_pcrel): Copy the call_site pattern. + (call_value_pcrel, sibcall_pcrel, GOTaddr2picreg): Likewise. + 2006-11-12 Roger Sayle <roger@eyesopen.com> * fold-const.c (negate_expr_p) <PLUS_EXPR, MINUS_EXPR>: Correct/refine diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md index a37c58308e3..ab9a3b4d606 100644 --- a/gcc/config/sh/sh.md +++ b/gcc/config/sh/sh.md @@ -3752,7 +3752,7 @@ label: " { emit_insn (gen_ashlsi_c (operands[0], operands[1])); - emit_insn (gen_mov_neg_si_t (operands[0])); + emit_insn (gen_mov_neg_si_t (copy_rtx (operands[0]))); DONE; }") @@ -5113,7 +5113,7 @@ label: { rtx insn = emit_insn (gen_movsi_const (operands[0], operands[1])); - REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, operands[1], + REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, copy_rtx (operands[1]), REG_NOTES (insn)); DONE; @@ -5497,7 +5497,7 @@ label: else insn = emit_insn (gen_movdi_const_32bit (operands[0], operands[1])); - REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, operands[1], + REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, copy_rtx (operands[1]), REG_NOTES (insn)); DONE; @@ -7390,7 +7390,7 @@ label: emit_insn (gen_sym_label2reg (operands[2], operands[0], lab)); else emit_insn (gen_symPLT_label2reg (operands[2], operands[0], lab)); - emit_call_insn (gen_calli_pcrel (operands[2], operands[1], lab)); + emit_call_insn (gen_calli_pcrel (operands[2], operands[1], copy_rtx (lab))); DONE; }" [(set_attr "type" "call") @@ -7494,7 +7494,7 @@ label: else emit_insn (gen_symPLT_label2reg (operands[3], operands[1], lab)); emit_call_insn (gen_call_valuei_pcrel (operands[0], operands[3], - operands[2], lab)); + operands[2], copy_rtx (lab))); DONE; }" [(set_attr "type" "call") @@ -7875,7 +7875,7 @@ label: emit_insn (gen_sym_label2reg (operands[2], operands[0], lab)); call_insn = emit_call_insn (gen_sibcalli_pcrel (operands[2], operands[1], - lab)); + copy_rtx (lab))); SIBLING_CALL_P (call_insn) = 1; DONE; }" @@ -8313,12 +8313,12 @@ label: if (Pmode == SImode) { emit_insn (gen_movsi_const (pic, operands[1])); - emit_insn (gen_ptrel_si (tr, pic, lab)); + emit_insn (gen_ptrel_si (tr, pic, copy_rtx (lab))); } else { emit_insn (gen_movdi_const (pic, operands[1])); - emit_insn (gen_ptrel_di (tr, pic, lab)); + emit_insn (gen_ptrel_di (tr, pic, copy_rtx (lab))); } insn = emit_move_insn (operands[0], tr); diff --git a/gcc/genemit.c b/gcc/genemit.c index 79db84e7b30..a1ebcf68cd7 100644 --- a/gcc/genemit.c +++ b/gcc/genemit.c @@ -428,15 +428,18 @@ gen_insn (rtx insn, int lineno) } else { + char *used = XCNEWVEC (char, operands); + printf (" return gen_rtx_PARALLEL (VOIDmode, gen_rtvec (%d", XVECLEN (insn, 1)); for (i = 0; i < XVECLEN (insn, 1); i++) { printf (",\n\t\t"); - gen_exp (XVECEXP (insn, 1, i), DEFINE_INSN, NULL); + gen_exp (XVECEXP (insn, 1, i), DEFINE_INSN, used); } printf ("));\n}\n\n"); + XDELETEVEC (used); } } @@ -447,6 +450,7 @@ gen_expand (rtx expand) { int operands; int i; + char *used; if (strlen (XSTR (expand, 0)) == 0) fatal ("define_expand lacks a name"); @@ -530,6 +534,8 @@ gen_expand (rtx expand) Use emit_insn to add them to the sequence being accumulated. But don't do this if the user's code has set `no_more' nonzero. */ + used = XCNEWVEC (char, operands); + for (i = 0; i < XVECLEN (expand, 1); i++) { rtx next = XVECEXP (expand, 1, i); @@ -560,13 +566,15 @@ gen_expand (rtx expand) printf (" emit ("); else printf (" emit_insn ("); - gen_exp (next, DEFINE_EXPAND, NULL); + gen_exp (next, DEFINE_EXPAND, used); printf (");\n"); if (GET_CODE (next) == SET && GET_CODE (SET_DEST (next)) == PC && GET_CODE (SET_SRC (next)) == LABEL_REF) printf (" emit_barrier ();"); } + XDELETEVEC (used); + /* Call `get_insns' to extract the list of all the insns emitted within this gen_... function. */ diff --git a/gcc/reorg.c b/gcc/reorg.c index 8c097dca412..dc3ce40bbf8 100644 --- a/gcc/reorg.c +++ b/gcc/reorg.c @@ -513,7 +513,7 @@ emit_delay_sequence (rtx insn, rtx list, int length) for (li = list; li; li = XEXP (li, 1), i++) { - rtx tem = XEXP (li, 0); + rtx tem = copy_rtx (XEXP (li, 0)); rtx note, next; /* Show that this copy of the insn isn't deleted. */ |