[ARM] Fix an invalid check for vectors of the same floating-point constants.
authorMatthew Wahab <matthew.wahab@arm.com>
Fri, 19 Aug 2016 13:59:18 +0000 (13:59 +0000)
committerMatthew Wahab <mwahab@gcc.gnu.org>
Fri, 19 Aug 2016 13:59:18 +0000 (13:59 +0000)
2016-08-19  Matthew Wahab  <matthew.wahab@arm.com>

PR target/77281
* config/arm/arm.c (neon_valid_immediate): Delete declaration.
Use const_vec_duplicate to check for duplicated elements.

From-SVN: r239610

gcc/ChangeLog
gcc/config/arm/arm.c

index c8e8f6544e30ee1077d08f1566c7f5c29ffc7608..a6519b32e88b2c1ddec0b2d67cc1d0b146dae482 100644 (file)
@@ -1,3 +1,9 @@
+2016-08-19  Matthew Wahab  <matthew.wahab@arm.com>
+
+       PR target/77281
+       * config/arm/arm.c (neon_valid_immediate): Delete declaration.
+       Use const_vec_duplicate to check for duplicated elements.
+
 2016-08-19  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/77290
index a6afdcc168c534aeb54d60ba04aefa0b43dee8d0..c1d010cecbc31554c85beb549bb9e8a1df052ffd 100644 (file)
@@ -12471,7 +12471,6 @@ neon_valid_immediate (rtx op, machine_mode mode, int inverse,
   if (GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
     {
       rtx el0 = CONST_VECTOR_ELT (op, 0);
-      const REAL_VALUE_TYPE *r0;
 
       if (!vfp3_const_double_rtx (el0) && el0 != CONST0_RTX (GET_MODE (el0)))
         return -1;
@@ -12480,14 +12479,10 @@ neon_valid_immediate (rtx op, machine_mode mode, int inverse,
       if (GET_MODE_INNER (mode) == HFmode)
        return -1;
 
-      r0 = CONST_DOUBLE_REAL_VALUE (el0);
-
-      for (i = 1; i < n_elts; i++)
-        {
-          rtx elt = CONST_VECTOR_ELT (op, i);
-          if (!real_equal (r0, CONST_DOUBLE_REAL_VALUE (elt)))
-            return -1;
-        }
+      /* All elements in the vector must be the same.  Note that 0.0 and -0.0
+        are distinct in this context.  */
+      if (!const_vec_duplicate_p (op))
+       return -1;
 
       if (modconst)
         *modconst = CONST_VECTOR_ELT (op, 0);