aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChenghua Xu <paul.hua.gm@gmail.com>2019-05-14 01:42:59 +0000
committerChenghua Xu <paulhua@gcc.gnu.org>2019-05-14 01:42:59 +0000
commit4dbf3a15f1b6afa0100c1b026ba13450677931c9 (patch)
tree64a03a5da9de3572124abc3145f9a94a6c8bf0c0
parent98aaa1a633cf3a79fa281a383c12fc45b313e824 (diff)
downloadgcc-4dbf3a15f1b6afa0100c1b026ba13450677931c9.zip
gcc-4dbf3a15f1b6afa0100c1b026ba13450677931c9.tar.gz
gcc-4dbf3a15f1b6afa0100c1b026ba13450677931c9.tar.bz2
[MIPS] Skip forward src into next insn when the SRC reg is dead.
PR target/90357 gcc/ * config/mips/mips.c (mips_split_move): Skip forward SRC into next insn when the SRC reg is dead. From-SVN: r271146
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/mips/mips.c13
2 files changed, 18 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0985651..db8f647 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2019-05-14 Chenghua Xu <paul.hua.gm@gmail.com>
+
+ PR target/90357
+ * config/mips/mips.c (mips_split_move): Skip forward SRC into
+ next insn when the SRC reg is dead.
+
2019-05-14 Bin Cheng <bin.cheng@linux.alibaba.com>
* gimple-ssa-strength-reduction.c (lookup_cand): Adjust index by 1.
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index 1de33b2..89fc073 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -4849,6 +4849,7 @@ mips_split_move (rtx dest, rtx src, enum mips_split_type split_type, rtx insn_)
can forward SRC for DEST. This is most useful if the next insn is a
simple store. */
rtx_insn *insn = (rtx_insn *)insn_;
+ struct mips_address_info addr;
if (insn)
{
rtx_insn *next = next_nonnote_nondebug_insn_bb (insn);
@@ -4856,7 +4857,17 @@ mips_split_move (rtx dest, rtx src, enum mips_split_type split_type, rtx insn_)
{
rtx set = single_set (next);
if (set && SET_SRC (set) == dest)
- validate_change (next, &SET_SRC (set), src, false);
+ {
+ if (MEM_P (src))
+ {
+ rtx tmp = XEXP (src, 0);
+ mips_classify_address (&addr, tmp, GET_MODE (tmp), true);
+ if (REGNO (addr.reg) != REGNO (dest))
+ validate_change (next, &SET_SRC (set), src, false);
+ }
+ else
+ validate_change (next, &SET_SRC (set), src, false);
+ }
}
}
}