LRA: Revert "Remove useless move insns"
authorH.J. Lu <hongjiu.lu@intel.com>
Sun, 21 Apr 2019 18:23:00 +0000 (18:23 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Sun, 21 Apr 2019 18:23:00 +0000 (11:23 -0700)
Useless move insn removal was added to LRA just to avoid wasting CPU
cycles on such insn processing afterwards.  Such insns are removed
anyway later in the pass pipeline.  The CPU time savings are tiny but
the removal creates too many problems including PR target/90178.
Vladimir pre-approved the patch to remove the code:

https://gcc.gnu.org/ml/gcc-patches/2019-04/msg00834.html

gcc/

PR target/90178
Revert:
2018-11-21  Uros Bizjak  <ubizjak@gmail.com>

Revert the revert:
2013-10-26  Vladimir Makarov  <vmakarov@redhat.com>

Revert:
2013-10-25  Vladimir Makarov  <vmakarov@redhat.com>

* lra-spills.c (lra_final_code_change): Remove useless move insns.

gcc/testsuite/

PR target/90178
* gcc.target/i386/pr90178.c: New test.

From-SVN: r270484

gcc/ChangeLog
gcc/lra-spills.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr90178.c [new file with mode: 0644]

index 8b09eecfbfe725e2a60561d5083425457c6677c1..d2446815605357952c6fce76e4290c465efcb51c 100644 (file)
@@ -1,3 +1,17 @@
+2019-04-21  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/90178
+       Revert:
+       2018-11-21  Uros Bizjak  <ubizjak@gmail.com>
+
+       Revert the revert:
+       2013-10-26  Vladimir Makarov  <vmakarov@redhat.com>
+
+       Revert:
+       2013-10-25  Vladimir Makarov  <vmakarov@redhat.com>
+
+       * lra-spills.c (lra_final_code_change): Remove useless move insns.
+
 2019-04-21  Iain Sandoe  <iain@sandoe.co.uk>
 
        * config/rs6000/rs6000.md (group_end_nop): Emit insn register
index c19b76a579cf7285096031db1801059c6d578c7a..18db79e70a08ca36c77de6c8d1ba1bfd0572a1b5 100644 (file)
@@ -740,7 +740,6 @@ lra_final_code_change (void)
   int i, hard_regno;
   basic_block bb;
   rtx_insn *insn, *curr;
-  rtx set;
   int max_regno = max_reg_num ();
 
   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
@@ -819,19 +818,5 @@ lra_final_code_change (void)
              }
          if (insn_change_p)
            lra_update_operator_dups (id);
-
-         if ((set = single_set (insn)) != NULL
-             && REG_P (SET_SRC (set)) && REG_P (SET_DEST (set))
-             && REGNO (SET_SRC (set)) == REGNO (SET_DEST (set)))
-           {
-             /* Remove an useless move insn.  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);
-           }
        }
 }
index ee1281e6cabba7a51f930e5dcf19f5713176196a..983382492f0837a39cd47dec7a77d9188990fc65 100644 (file)
@@ -1,3 +1,8 @@
+2019-04-21  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/90178
+       * gcc.target/i386/pr90178.c: New test.
+
 2019-04-20  Sandra Loosemore  <sandra@codesourcery.com>
 
        * g++.dg/ipa/pr89009.C: Add dg-require-effective-target fpic.
diff --git a/gcc/testsuite/gcc.target/i386/pr90178.c b/gcc/testsuite/gcc.target/i386/pr90178.c
new file mode 100644 (file)
index 0000000..1df36af
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx -mvzeroupper" } */
+
+int*
+find_ptr (int* mem, int sz, int val)
+{
+  for (int i = 0; i < sz; i++)
+    if (mem[i] == val) 
+      return &mem[i];
+  return 0;
+}
+
+/* { dg-final { scan-assembler-times "xorl\[\\t \]*\\\%eax,\[\\t \]*%eax" 1 } } */