Commit 67f2d54f by Ira Rosen Committed by Ira Rosen

re PR tree-optimization/49926 (ice in process_use, at tree-vect-stmts.c:405)


        PR tree-optimization/49926
        * tree-vect-loop.c (vect_is_slp_reduction): Check that a
        statement in a chain doesn't have uses both inside and
        outside the loop.

From-SVN: r177063
parent 2933b16c
2011-08-01 Ira Rosen <ira.rosen@linaro.org>
PR tree-optimization/49926
* tree-vect-loop.c (vect_is_slp_reduction): Check that a statement
in a chain doesn't have uses both inside and outside the loop.
2011-08-01 Georg-Johann Lay <avr@gjlay.de>
* config/avr/avr.h (mcu_type_s): Add errata_skip field.
......
2011-08-01 Ira Rosen <ira.rosen@linaro.org>
PR tree-optimization/49926
* gcc.dg/vect/pr49926.c: New test.
2011-08-01 Kirill Yukhin <kirill.yukhin@intel.com>
* gcc.target/i386/i386.exp (check_effective_target_lzcnt): New.
......
/* { dg-do compile } */
/* { dg-require-effective-target vect_int } */
int a, b, c[10];
void
foo (unsigned int x, int y, int z, int *w)
{
do
{
*w = z;
y = x;
if (y)
for (b = -4; b; b++)
{
z = y &= a &= 1;
y &= c[b + 4];
}
}
while (1);
}
/* { dg-final { cleanup-tree-dump "vect" } } */
......@@ -1730,7 +1730,7 @@ vect_is_slp_reduction (loop_vec_info loop_info, gimple phi, gimple first_stmt)
tree lhs;
imm_use_iterator imm_iter;
use_operand_p use_p;
int nloop_uses, size = 0;
int nloop_uses, size = 0, n_out_of_loop_uses;
bool found = false;
if (loop != vect_loop)
......@@ -1741,6 +1741,7 @@ vect_is_slp_reduction (loop_vec_info loop_info, gimple phi, gimple first_stmt)
while (1)
{
nloop_uses = 0;
n_out_of_loop_uses = 0;
FOR_EACH_IMM_USE_FAST (use_p, imm_iter, lhs)
{
gimple use_stmt = USE_STMT (use_p);
......@@ -1757,16 +1758,22 @@ vect_is_slp_reduction (loop_vec_info loop_info, gimple phi, gimple first_stmt)
break;
}
if (flow_bb_inside_loop_p (loop, gimple_bb (use_stmt))
&& vinfo_for_stmt (use_stmt)
&& !STMT_VINFO_IN_PATTERN_P (vinfo_for_stmt (use_stmt)))
{
loop_use_stmt = use_stmt;
nloop_uses++;
}
if (flow_bb_inside_loop_p (loop, gimple_bb (use_stmt)))
{
if (vinfo_for_stmt (use_stmt)
&& !STMT_VINFO_IN_PATTERN_P (vinfo_for_stmt (use_stmt)))
{
loop_use_stmt = use_stmt;
nloop_uses++;
}
}
else
n_out_of_loop_uses++;
if (nloop_uses > 1)
return false;
/* There are can be either a single use in the loop or two uses in
phi nodes. */
if (nloop_uses > 1 || (n_out_of_loop_uses && nloop_uses))
return false;
}
if (found)
......
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