re PR tree-optimization/63605 (wrong code at -O3 on x86_64-linux-gnu)
authorRichard Biener <rguenther@suse.de>
Fri, 7 Nov 2014 20:57:01 +0000 (20:57 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 7 Nov 2014 20:57:01 +0000 (20:57 +0000)
2014-11-07  Richard Biener  <rguenther@suse.de>

PR tree-optimization/63605
* fold-const.c (fold_binary_loc): Properly use element_precision
for types that may not be scalar.

* gcc.dg/vect/pr63605.c: New testcase.

From-SVN: r217238

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/pr63605.c [new file with mode: 0644]

index eb5d793f1bebc9a628b07d95e253d8e3affe1b1e..966c0b449cb6b22b77dc4d71033060e250e32927 100644 (file)
@@ -1,3 +1,9 @@
+2014-11-07  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/63605
+       * fold-const.c (fold_binary_loc): Properly use element_precision
+       for types that may not be scalar.
+
 2014-11-07  Evgeny Stupachenko  <evstupac@gmail.com>
 
        PR target/63534
index cff9c106f1e969967c05d0b9048f99d8d71f6745..c712213444c08e11b6b3bfec6c864051754b4d7a 100644 (file)
@@ -12817,7 +12817,7 @@ fold_binary_loc (location_t loc,
          tree arg00 = TREE_OPERAND (arg0, 0);
          tree arg01 = TREE_OPERAND (arg0, 1);
          tree itype = TREE_TYPE (arg00);
-         if (wi::eq_p (arg01, TYPE_PRECISION (itype) - 1))
+         if (wi::eq_p (arg01, element_precision (itype) - 1))
            {
              if (TYPE_UNSIGNED (itype))
                {
index 52ff7effc670b8efaf648a17a2aec572337250c6..ba9df2cfb2875f414729988fec3024b285a40c02 100644 (file)
@@ -1,3 +1,8 @@
+2014-11-07  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/63605
+       * gcc.dg/vect/pr63605.c: New testcase.
+
 2014-11-07  Jeff Law  <law@redhat.com>
 
        * g++.dg/pr61289-2.C: Renamed from pr61289-2.c.
diff --git a/gcc/testsuite/gcc.dg/vect/pr63605.c b/gcc/testsuite/gcc.dg/vect/pr63605.c
new file mode 100644 (file)
index 0000000..5096c72
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do run } */
+
+#include "tree-vect.h"
+
+extern void abort (void);
+
+int a, b[8] = { 2, 0, 0, 0, 0, 0, 0, 0 }, c[8];
+
+int
+main ()
+{
+  int d;
+  check_vect ();
+  for (; a < 8; a++)
+    {
+      d = b[a] >> 1;
+      c[a] = d != 0;
+    }
+  if (c[0] != 1)
+    abort ();
+  return 0;
+}