aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2019-03-22 18:14:56 +0000
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2019-03-22 18:14:56 +0000
commit8ad3fc647575d6da22e0c084b4c46e18c64e8af2 (patch)
tree01b0c27a53f6ad772155a05def557b35f3fe3768 /gcc/config
parent74fde7b56ae08b23046a3e0b07685e453b2c6938 (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.h2
-rw-r--r--gcc/config/mips/mips.c24
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