re PR target/81572 (gcc-7 regression: unnecessary vector regmove on compare)
authorVladimir Makarov <vmakarov@redhat.com>
Thu, 22 Feb 2018 21:17:51 +0000 (21:17 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Thu, 22 Feb 2018 21:17:51 +0000 (21:17 +0000)
2018-02-22  Vladimir Makarov  <vmakarov@redhat.com>

PR target/81572
* lra-int.h (LRA_UNKNOWN_ALT, LRA_NON_CLOBBERED_ALT): New macros.
* lra.c (lra_set_insn_recog_data, lra_update_insn_recog_data): Use
LRA_UNKNOWN_ALT.
* lra-constraints.c (curr_insn_transform): Set up
LRA_NON_CLOBBERED_ALT for moves processed on the fast path.  Use
LRA_UNKNOWN_ALT.
(remove_inheritance_pseudos): Use LRA_UNKNOWN_ALT.
* lra-eliminations.c (spill_pseudos): Ditto.
(process_insn_for_elimination): Ditto.
* lra-lives.c (reg_early_clobber_p): Use the new macros.
* lra-spills.c (spill_pseudos): Use LRA_UNKNOWN_ALT and
LRA_NON_CLOBBERED_ALT.

2018-02-22  Vladimir Makarov  <vmakarov@redhat.com>

PR target/81572
* gcc.target/powerpc/pr81572.c: New.

From-SVN: r257915

gcc/ChangeLog
gcc/lra-constraints.c
gcc/lra-eliminations.c
gcc/lra-int.h
gcc/lra-lives.c
gcc/lra-spills.c
gcc/lra.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/pr81572.c [new file with mode: 0644]

index 9e737edec021dc21378996c3bed3111c9e0d1ea6..fd0745d297a6760bce2f98310867456dc3d651bc 100644 (file)
@@ -1,3 +1,19 @@
+2018-02-22  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR target/81572
+       * lra-int.h (LRA_UNKNOWN_ALT, LRA_NON_CLOBBERED_ALT): New macros.
+       * lra.c (lra_set_insn_recog_data, lra_update_insn_recog_data): Use
+       LRA_UNKNOWN_ALT.
+       * lra-constraints.c (curr_insn_transform): Set up
+       LRA_NON_CLOBBERED_ALT for moves processed on the fast path.  Use
+       LRA_UNKNOWN_ALT.
+       (remove_inheritance_pseudos): Use LRA_UNKNOWN_ALT.
+       * lra-eliminations.c (spill_pseudos): Ditto.
+       (process_insn_for_elimination): Ditto.
+       * lra-lives.c (reg_early_clobber_p): Use the new macros.
+       * lra-spills.c (spill_pseudos): Use LRA_UNKNOWN_ALT and
+       LRA_NON_CLOBBERED_ALT.
+
 2018-02-22  Martin Sebor  <msebor@redhat.com>
 
        PR tree-optimization/84480
index d730f36fba0fac47ba3c17e01c9f3ffe0a9883c6..59b97540d98fb7d0b040e629893e9cee01f75ad3 100644 (file)
@@ -3730,7 +3730,13 @@ curr_insn_transform (bool check_only_p)
 
   curr_insn_set = single_set (curr_insn);
   if (curr_insn_set != NULL_RTX && simple_move_p ())
-    return false;
+    {
+      /* We assume that the corresponding insn alternative has no
+        earlier clobbers.  If it is not the case, don't define move
+        cost equal to 2 for the corresponding register classes.  */
+      lra_set_used_insn_alternative (curr_insn, LRA_NON_CLOBBERED_ALT);
+      return false;
+    }
 
   no_input_reloads_p = no_output_reloads_p = false;
   goal_alt_number = -1;
@@ -3838,7 +3844,7 @@ curr_insn_transform (bool check_only_p)
   if (change_p)
     /* If we've changed the instruction then any alternative that
        we chose previously may no longer be valid.  */
-    lra_set_used_insn_alternative (curr_insn, -1);
+    lra_set_used_insn_alternative (curr_insn, LRA_UNKNOWN_ALT);
 
   if (! check_only_p && curr_insn_set != NULL_RTX
       && check_and_process_move (&change_p, &sec_mem_p))
@@ -3846,7 +3852,7 @@ curr_insn_transform (bool check_only_p)
 
  try_swapped:
 
-  reused_alternative_num = check_only_p ? -1 : curr_id->used_insn_alternative;
+  reused_alternative_num = check_only_p ? LRA_UNKNOWN_ALT : curr_id->used_insn_alternative;
   if (lra_dump_file != NULL && reused_alternative_num >= 0)
     fprintf (lra_dump_file, "Reusing alternative %d for insn #%u\n",
             reused_alternative_num, INSN_UID (curr_insn));
@@ -6752,7 +6758,7 @@ remove_inheritance_pseudos (bitmap remove_pseudos)
                        }
                      lra_push_insn_and_update_insn_regno_info (curr_insn);
                      lra_set_used_insn_alternative_by_uid
-                       (INSN_UID (curr_insn), -1);
+                       (INSN_UID (curr_insn), LRA_UNKNOWN_ALT);
                      done_p = true;
                      if (lra_dump_file != NULL)
                        {
@@ -6791,7 +6797,7 @@ remove_inheritance_pseudos (bitmap remove_pseudos)
                     constraints pass.  */
                  lra_push_insn_and_update_insn_regno_info (curr_insn);
                  lra_set_used_insn_alternative_by_uid
-                   (INSN_UID (curr_insn), -1);
+                   (INSN_UID (curr_insn), LRA_UNKNOWN_ALT);
                }
              else if (restored_regs_p)
                /* The instruction has been restored to the form that
index 44ad96af38dc32627b29e970a8892e4f57627602..21d8d5f8018d696bf54fc315fc0639e14c1e1760 100644 (file)
@@ -1175,7 +1175,7 @@ spill_pseudos (HARD_REG_SET set)
     if (bitmap_bit_p (&to_process, INSN_UID (insn)))
       {
        lra_push_insn (insn);
-       lra_set_used_insn_alternative (insn, -1);
+       lra_set_used_insn_alternative (insn, LRA_UNKNOWN_ALT);
       }
   bitmap_clear (&to_process);
 }
@@ -1408,7 +1408,7 @@ process_insn_for_elimination (rtx_insn *insn, bool final_p, bool first_p)
        }
       lra_update_insn_regno_info (insn);
       lra_push_insn (insn);
-      lra_set_used_insn_alternative (insn, -1);
+      lra_set_used_insn_alternative (insn, LRA_UNKNOWN_ALT);
     }
 }
 
index 662bc4c14ed61ee368050dc10222c78cccc28f00..03839187cf6109f0c84e98e5be1158302264037e 100644 (file)
@@ -202,15 +202,20 @@ struct lra_static_insn_data
   const struct operand_alternative *operand_alternative;
 };
 
+/* Negative insn alternative numbers used for special cases.  */
+#define LRA_UNKNOWN_ALT -1
+#define LRA_NON_CLOBBERED_ALT -2
+
 /* LRA internal info about an insn (LRA internal insn
    representation).  */
 struct lra_insn_recog_data
 {
   /* The insn code.  */
   int icode;
-  /* The alternative should be used for the insn, -1 if invalid, or we
-     should try to use any alternative, or the insn is a debug
-     insn.  */
+  /* The alternative should be used for the insn, LRA_UNKNOWN_ALT if
+     unknown, or we should assume any alternative, or the insn is a
+     debug insn.  LRA_NON_CLOBBERED_ALT means ignoring any earlier
+     clobbers for the insn.  */
   int used_insn_alternative;
   /* SP offset before the insn relative to one at the func start.  */
   poly_int64 sp_offset;
index 2e53f8774605f5dc81cf6cb8e12645ff8c957b4a..ddc0a9bbcc5176b1fa3d09b6e8df9b9be2e34f1d 100644 (file)
@@ -598,7 +598,9 @@ static inline bool
 reg_early_clobber_p (const struct lra_insn_reg *reg, int n_alt)
 {
   return (reg->early_clobber
-         && (n_alt < 0 || TEST_BIT (reg->early_clobber_alts, n_alt)));
+         && (n_alt == LRA_UNKNOWN_ALT
+             || (n_alt != LRA_NON_CLOBBERED_ALT
+                 && TEST_BIT (reg->early_clobber_alts, n_alt))));
 }
 
 /* Process insns of the basic block BB to update pseudo live ranges,
index 67675d9f1c4c3c82b6f74a809b64d155d55260df..8f6278acae42edabd78f5f188ce627d81e1acedc 100644 (file)
@@ -517,7 +517,7 @@ spill_pseudos (void)
                         INSN_UID (insn));
              lra_push_insn (insn);
              if (lra_reg_spill_p || targetm.different_addr_displacement_p ())
-               lra_set_used_insn_alternative (insn, -1);
+               lra_set_used_insn_alternative (insn, LRA_UNKNOWN_ALT);
            }
          else if (CALL_P (insn)
                   /* Presence of any pseudo in CALL_INSN_FUNCTION_USAGE
index c6feb2630bb38e1c26b1a5de2c75e165d2f2a020..08de09d14dd17c4a159cfe23b5f132333aa9391a 100644 (file)
--- a/gcc/lra.c
+++ b/gcc/lra.c
@@ -958,7 +958,7 @@ lra_set_insn_recog_data (rtx_insn *insn)
   data = XNEW (struct lra_insn_recog_data);
   lra_insn_recog_data[uid] = data;
   data->insn = insn;
-  data->used_insn_alternative = -1;
+  data->used_insn_alternative = LRA_UNKNOWN_ALT;
   data->icode = icode;
   data->regs = NULL;
   if (DEBUG_INSN_P (insn))
@@ -1207,7 +1207,7 @@ lra_update_insn_recog_data (rtx_insn *insn)
       return data;
     }
   insn_static_data = data->insn_static_data;
-  data->used_insn_alternative = -1;
+  data->used_insn_alternative = LRA_UNKNOWN_ALT;
   if (DEBUG_INSN_P (insn))
     return data;
   if (data->icode < 0)
index 2097d800c5efa0c3755e4b65d8d08c451019700d..01ede00ba8549dc946e6781adec46e65a19aea44 100644 (file)
@@ -1,3 +1,8 @@
+2018-02-22  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR target/81572
+       * gcc.target/powerpc/pr81572.c: New.
+
 2018-02-22  Andreas Schwab  <schwab@linux-m68k.org>
 
        * go.test/go-test.exp (go-set-goarch): Recognize riscv64-*-*.
diff --git a/gcc/testsuite/gcc.target/powerpc/pr81572.c b/gcc/testsuite/gcc.target/powerpc/pr81572.c
new file mode 100644 (file)
index 0000000..de00c18
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile { target powerpc64*-*-* } } */
+/* { dg-options "-O2 -mcpu=power7" } */
+/* { dg-final { scan-assembler-not "xxlor" } } */
+
+#include <altivec.h>
+
+typedef __vector unsigned char nvec_t;
+
+long testz_and(nvec_t a, nvec_t b)
+{
+  nvec_t c = vec_andc(a, b);
+  return vec_all_eq(a, c);
+}