re PR tree-optimization/52870 (ICE during SLP pattern matching)
authorUlrich Weigand <ulrich.weigand@linaro.org>
Tue, 10 Apr 2012 10:56:11 +0000 (10:56 +0000)
committerUlrich Weigand <uweigand@gcc.gnu.org>
Tue, 10 Apr 2012 10:56:11 +0000 (10:56 +0000)
gcc/
PR tree-optimization/52870
* tree-vect-patterns.c (vect_recog_widen_mult_pattern): Verify that
presumed pattern statement is within the same loop or basic block.

gcc/testsuite/
PR tree-optimization/52870
* gcc.dg/vect/pr52870.c: New test.

From-SVN: r186272

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/pr52870.c [new file with mode: 0644]
gcc/tree-vect-patterns.c

index 2e39f78..64ff386 100644 (file)
@@ -1,3 +1,9 @@
+2012-04-10  Ulrich Weigand  <ulrich.weigand@linaro.org>
+
+       PR tree-optimization/52870
+       * tree-vect-patterns.c (vect_recog_widen_mult_pattern): Verify that
+       presumed pattern statement is within the same loop or basic block.
+
 2012-04-10  Tristan Gingold  <gingold@adacore.com>
 
        * gengtype.c (main): Make uintptr_t a known type.
index e1ea7f5..a2172b0 100644 (file)
@@ -1,3 +1,8 @@
+2012-04-10  Ulrich Weigand  <ulrich.weigand@linaro.org>
+
+       PR tree-optimization/52870
+       * gcc.dg/vect/pr52870.c: New test.
+
 2012-04-09  Mike Stump  <mikestump@comcast.net>
 
        * g++.dg/cpp0x/udlit-raw-op.C: Don't use CRLF endings.
diff --git a/gcc/testsuite/gcc.dg/vect/pr52870.c b/gcc/testsuite/gcc.dg/vect/pr52870.c
new file mode 100644 (file)
index 0000000..3851850
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -ftree-vectorize" } */
+
+long
+test (int *x)
+{
+  unsigned long sx, xprec;
+
+  sx = *x >= 0 ? *x : -*x;
+
+  xprec = sx * 64;
+
+  if (sx < 16384)
+    foo (sx);
+
+  return xprec;
+}
index b871c0b..6372a36 100644 (file)
@@ -564,6 +564,16 @@ vect_recog_widen_mult_pattern (VEC (gimple, heap) **stmts,
   VEC (tree, heap) *dummy_vec;
   bool op1_ok;
   bool promotion;
+  loop_vec_info loop_vinfo;
+  struct loop *loop = NULL;
+  bb_vec_info bb_vinfo;
+  stmt_vec_info stmt_vinfo;
+
+  stmt_vinfo = vinfo_for_stmt (last_stmt);
+  loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_vinfo);
+  bb_vinfo = STMT_VINFO_BB_VINFO (stmt_vinfo);
+  if (loop_vinfo)
+    loop = LOOP_VINFO_LOOP (loop_vinfo);
 
   if (!is_gimple_assign (last_stmt))
     return NULL;
@@ -635,6 +645,11 @@ vect_recog_widen_mult_pattern (VEC (gimple, heap) **stmts,
           || gimple_assign_rhs_code (use_stmt) != NOP_EXPR)
         return NULL;
 
+      if (!gimple_bb (use_stmt)
+         || (loop && !flow_bb_inside_loop_p (loop, gimple_bb (use_stmt)))
+         || (!loop && gimple_bb (use_stmt) != BB_VINFO_BB (bb_vinfo)))
+       return NULL;
+
       use_lhs = gimple_assign_lhs (use_stmt);
       use_type = TREE_TYPE (use_lhs);
       if (!INTEGRAL_TYPE_P (use_type)