diff options
author | amylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-03-11 13:28:55 +0000 |
---|---|---|
committer | amylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-03-11 13:28:55 +0000 |
commit | c2e1efd7451630b50a7dfe81c26c82e206107b32 (patch) | |
tree | 46f9d0495caaa9b9462960a85495a05e0c7fad55 /gcc/loop.c | |
parent | 9a3005480c23a6bead3070a4247ad63ed9b1be6f (diff) | |
download | ppe42-gcc-c2e1efd7451630b50a7dfe81c26c82e206107b32.tar.gz ppe42-gcc-c2e1efd7451630b50a7dfe81c26c82e206107b32.zip |
* loop.c (strength_reduce): Don't do biv increment -> DEST_REG giv
conversion if we don't know the lifetime.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@25702 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/loop.c')
-rw-r--r-- | gcc/loop.c | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/gcc/loop.c b/gcc/loop.c index c5666f97e40..a2023b22d19 100644 --- a/gcc/loop.c +++ b/gcc/loop.c @@ -4198,13 +4198,46 @@ strength_reduce (scan_start, end, loop_top, insn_count, VARRAY_GROW (may_not_optimize, nregs); } - validate_change (v->insn, &SET_DEST (set), dest_reg, 1); - validate_change (next->insn, next->location, add_val, 1); - if (! apply_change_group ()) + if (! validate_change (next->insn, next->location, add_val, 0)) { vp = &v->next_iv; continue; } + + /* Here we can try to eliminate the increment by combining + it into the uses. */ + + /* Set last_use_insn so that we can check against it. */ + + for (last_use_insn = v->insn, p = NEXT_INSN (v->insn); + p != next->insn; + p = next_insn_in_loop (p, scan_start, end, loop_top)) + { + rtx note; + + if (GET_RTX_CLASS (GET_CODE (p)) != 'i') + continue; + if (reg_mentioned_p (old_reg, PATTERN (p))) + { + last_use_insn = p; + } + } + + /* If we can't get the LUIDs for the insns, we can't + calculate the lifetime. This is likely from unrolling + of an inner loop, so there is little point in making this + a DEST_REG giv anyways. */ + if (INSN_UID (v->insn) >= max_uid_for_loop + || INSN_UID (last_use_insn) >= max_uid_for_loop + || ! validate_change (v->insn, &SET_DEST (set), dest_reg, 0)) + { + /* Change the increment at NEXT back to what it was. */ + if (! validate_change (next->insn, next->location, + next->add_val, 0)) + abort (); + vp = &v->next_iv; + continue; + } next->add_val = add_val; v->dest_reg = dest_reg; v->giv_type = DEST_REG; |