diff options
author | Kyrylo Tkachov <kyrylo.tkachov@arm.com> | 2015-10-26 11:51:47 +0000 |
---|---|---|
committer | Kyrylo Tkachov <ktkachov@gcc.gnu.org> | 2015-10-26 11:51:47 +0000 |
commit | 477ee35f51115282b8eb56c0077e197f282b765e (patch) | |
tree | e702335a62f4be984b0bf9854ee92d56ae1c5767 /gcc/auto-inc-dec.c | |
parent | a2667f14a89bc5492f51ff0ee794ee75d8068f43 (diff) | |
download | gcc-477ee35f51115282b8eb56c0077e197f282b765e.zip gcc-477ee35f51115282b8eb56c0077e197f282b765e.tar.gz gcc-477ee35f51115282b8eb56c0077e197f282b765e.tar.bz2 |
[auto-inc-dec.c] Account for cost of move operation in FORM_PRE_ADD and FORM_POST_ADD cases
* auto-inc-dec.c (insert_move_insn_before): Delete.
(attempt_change): Remember to cost the simple move in the
FORM_PRE_ADD and FORM_POST_ADD cases.
From-SVN: r229344
Diffstat (limited to 'gcc/auto-inc-dec.c')
-rw-r--r-- | gcc/auto-inc-dec.c | 39 |
1 files changed, 17 insertions, 22 deletions
diff --git a/gcc/auto-inc-dec.c b/gcc/auto-inc-dec.c index e003b13..9f7c8e0 100644 --- a/gcc/auto-inc-dec.c +++ b/gcc/auto-inc-dec.c @@ -439,24 +439,6 @@ move_dead_notes (rtx_insn *to_insn, rtx_insn *from_insn, rtx pattern) } } - -/* Create a mov insn DEST_REG <- SRC_REG and insert it before - NEXT_INSN. */ - -static rtx_insn * -insert_move_insn_before (rtx_insn *next_insn, rtx dest_reg, rtx src_reg) -{ - rtx_insn *insns; - - start_sequence (); - emit_move_insn (dest_reg, src_reg); - insns = get_insns (); - end_sequence (); - emit_insn_before (insns, next_insn); - return insns; -} - - /* Change mem_insn.mem_loc so that uses NEW_ADDR which has an increment of INC_REG. To have reached this point, the change is a legitimate one from a dataflow point of view. The only questions @@ -490,8 +472,21 @@ attempt_change (rtx new_addr, rtx inc_reg) old_cost = (set_src_cost (mem, mode, speed) + set_rtx_cost (PATTERN (inc_insn.insn), speed)); + new_cost = set_src_cost (mem_tmp, mode, speed); + /* In the FORM_PRE_ADD and FORM_POST_ADD cases we emit an extra move + whose cost we should account for. */ + if (inc_insn.form == FORM_PRE_ADD + || inc_insn.form == FORM_POST_ADD) + { + start_sequence (); + emit_move_insn (inc_insn.reg_res, inc_insn.reg0); + mov_insn = get_insns (); + end_sequence (); + new_cost += seq_cost (mov_insn, speed); + } + /* The first item of business is to see if this is profitable. */ if (old_cost < new_cost) { @@ -522,8 +517,8 @@ attempt_change (rtx new_addr, rtx inc_reg) /* Replace the addition with a move. Do it at the location of the addition since the operand of the addition may change before the memory reference. */ - mov_insn = insert_move_insn_before (inc_insn.insn, - inc_insn.reg_res, inc_insn.reg0); + gcc_assert (mov_insn); + emit_insn_before (mov_insn, inc_insn.insn); move_dead_notes (mov_insn, inc_insn.insn, inc_insn.reg0); regno = REGNO (inc_insn.reg_res); @@ -548,8 +543,8 @@ attempt_change (rtx new_addr, rtx inc_reg) break; case FORM_POST_ADD: - mov_insn = insert_move_insn_before (mem_insn.insn, - inc_insn.reg_res, inc_insn.reg0); + gcc_assert (mov_insn); + emit_insn_before (mov_insn, mem_insn.insn); move_dead_notes (mov_insn, inc_insn.insn, inc_insn.reg0); /* Do not move anything to the mov insn because the instruction |