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
This commit is contained in:
Ulrich Weigand 2012-04-10 10:56:11 +00:00 committed by Ulrich Weigand
parent 5973ae1ac2
commit c0d942d211
4 changed files with 43 additions and 0 deletions

View 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.

View 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.

View File

@ -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;
}

View 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)