lra-spills.c (lra_final_code_change): Remove useless move insns originated from moves...
authorVladimir Makarov <vmakarov@redhat.com>
Mon, 28 Oct 2013 23:15:12 +0000 (23:15 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Mon, 28 Oct 2013 23:15:12 +0000 (23:15 +0000)
2013-10-28  Vladimir Makarov  <vmakarov@redhat.com>

* lra-spills.c (lra_final_code_change): Remove useless move insns
originated from moves of pseudos.

From-SVN: r204140

gcc/ChangeLog
gcc/lra-spills.c

index 013fe7399a75fc20294e64ccbc17cd8ee7f12c4f..70193b49d13be1313eb3d64859362f2fc1696da3 100644 (file)
@@ -1,3 +1,8 @@
+2013-10-28  Vladimir Makarov  <vmakarov@redhat.com>
+
+       * lra-spills.c (lra_final_code_change): Remove useless move insns
+       originated from moves of pseudos.
+
 2013-10-28  Jeff Law  <law@redhat.com>
 
        * lower-subreg.c (resolve_simple_move): Fix comment typo.
index 7c0c630273dfc92da99002331b1935f9b3ac6e98..7690fbc0ab1bd1f192445dcd554461359f758d16 100644 (file)
@@ -625,7 +625,7 @@ lra_final_code_change (void)
 {
   int i, hard_regno;
   basic_block bb;
-  rtx insn, curr;
+  rtx insn, curr, set;
   int max_regno = max_reg_num ();
 
   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
@@ -636,6 +636,7 @@ lra_final_code_change (void)
     FOR_BB_INSNS_SAFE (bb, insn, curr)
       if (INSN_P (insn))
        {
+         bool change_p;
          rtx pat = PATTERN (insn);
 
          if (GET_CODE (pat) == CLOBBER && LRA_TEMP_CLOBBER_P (pat))
@@ -648,6 +649,12 @@ lra_final_code_change (void)
              continue;
            }
 
+         set = single_set (insn);
+         change_p = (set != NULL
+                     && REG_P (SET_SRC (set)) && REG_P (SET_DEST (set))
+                     && REGNO (SET_SRC (set)) >= FIRST_PSEUDO_REGISTER
+                     && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER);
+         
          lra_insn_recog_data_t id = lra_get_insn_recog_data (insn);
          struct lra_static_insn_data *static_id = id->insn_static_data;
          bool insn_change_p = false;
@@ -661,5 +668,20 @@ lra_final_code_change (void)
              }
          if (insn_change_p)
            lra_update_operator_dups (id);
+
+         if (change_p && REGNO (SET_SRC (set)) == REGNO (SET_DEST (set)))
+           {
+             /* Remove an useless move insn but only involving
+                pseudos as some subsequent optimizations are based on
+                that move insns involving originally hard registers
+                are preserved.  IRA can generate move insns involving
+                pseudos.  It is better remove them earlier to speed
+                up compiler a bit.  It is also better to do it here
+                as they might not pass final RTL check in LRA,
+                (e.g. insn moving a control register into
+                itself).  */
+             lra_invalidate_insn_data (insn);
+             delete_insn (insn);
+           }
        }
 }