re PR tree-optimization/55955 (ICE in optab_for_tree_code, at optabs.c:402)
authorJakub Jelinek <jakub@redhat.com>
Tue, 15 Jan 2013 09:31:28 +0000 (10:31 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 15 Jan 2013 09:31:28 +0000 (10:31 +0100)
PR tree-optimization/55955
* tree-vect-loop.c (vectorizable_reduction): Give up early on
*SHIFT_EXPR and *ROTATE_EXPR codes.

* gcc.c-torture/compile/pr55955.c: New test.

From-SVN: r195190

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr55955.c [new file with mode: 0644]
gcc/tree-vect-loop.c

index 6b4f1d4..ea0e4fa 100644 (file)
@@ -1,5 +1,9 @@
 2013-01-15  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/55955
+       * tree-vect-loop.c (vectorizable_reduction): Give up early on
+       *SHIFT_EXPR and *ROTATE_EXPR codes.
+
        PR tree-optimization/48766
        * opts.c (common_handle_option): For -fwrapv disable -ftrapv, for
        -ftrapv disable -fwrapv.
index 26a479b..a80f16b 100644 (file)
@@ -1,3 +1,8 @@
+2013-01-15  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/55955
+       * gcc.c-torture/compile/pr55955.c: New test.
+
 2013-01-15  Dodji Seketeli  <dodji@redhat.com>
 
        PR c++/55663
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr55955.c b/gcc/testsuite/gcc.c-torture/compile/pr55955.c
new file mode 100644 (file)
index 0000000..2656ffb
--- /dev/null
@@ -0,0 +1,12 @@
+/* PR tree-optimization/55955 */
+
+int b;
+
+void
+foo (int x)
+{
+  int a;
+  for (a = x; a < 2; a++)
+    for (b = 0; b < 2; b++)
+      *(unsigned short *) 0x100000UL %= 46;
+}
index 3a470e3..d4f6bc7 100644 (file)
@@ -4776,6 +4776,17 @@ vectorizable_reduction (gimple stmt, gimple_stmt_iterator *gsi,
     {
       /* 4. Supportable by target?  */
 
+      if (code == LSHIFT_EXPR || code == RSHIFT_EXPR
+         || code == LROTATE_EXPR || code == RROTATE_EXPR)
+       {
+         /* Shifts and rotates are only supported by vectorizable_shifts,
+            not vectorizable_reduction.  */
+          if (dump_enabled_p ())
+           dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+                            "unsupported shift or rotation.");
+         return false;
+       }
+
       /* 4.1. check support for the operation in the loop  */
       optab = optab_for_tree_code (code, vectype_in, optab_default);
       if (!optab)