re PR tree-optimization/70726 (Internal compiler error (ICE) on valid code)
authorRichard Biener <rguenther@suse.de>
Wed, 20 Apr 2016 07:20:16 +0000 (07:20 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 20 Apr 2016 07:20:16 +0000 (07:20 +0000)
2016-04-20  Richard Biener  <rguenther@suse.de>

PR tree-optimization/70726
* tree-vect-stmts.c (vectorizable_shift): Do not use scalar
shift amounts from a pattern stmt operand.

* g++.dg/vect/pr70726.cc: New testcase.

From-SVN: r235236

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/vect/pr70726.cc [new file with mode: 0644]
gcc/tree-vect-stmts.c

index 685aba31ccb66dc217b92e241ec19e2e92651913..6e92dde027e973c77f83efc43cb94f77bc42f3b5 100644 (file)
@@ -1,3 +1,9 @@
+2016-04-20  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/70726
+       * tree-vect-stmts.c (vectorizable_shift): Do not use scalar
+       shift amounts from a pattern stmt operand.
+
 2016-04-20  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>
 
        PR target/70674
index 55e7bbda21f4394abf9f7fe37da769e869802820..db98dd3f9d51117d68f769abc7976d0b72ee2f46 100644 (file)
@@ -1,3 +1,8 @@
+2016-04-20  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/70726
+       * g++.dg/vect/pr70726.cc: New testcase.
+
 2016-04-20  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>
 
        PR target/70674
diff --git a/gcc/testsuite/g++.dg/vect/pr70726.cc b/gcc/testsuite/g++.dg/vect/pr70726.cc
new file mode 100644 (file)
index 0000000..d5d2def
--- /dev/null
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// { dg-additional-options "-Ofast" }
+// { dg-additional-options "-mavx2" { target x86_64-*-* i?86-*-* } }
+
+extern long a;
+extern int b[100];
+extern unsigned c[5][5][2][4][2][2][3];
+void fn1() {
+  for (int d = 0; d < 2; d = d + 1)
+    for (int e = 0; e < 5; e = e + 1)
+      for (int f = 0; f < 3; f = f + 1)
+        for (int g = 0; g < 3; g = g + 1)
+          for (int h = 0; h < 2; h = h + 1)
+            for (int i = 0; i < 4; i = i + 1)
+              for (int j = 0; j < 2; j = j + 1)
+                for (int k = 0; k < 2; k = k + 1)
+                  for (int l = 0; l < 3; l = l + 1)
+                    c[d][e][h][i][j][k][l] = a << b[f * 5 + g] + 4;
+}
index 5f054c53447711afa3bd4eb56348ca8ff4ce25e8..9ab4af4f97eb9a651a6335c64a3574a058dad5f0 100644 (file)
@@ -4532,6 +4532,16 @@ vectorizable_shift (gimple *stmt, gimple_stmt_iterator *gsi,
            if (!operand_equal_p (gimple_assign_rhs2 (slpstmt), op1, 0))
              scalar_shift_arg = false;
        }
+
+      /* If the shift amount is computed by a pattern stmt we cannot
+         use the scalar amount directly thus give up and use a vector
+        shift.  */
+      if (dt[1] == vect_internal_def)
+       {
+         gimple *def = SSA_NAME_DEF_STMT (op1);
+         if (is_pattern_stmt_p (vinfo_for_stmt (def)))
+           scalar_shift_arg = false;
+       }
     }
   else
     {