aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUlrich Weigand <ulrich.weigand@linaro.org>2012-04-10 10:56:11 +0000
committerUlrich Weigand <uweigand@gcc.gnu.org>2012-04-10 10:56:11 +0000
commitc0d942d2117b785d768c5f2ab2813e4781e29e43 (patch)
tree9f559ce5f418780d6e5c5935bdbfec342c5aa91f /gcc
parent5973ae1ac297b881e712b44335a231e892e6af25 (diff)
downloadgcc-c0d942d2117b785d768c5f2ab2813e4781e29e43.zip
gcc-c0d942d2117b785d768c5f2ab2813e4781e29e43.tar.gz
gcc-c0d942d2117b785d768c5f2ab2813e4781e29e43.tar.bz2
re PR tree-optimization/52870 (ICE during SLP pattern matching)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr52870.c17
-rw-r--r--gcc/tree-vect-patterns.c15
4 files changed, 43 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2e39f78..64ff386 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e1ea7f5..a2172b0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..3851850
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr52870.c
@@ -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;
+}
diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c
index b871c0b..6372a36 100644
--- a/gcc/tree-vect-patterns.c
+++ b/gcc/tree-vect-patterns.c
@@ -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)