Commit 74500b3e by Ira Rosen Committed by Ira Rosen

re PR tree-optimization/43842 (ice in vect_create_epilog_for_reduction)


	PR tree-optimization/43842
	* tree-vect-loop.c (vect_create_epilog_for_reduction): Handle 
	loop unrolling in update of exit phis. Fix comment.
	* tree-vect-slp.c (vect_analyze_slp): Check that there are at
	least two reduction statements in the loop before starting SLP 
	analysis.

From-SVN: r158650
parent 8e80fcac
2010-04-22 Ira Rosen <irar@il.ibm.com>
PR tree-optimization/43482
* tree-vect-loop.c (vect_create_epilog_for_reduction): Handle
loop unrolling in update of exit phis. Fix comment.
* tree-vect-slp.c (vect_analyze_slp): Check that there are at
least two reduction statements in the loop before starting SLP
analysis.
2010-04-22 Nick Clifton <nickc@redhat.com> 2010-04-22 Nick Clifton <nickc@redhat.com>
* config/stormy16/stormy16-lib2.c (__ucmpsi2): Fix thinko. * config/stormy16/stormy16-lib2.c (__ucmpsi2): Fix thinko.
......
2010-04-22 Ira Rosen <irar@il.ibm.com>
PR tree-optimization/43482
* gcc.dg/vect/pr43842.c: New test.
2010-04-22 Bernd Schmidt <bernds@codesourcery.com> 2010-04-22 Bernd Schmidt <bernds@codesourcery.com>
* gcc.target/i386/wmul-1.c: Add dg-require-effective-target ilp32. * gcc.target/i386/wmul-1.c: Add dg-require-effective-target ilp32.
......
/* { dg-do compile } */
typedef char int8_t;
typedef short int int16_t;
typedef int int32_t;
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
static int16_t
safe_rshift_func_int16_t_s_u (int16_t left, unsigned int right)
{
return left || right >= 1 * 8 ? left : left >> right;
}
static int8_t
safe_rshift_func_int8_t_s_u (int8_t left, unsigned int right)
{
return left || right >= 1 * 8 ? left : left >> right;
}
static uint32_t
safe_add_func_uint32_t_u_u (uint32_t ui1, uint16_t ui2)
{
return ui1 + ui2;
}
int16_t g_4;
int8_t g_4_8;
uint32_t g_9[1];
uint32_t g_9_8[2];
int161 (void)
{
int32_t l_2;
for (l_2 = -25; l_2; l_2 = safe_add_func_uint32_t_u_u (l_2, 1))
g_9[0] ^= safe_rshift_func_int16_t_s_u (g_4, 1);
}
int81 (void)
{
int32_t l_2;
for (l_2 = -25; l_2; l_2 = safe_add_func_uint32_t_u_u (l_2, 1))
{
g_9[0] ^= safe_rshift_func_int8_t_s_u (g_4_8, 1);
g_9[1] ^= safe_rshift_func_int8_t_s_u (g_4_8, 1);
}
return 0;
}
/* { dg-final { cleanup-tree-dump "vect" } } */
...@@ -2961,7 +2961,7 @@ vect_create_epilog_for_reduction (VEC (tree, heap) *vect_defs, gimple stmt, ...@@ -2961,7 +2961,7 @@ vect_create_epilog_for_reduction (VEC (tree, heap) *vect_defs, gimple stmt,
enum vect_def_type dt = vect_unknown_def_type; enum vect_def_type dt = vect_unknown_def_type;
int j, i; int j, i;
VEC (tree, heap) *scalar_results = NULL; VEC (tree, heap) *scalar_results = NULL;
int group_size = 1, k, ratio; unsigned int group_size = 1, k, ratio;
VEC (tree, heap) *vec_initial_defs = NULL; VEC (tree, heap) *vec_initial_defs = NULL;
VEC (gimple, heap) *phis; VEC (gimple, heap) *phis;
...@@ -3439,7 +3439,8 @@ vect_finalize_reduction: ...@@ -3439,7 +3439,8 @@ vect_finalize_reduction:
v_out2 = reduce <v_out1> v_out2 = reduce <v_out1>
s_out3 = extract_field <v_out2, 0> s_out3 = extract_field <v_out2, 0>
s_out4 = adjust_result <s_out3> s_out4 = adjust_result <s_out3>
use <s_out4> */ use <s_out4>
use <s_out4> */
/* In SLP we may have several statements in NEW_PHIS and REDUCTION_PHIS (in /* In SLP we may have several statements in NEW_PHIS and REDUCTION_PHIS (in
case that GROUP_SIZE is greater than vectorization factor). Therefore, we case that GROUP_SIZE is greater than vectorization factor). Therefore, we
...@@ -3447,8 +3448,13 @@ vect_finalize_reduction: ...@@ -3447,8 +3448,13 @@ vect_finalize_reduction:
(GROUP_SIZE / number of new vector stmts) scalar results correspond to (GROUP_SIZE / number of new vector stmts) scalar results correspond to
the first vector stmt, etc. the first vector stmt, etc.
(RATIO is equal to (GROUP_SIZE / number of new vector stmts)). */ (RATIO is equal to (GROUP_SIZE / number of new vector stmts)). */
ratio = group_size / VEC_length (gimple, new_phis); if (group_size > VEC_length (gimple, new_phis))
gcc_assert (!(group_size % VEC_length (gimple, new_phis))); {
ratio = group_size / VEC_length (gimple, new_phis);
gcc_assert (!(group_size % VEC_length (gimple, new_phis)));
}
else
ratio = 1;
for (k = 0; k < group_size; k++) for (k = 0; k < group_size; k++)
{ {
......
...@@ -1213,7 +1213,7 @@ vect_analyze_slp (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo) ...@@ -1213,7 +1213,7 @@ vect_analyze_slp (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo)
} }
/* Find SLP sequences starting from groups of reductions. */ /* Find SLP sequences starting from groups of reductions. */
if (loop_vinfo && VEC_length (gimple, LOOP_VINFO_REDUCTIONS (loop_vinfo)) if (loop_vinfo && VEC_length (gimple, LOOP_VINFO_REDUCTIONS (loop_vinfo)) > 1
&& vect_analyze_slp_instance (loop_vinfo, bb_vinfo, && vect_analyze_slp_instance (loop_vinfo, bb_vinfo,
VEC_index (gimple, reductions, 0))) VEC_index (gimple, reductions, 0)))
ok = true; ok = true;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment