re PR target/82703 (Wrong addition of std::array components with -O2 -ftree-loop...
authorJakub Jelinek <jakub@redhat.com>
Fri, 27 Oct 2017 12:20:55 +0000 (14:20 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 27 Oct 2017 12:20:55 +0000 (14:20 +0200)
PR target/82703
* config/i386/i386-protos.h (maybe_get_pool_constant): Removed.
* config/i386/i386.c (maybe_get_pool_constant): Removed.
(ix86_split_to_parts): Use avoid_constant_pool_reference instead of
maybe_get_pool_constant.
* config/i386/predicates.md (zero_extended_scalar_load_operand):
Likewise.

* gcc.dg/pr82703.c: New test.

From-SVN: r254145

gcc/ChangeLog
gcc/config/i386/i386-protos.h
gcc/config/i386/i386.c
gcc/config/i386/predicates.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr82703.c [new file with mode: 0644]

index fb8ef611502ede61334416a61a9f1ca162ba7eef..cdfc0025c6369b62310159fc56ce2d10462362d4 100644 (file)
@@ -1,3 +1,13 @@
+2017-10-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/82703
+       * config/i386/i386-protos.h (maybe_get_pool_constant): Removed.
+       * config/i386/i386.c (maybe_get_pool_constant): Removed.
+       (ix86_split_to_parts): Use avoid_constant_pool_reference instead of
+       maybe_get_pool_constant.
+       * config/i386/predicates.md (zero_extended_scalar_load_operand):
+       Likewise.
+
 2017-10-27  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * doc/install.texi (Specific, i?86-*-solaris2.10): Simplify gas
index c94cccdfbcaf15d72310dd905a4c3ae18b4b9710..aaed0b747cff489b29afe5fae2ce3d08eb113b46 100644 (file)
@@ -277,8 +277,6 @@ extern bool i386_pe_type_dllexport_p (tree);
 
 extern int i386_pe_reloc_rw_mask (void);
 
-extern rtx maybe_get_pool_constant (rtx);
-
 extern char internal_label_prefix[16];
 extern int internal_label_prefix_len;
 
index 1facf121987c9d8b21cdf4a513ecfe66be4c9060..6ee6abea258d8cb380392a3227c537244f71f4c8 100644 (file)
@@ -19211,20 +19211,6 @@ ix86_expand_clear (rtx dest)
   emit_insn (tmp);
 }
 
-/* X is an unchanging MEM.  If it is a constant pool reference, return
-   the constant pool rtx, else NULL.  */
-
-rtx
-maybe_get_pool_constant (rtx x)
-{
-  x = ix86_delegitimize_address (XEXP (x, 0));
-
-  if (GET_CODE (x) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (x))
-    return get_pool_constant (x);
-
-  return NULL_RTX;
-}
-
 void
 ix86_expand_move (machine_mode mode, rtx operands[])
 {
@@ -24832,11 +24818,7 @@ ix86_split_to_parts (rtx operand, rtx *parts, machine_mode mode)
   /* Optimize constant pool reference to immediates.  This is used by fp
      moves, that force all constants to memory to allow combining.  */
   if (MEM_P (operand) && MEM_READONLY_P (operand))
-    {
-      rtx tmp = maybe_get_pool_constant (operand);
-      if (tmp)
-       operand = tmp;
-    }
+    operand = avoid_constant_pool_reference (operand);
 
   if (MEM_P (operand) && !offsettable_memref_p (operand))
     {
index c46dd5c83e324e110d9d7867e1a79814351e54f4..89df15ac55cc2b9fec5ea54cc06bae114b5738d3 100644 (file)
   (match_code "mem")
 {
   unsigned n_elts;
-  op = maybe_get_pool_constant (op);
+  op = avoid_constant_pool_reference (op);
 
-  if (!(op && GET_CODE (op) == CONST_VECTOR))
+  if (GET_CODE (op) != CONST_VECTOR)
     return false;
 
   n_elts = CONST_VECTOR_NUNITS (op);
index bdbe863dd9c4763c41e645849e10fc8bcaefd615..6cd76b40b96121e65f67747b1d8020c58e32f8f1 100644 (file)
@@ -1,3 +1,8 @@
+2017-10-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/82703
+       * gcc.dg/pr82703.c: New test.
+
 2017-10-27  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>
 
        * gcc.dg/ipa/propmalloc-1.c: New test-case.
diff --git a/gcc/testsuite/gcc.dg/pr82703.c b/gcc/testsuite/gcc.dg/pr82703.c
new file mode 100644 (file)
index 0000000..0bd2f91
--- /dev/null
@@ -0,0 +1,28 @@
+/* PR target/82703 */
+/* { dg-do run } */
+/* { dg-options "-O2 -fno-tree-sra -ftree-vectorize" } */
+
+__attribute__((noinline, noclone)) void
+compare (const double *p, const double *q)
+{
+  for (int i = 0; i < 3; ++i)
+    if (p[i] != q[i])
+      __builtin_abort ();
+}
+
+double vr[3] = { 4, 4, 4 };
+
+int
+main ()
+{
+  double v1[3] = { 1, 2, 3 };
+  double v2[3] = { 3, 2, 1 };
+  double v3[3];
+  __builtin_memcpy (v3, v1, sizeof (v1));
+  for (int i = 0; i < 3; ++i)
+    v3[i] += v2[i];
+  for (int i = 0; i < 3; ++i)
+    v1[i] += v2[i];
+  compare (v3, vr);
+  return 0;
+}