The following fixes a bogus folding when applied to vectors.

Bootstrap and regtest pending on x86_64-unknown-linux-gnu.

Richard.

2014-11-07  Richard Biener  <rguent...@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.

Index: gcc/fold-const.c
===================================================================
--- gcc/fold-const.c    (revision 217214)
+++ gcc/fold-const.c    (working copy)
@@ -12817,7 +12729,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: gcc/testsuite/gcc.dg/vect/pr63605.c
===================================================================
--- gcc/testsuite/gcc.dg/vect/pr63605.c (revision 0)
+++ gcc/testsuite/gcc.dg/vect/pr63605.c (working copy)
@@ -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;
+}

Reply via email to