diff mbox

Fix PR tree-optimization/52870 (another crash in SLP pattern detection)

Message ID 201204101353.q3ADr4G8013445@d06av02.portsmouth.uk.ibm.com
State Accepted
Headers show

Commit Message

Ulrich Weigand April 10, 2012, 1:53 p.m. UTC
http://gcc.gnu.org/ml/gcc-patches/2012-04/msg00360.html

ChangeLog:

	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.
diff mbox

Patch

=== added file 'gcc/testsuite/gcc.dg/vect/pr52870.c'
--- gcc/testsuite/gcc.dg/vect/pr52870.c	1970-01-01 00:00:00 +0000
+++ gcc/testsuite/gcc.dg/vect/pr52870.c	2012-04-04 16:18:08 +0000
@@ -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;
+}

=== modified file 'gcc/tree-vect-patterns.c'
--- gcc/tree-vect-patterns.c	2012-02-17 16:18:02 +0000
+++ gcc/tree-vect-patterns.c	2012-04-04 16:18:08 +0000
@@ -564,6 +564,16 @@ 
   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 @@ 
           || 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)