[MIPS] Skip forward src into next insn when the SRC reg is dead.
authorChenghua Xu <paul.hua.gm@gmail.com>
Tue, 14 May 2019 01:42:59 +0000 (01:42 +0000)
committerChenghua Xu <paulhua@gcc.gnu.org>
Tue, 14 May 2019 01:42:59 +0000 (01:42 +0000)
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

gcc/ChangeLog
gcc/config/mips/mips.c

index 0985651503a3ca8a1982de78280d31830d4d36f6..db8f647ec78d89707a0e0507618946db6035e380 100644 (file)
@@ -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.
index 1de33b28c385d32263a687d2b8ae66b7993a861a..89fc073c62bb72e05c025c801a7b1f944983fb7c 100644 (file)
@@ -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);
+           }
        }
     }
 }