diff options
author | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 2019-03-22 18:14:56 +0000 |
---|---|---|
committer | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 2019-03-22 18:14:56 +0000 |
commit | 8ad3fc647575d6da22e0c084b4c46e18c64e8af2 (patch) | |
tree | 01b0c27a53f6ad772155a05def557b35f3fe3768 /gcc/config | |
parent | 74fde7b56ae08b23046a3e0b07685e453b2c6938 (diff) |
PR rtl-optimization/87761
* config/mips/mips-protos.h (mips_split_move): Add new argument.
(mips_emit_move_or_split): Pass NULL for INSN into mips_split_move.
(mips_split_move): Accept new INSN argument. Try to forward SRC
into the next instruction.
(mips_split_move_insn): Pass INSN through to mips_split_move.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@269880 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/mips/mips-protos.h | 2 | ||||
-rw-r--r-- | gcc/config/mips/mips.c | 24 |
2 files changed, 21 insertions, 5 deletions
diff --git a/gcc/config/mips/mips-protos.h b/gcc/config/mips/mips-protos.h index 64afb350fb7..32070fdb8c9 100644 --- a/gcc/config/mips/mips-protos.h +++ b/gcc/config/mips/mips-protos.h @@ -214,7 +214,7 @@ extern bool mips_legitimize_move (machine_mode, rtx, rtx); extern rtx mips_subword (rtx, bool); extern bool mips_split_move_p (rtx, rtx, enum mips_split_type); -extern void mips_split_move (rtx, rtx, enum mips_split_type); +extern void mips_split_move (rtx, rtx, enum mips_split_type, rtx); extern bool mips_split_move_insn_p (rtx, rtx, rtx); extern void mips_split_move_insn (rtx, rtx, rtx); extern void mips_split_128bit_move (rtx, rtx); diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index 48f324410b9..1de33b28c38 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -3031,7 +3031,7 @@ static void mips_emit_move_or_split (rtx dest, rtx src, enum mips_split_type split_type) { if (mips_split_move_p (dest, src, split_type)) - mips_split_move (dest, src, split_type); + mips_split_move (dest, src, split_type, NULL); else mips_emit_move (dest, src); } @@ -4780,10 +4780,11 @@ mips_split_move_p (rtx dest, rtx src, enum mips_split_type split_type) } /* Split a move from SRC to DEST, given that mips_split_move_p holds. - SPLIT_TYPE describes the split condition. */ + SPLIT_TYPE describes the split condition. INSN is the insn being + split, if we know it, NULL otherwise. */ void -mips_split_move (rtx dest, rtx src, enum mips_split_type split_type) +mips_split_move (rtx dest, rtx src, enum mips_split_type split_type, rtx insn_) { rtx low_dest; @@ -4843,6 +4844,21 @@ mips_split_move (rtx dest, rtx src, enum mips_split_type split_type) mips_emit_move (mips_subword (dest, true), mips_subword (src, true)); } } + + /* This is a hack. See if the next insn uses DEST and if so, see if we + can forward SRC for DEST. This is most useful if the next insn is a + simple store. */ + rtx_insn *insn = (rtx_insn *)insn_; + if (insn) + { + rtx_insn *next = next_nonnote_nondebug_insn_bb (insn); + if (next) + { + rtx set = single_set (next); + if (set && SET_SRC (set) == dest) + validate_change (next, &SET_SRC (set), src, false); + } + } } /* Return the split type for instruction INSN. */ @@ -5070,7 +5086,7 @@ mips_split_move_insn_p (rtx dest, rtx src, rtx insn) void mips_split_move_insn (rtx dest, rtx src, rtx insn) { - mips_split_move (dest, src, mips_insn_split_type (insn)); + mips_split_move (dest, src, mips_insn_split_type (insn), insn); } /* Return the appropriate instructions to move SRC into DEST. Assume |