Commit ad949bcc by Jakub Jelinek Committed by Ira Rosen

re PR tree-optimization/50208 (ICE: in vinfo_for_stmt at tree-vectorizer.h:598…

re PR tree-optimization/50208 (ICE: in vinfo_for_stmt at tree-vectorizer.h:598 with -ftree-vectorize -fno-tree-fre -fno-tree-pre)


        PR tree-optimization/50208
        * tree-vect-patterns.c (vect_handle_widen_mult_by_const): Add an
        argument.  Check that def_stmt is inside the loop.
        (vect_recog_widen_mult_pattern): Update calls to
        vect_handle_widen_mult_by_cons.
        (vect_operation_fits_smaller_type): Check that def_stmt is
        inside the loop.


Co-Authored-By: Ira Rosen <ira.rosen@linaro.org>

From-SVN: r178508
parent 7cd3603b
2011-09-04 Jakub Jelinek <jakub@redhat.com>
Ira Rosen <ira.rosen@linaro.org>
PR tree-optimization/50208
* tree-vect-patterns.c (vect_handle_widen_mult_by_const): Add an
argument. Check that def_stmt is inside the loop.
(vect_recog_widen_mult_pattern): Update calls to
vect_handle_widen_mult_by_cons.
(vect_operation_fits_smaller_type): Check that def_stmt is
inside the loop.
2011-09-04 Ira Rosen <ira.rosen@linaro.org> 2011-09-04 Ira Rosen <ira.rosen@linaro.org>
* tree-vectorizer.c (vect_print_dump_info): Print line * tree-vectorizer.c (vect_print_dump_info): Print line
2011-09-04 Jakub Jelinek <jakub@redhat.com>
Ira Rosen <ira.rosen@linaro.org>
PR tree-optimization/50208
* gcc.dg/vect/no-fre-pre-pr50208.c: New test.
* gcc.dg/vect/vect.exp: Run no-fre-pre-*.c tests with
-fno-tree-fre -fno-tree-pre.
2011-09-02 Martin Jambor <mjambor@suse.cz> 2011-09-02 Martin Jambor <mjambor@suse.cz>
* gcc.dg/ipa/ipcp-3.c: New test. * gcc.dg/ipa/ipcp-3.c: New test.
......
/* { dg-do compile } */
char c;
int a, b;
void foo (int j)
{
int i;
while (--j)
{
b = 3;
for (i = 0; i < 2; ++i)
a = b ^ c;
}
}
/* { dg-final { cleanup-tree-dump "vect" } } */
...@@ -263,6 +263,12 @@ lappend DEFAULT_VECTCFLAGS "-fno-tree-fre" ...@@ -263,6 +263,12 @@ lappend DEFAULT_VECTCFLAGS "-fno-tree-fre"
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/no-tree-fre-*.\[cS\]]] \ dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/no-tree-fre-*.\[cS\]]] \
"" $DEFAULT_VECTCFLAGS "" $DEFAULT_VECTCFLAGS
# -fno-tree-fre -fno-tree-pre
set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
lappend DEFAULT_VECTCFLAGS "-fno-tree-fre" "-fno-tree-pre"
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/no-fre-pre*.\[cS\]]] \
"" $DEFAULT_VECTCFLAGS
# Clean up. # Clean up.
set dg-do-what-default ${save-dg-do-what-default} set dg-do-what-default ${save-dg-do-what-default}
......
...@@ -344,12 +344,14 @@ vect_recog_dot_prod_pattern (VEC (gimple, heap) **stmts, tree *type_in, ...@@ -344,12 +344,14 @@ vect_recog_dot_prod_pattern (VEC (gimple, heap) **stmts, tree *type_in,
replace a_T = (TYPE) a_t; with a_it - (interm_type) a_t; */ replace a_T = (TYPE) a_t; with a_it - (interm_type) a_t; */
static bool static bool
vect_handle_widen_mult_by_const (tree const_oprnd, tree *oprnd, vect_handle_widen_mult_by_const (gimple stmt, tree const_oprnd, tree *oprnd,
VEC (gimple, heap) **stmts, tree type, VEC (gimple, heap) **stmts, tree type,
tree *half_type, gimple def_stmt) tree *half_type, gimple def_stmt)
{ {
tree new_type, new_oprnd, tmp; tree new_type, new_oprnd, tmp;
gimple new_stmt; gimple new_stmt;
loop_vec_info loop_info = STMT_VINFO_LOOP_VINFO (vinfo_for_stmt (stmt));
struct loop *loop = LOOP_VINFO_LOOP (loop_info);
if (int_fits_type_p (const_oprnd, *half_type)) if (int_fits_type_p (const_oprnd, *half_type))
{ {
...@@ -359,6 +361,8 @@ vect_handle_widen_mult_by_const (tree const_oprnd, tree *oprnd, ...@@ -359,6 +361,8 @@ vect_handle_widen_mult_by_const (tree const_oprnd, tree *oprnd,
} }
if (TYPE_PRECISION (type) < (TYPE_PRECISION (*half_type) * 4) if (TYPE_PRECISION (type) < (TYPE_PRECISION (*half_type) * 4)
|| !gimple_bb (def_stmt)
|| !flow_bb_inside_loop_p (loop, gimple_bb (def_stmt))
|| !vinfo_for_stmt (def_stmt)) || !vinfo_for_stmt (def_stmt))
return false; return false;
...@@ -527,7 +531,8 @@ vect_recog_widen_mult_pattern (VEC (gimple, heap) **stmts, ...@@ -527,7 +531,8 @@ vect_recog_widen_mult_pattern (VEC (gimple, heap) **stmts,
{ {
if (TREE_CODE (oprnd0) == INTEGER_CST if (TREE_CODE (oprnd0) == INTEGER_CST
&& TREE_CODE (half_type1) == INTEGER_TYPE && TREE_CODE (half_type1) == INTEGER_TYPE
&& vect_handle_widen_mult_by_const (oprnd0, &oprnd1, stmts, type, && vect_handle_widen_mult_by_const (last_stmt, oprnd0, &oprnd1,
stmts, type,
&half_type1, def_stmt1)) &half_type1, def_stmt1))
half_type0 = half_type1; half_type0 = half_type1;
else else
...@@ -537,7 +542,8 @@ vect_recog_widen_mult_pattern (VEC (gimple, heap) **stmts, ...@@ -537,7 +542,8 @@ vect_recog_widen_mult_pattern (VEC (gimple, heap) **stmts,
{ {
if (TREE_CODE (oprnd1) == INTEGER_CST if (TREE_CODE (oprnd1) == INTEGER_CST
&& TREE_CODE (half_type0) == INTEGER_TYPE && TREE_CODE (half_type0) == INTEGER_TYPE
&& vect_handle_widen_mult_by_const (oprnd1, &oprnd0, stmts, type, && vect_handle_widen_mult_by_const (last_stmt, oprnd1, &oprnd0,
stmts, type,
&half_type0, def_stmt0)) &half_type0, def_stmt0))
half_type1 = half_type0; half_type1 = half_type0;
else else
...@@ -868,6 +874,8 @@ vect_operation_fits_smaller_type (gimple stmt, tree def, tree *new_type, ...@@ -868,6 +874,8 @@ vect_operation_fits_smaller_type (gimple stmt, tree def, tree *new_type,
tree interm_type = NULL_TREE, half_type, tmp, new_oprnd, type; tree interm_type = NULL_TREE, half_type, tmp, new_oprnd, type;
gimple def_stmt, new_stmt; gimple def_stmt, new_stmt;
bool first = false; bool first = false;
loop_vec_info loop_info = STMT_VINFO_LOOP_VINFO (vinfo_for_stmt (stmt));
struct loop *loop = LOOP_VINFO_LOOP (loop_info);
*new_def_stmt = NULL; *new_def_stmt = NULL;
...@@ -898,6 +906,8 @@ vect_operation_fits_smaller_type (gimple stmt, tree def, tree *new_type, ...@@ -898,6 +906,8 @@ vect_operation_fits_smaller_type (gimple stmt, tree def, tree *new_type,
{ {
first = true; first = true;
if (!widened_name_p (oprnd, stmt, &half_type, &def_stmt, false) if (!widened_name_p (oprnd, stmt, &half_type, &def_stmt, false)
|| !gimple_bb (def_stmt)
|| !flow_bb_inside_loop_p (loop, gimple_bb (def_stmt))
|| !vinfo_for_stmt (def_stmt)) || !vinfo_for_stmt (def_stmt))
return false; return false;
} }
......
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