Always simplify vector shifts by scalars.
Also decompose vectors in large integer modes. * tree-vect-generic.c (expand_vector_operations_1): Correct tests for vector types -- use the type not the mode. Fix optab selection for vector shifts by a scalar. Handle over-large integer modes like BLKmode. From-SVN: r182563
This commit is contained in:
parent
96e69fe20e
commit
0f3d6c10f4
|
@ -1,3 +1,10 @@
|
||||||
|
2011-12-20 Richard Henderson <rth@redhat.com>
|
||||||
|
|
||||||
|
* tree-vect-generic.c (expand_vector_operations_1): Correct tests
|
||||||
|
for vector types -- use the type not the mode. Fix optab selection
|
||||||
|
for vector shifts by a scalar. Handle over-large integer modes
|
||||||
|
like BLKmode.
|
||||||
|
|
||||||
2011-12-20 Richard Henderson <rth@redhat.com>
|
2011-12-20 Richard Henderson <rth@redhat.com>
|
||||||
|
|
||||||
* config/arm/arm.md (*arm_xorsi3): Match iorsi3 and perform
|
* config/arm/arm.md (*arm_xorsi3): Match iorsi3 and perform
|
||||||
|
|
|
@ -796,10 +796,12 @@ expand_vector_operations_1 (gimple_stmt_iterator *gsi)
|
||||||
|| code == LROTATE_EXPR
|
|| code == LROTATE_EXPR
|
||||||
|| code == RROTATE_EXPR)
|
|| code == RROTATE_EXPR)
|
||||||
{
|
{
|
||||||
|
optab opv;
|
||||||
|
|
||||||
/* Check whether we have vector <op> {x,x,x,x} where x
|
/* Check whether we have vector <op> {x,x,x,x} where x
|
||||||
could be a scalar variable or a constant. Transform
|
could be a scalar variable or a constant. Transform
|
||||||
vector <op> {x,x,x,x} ==> vector <op> scalar. */
|
vector <op> {x,x,x,x} ==> vector <op> scalar. */
|
||||||
if (VECTOR_MODE_P (TYPE_MODE (TREE_TYPE (rhs2))))
|
if (VECTOR_INTEGER_TYPE_P (TREE_TYPE (rhs2)))
|
||||||
{
|
{
|
||||||
tree first;
|
tree first;
|
||||||
gimple def_stmt;
|
gimple def_stmt;
|
||||||
|
@ -818,17 +820,18 @@ expand_vector_operations_1 (gimple_stmt_iterator *gsi)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (VECTOR_MODE_P (TYPE_MODE (TREE_TYPE (rhs2))))
|
opv = optab_for_tree_code (code, type, optab_vector);
|
||||||
op = optab_for_tree_code (code, type, optab_vector);
|
if (VECTOR_INTEGER_TYPE_P (TREE_TYPE (rhs2)))
|
||||||
|
op = opv;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
op = optab_for_tree_code (code, type, optab_scalar);
|
op = optab_for_tree_code (code, type, optab_scalar);
|
||||||
|
|
||||||
/* The rtl expander will expand vector/scalar as vector/vector
|
/* The rtl expander will expand vector/scalar as vector/vector
|
||||||
if necessary. Don't bother converting the stmt here. */
|
if necessary. Don't bother converting the stmt here. */
|
||||||
if (op == NULL
|
if (optab_handler (op, TYPE_MODE (type)) == CODE_FOR_nothing
|
||||||
|| optab_handler (op, TYPE_MODE (type)) == CODE_FOR_nothing)
|
&& optab_handler (opv, TYPE_MODE (type)) != CODE_FOR_nothing)
|
||||||
op = optab_for_tree_code (code, type, optab_vector);
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -859,14 +862,16 @@ expand_vector_operations_1 (gimple_stmt_iterator *gsi)
|
||||||
|
|
||||||
/* For very wide vectors, try using a smaller vector mode. */
|
/* For very wide vectors, try using a smaller vector mode. */
|
||||||
compute_type = type;
|
compute_type = type;
|
||||||
if (TYPE_MODE (type) == BLKmode && op)
|
if (!VECTOR_MODE_P (TYPE_MODE (type)) && op)
|
||||||
{
|
{
|
||||||
tree vector_compute_type
|
tree vector_compute_type
|
||||||
= type_for_widest_vector_mode (TYPE_MODE (TREE_TYPE (type)), op,
|
= type_for_widest_vector_mode (TYPE_MODE (TREE_TYPE (type)), op,
|
||||||
TYPE_SATURATING (TREE_TYPE (type)));
|
TYPE_SATURATING (TREE_TYPE (type)));
|
||||||
if (vector_compute_type != NULL_TREE
|
if (vector_compute_type != NULL_TREE
|
||||||
&& (TYPE_VECTOR_SUBPARTS (vector_compute_type)
|
&& (TYPE_VECTOR_SUBPARTS (vector_compute_type)
|
||||||
< TYPE_VECTOR_SUBPARTS (compute_type)))
|
< TYPE_VECTOR_SUBPARTS (compute_type))
|
||||||
|
&& (optab_handler (op, TYPE_MODE (vector_compute_type))
|
||||||
|
!= CODE_FOR_nothing))
|
||||||
compute_type = vector_compute_type;
|
compute_type = vector_compute_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue