summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>2001-08-05 16:36:05 +0000
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>2001-08-05 16:36:05 +0000
commit50473320fe1861af5cb6ac66efa4755576acbb48 (patch)
tree95b1d1bd5645800bc70f898bec111d9fceba0965
parent3d0f529a751c2aa36797e62be6922afdf49ee9d3 (diff)
downloadgcc-50473320fe1861af5cb6ac66efa4755576acbb48.tar.gz
Add missing REG_INC notes.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@44646 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/ia64/ia64.c28
-rw-r--r--gcc/config/ia64/ia64.md16
3 files changed, 40 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 15b9b671bcd..5cd75a5dad4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -6,6 +6,12 @@
* alias.c (rtx_equal_for_memref_p): VALUEs are only identical
if their CSELIB_VAL_PTRs are.
+ * config/ia64/ia64.c (struct spill_fill_data): New member prev_insn.
+ (setup_spill_pointers): Initialize it.
+ (spill_restore_mem): Set it.
+ (do_spill, do_restore): Use it to add REG_INC note.
+ * config/ia64/ia64.md (movti_internal): Add REG_INC notes as needed.
+
2001-08-04 Hans-Peter Nilsson <hp@bitrange.com>
* config/sh/sh.c (sh_asm_named_section): Fix typo in align
diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c
index be2c04dfae3..0b516138fc4 100644
--- a/gcc/config/ia64/ia64.c
+++ b/gcc/config/ia64/ia64.c
@@ -1621,6 +1621,7 @@ struct spill_fill_data
rtx init_reg[2]; /* initial base register */
rtx iter_reg[2]; /* the iterator registers */
rtx *prev_addr[2]; /* address of last memory use */
+ rtx prev_insn[2]; /* the insn corresponding to prev_addr */
HOST_WIDE_INT prev_off[2]; /* last offset */
int n_iter; /* number of iterators in use */
int next_iter; /* next iterator to use */
@@ -1642,6 +1643,8 @@ setup_spill_pointers (n_spills, init_reg, cfa_off)
spill_fill_data.init_reg[1] = init_reg;
spill_fill_data.prev_addr[0] = NULL;
spill_fill_data.prev_addr[1] = NULL;
+ spill_fill_data.prev_insn[0] = NULL;
+ spill_fill_data.prev_insn[1] = NULL;
spill_fill_data.prev_off[0] = cfa_off;
spill_fill_data.prev_off[1] = cfa_off;
spill_fill_data.next_iter = 0;
@@ -1675,11 +1678,16 @@ spill_restore_mem (reg, cfa_off)
if (spill_fill_data.prev_addr[iter])
{
if (CONST_OK_FOR_N (disp))
- *spill_fill_data.prev_addr[iter]
- = gen_rtx_POST_MODIFY (DImode, spill_fill_data.iter_reg[iter],
- gen_rtx_PLUS (DImode,
- spill_fill_data.iter_reg[iter],
- disp_rtx));
+ {
+ *spill_fill_data.prev_addr[iter]
+ = gen_rtx_POST_MODIFY (DImode, spill_fill_data.iter_reg[iter],
+ gen_rtx_PLUS (DImode,
+ spill_fill_data.iter_reg[iter],
+ disp_rtx));
+ REG_NOTES (spill_fill_data.prev_insn[iter])
+ = gen_rtx_EXPR_LIST (REG_INC, spill_fill_data.iter_reg[iter],
+ REG_NOTES (spill_fill_data.prev_insn[iter]));
+ }
else
{
/* ??? Could use register post_modify for loads. */
@@ -1769,10 +1777,12 @@ do_spill (move_fn, reg, cfa_off, frame_reg)
rtx reg, frame_reg;
HOST_WIDE_INT cfa_off;
{
+ int iter = spill_fill_data.next_iter;
rtx mem, insn;
mem = spill_restore_mem (reg, cfa_off);
insn = emit_insn ((*move_fn) (mem, reg, GEN_INT (cfa_off)));
+ spill_fill_data.prev_insn[iter] = insn;
if (frame_reg)
{
@@ -1812,8 +1822,12 @@ do_restore (move_fn, reg, cfa_off)
rtx reg;
HOST_WIDE_INT cfa_off;
{
- emit_insn ((*move_fn) (reg, spill_restore_mem (reg, cfa_off),
- GEN_INT (cfa_off)));
+ int iter = spill_fill_data.next_iter;
+ rtx insn;
+
+ insn = emit_insn ((*move_fn) (reg, spill_restore_mem (reg, cfa_off),
+ GEN_INT (cfa_off)));
+ spill_fill_data.prev_insn[iter] = insn;
}
/* Wrapper functions that discards the CONST_INT spill offset. These
diff --git a/gcc/config/ia64/ia64.md b/gcc/config/ia64/ia64.md
index 6d1821f012c..f40cc404229 100644
--- a/gcc/config/ia64/ia64.md
+++ b/gcc/config/ia64/ia64.md
@@ -532,7 +532,7 @@
[(const_int 0)]
"
{
- rtx adj1, adj2, in[2], out[2];
+ rtx adj1, adj2, in[2], out[2], insn;
int first;
adj1 = ia64_split_timode (in, operands[1], operands[2]);
@@ -552,8 +552,18 @@
emit_insn (adj1);
if (adj2)
emit_insn (adj2);
- emit_insn (gen_rtx_SET (VOIDmode, out[first], in[first]));
- emit_insn (gen_rtx_SET (VOIDmode, out[!first], in[!first]));
+ insn = emit_insn (gen_rtx_SET (VOIDmode, out[first], in[first]));
+ if (GET_CODE (out[first]) == MEM
+ && GET_CODE (XEXP (out[first], 0)) == POST_MODIFY)
+ REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_INC,
+ XEXP (XEXP (out[first], 0), 0),
+ REG_NOTES (insn));
+ insn = emit_insn (gen_rtx_SET (VOIDmode, out[!first], in[!first]));
+ if (GET_CODE (out[!first]) == MEM
+ && GET_CODE (XEXP (out[!first], 0)) == POST_MODIFY)
+ REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_INC,
+ XEXP (XEXP (out[!first], 0), 0),
+ REG_NOTES (insn));
DONE;
}"
[(set_attr "itanium_class" "unknown")