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>
|
||||
|
||||
* 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 == RROTATE_EXPR)
|
||||
{
|
||||
optab opv;
|
||||
|
||||
/* Check whether we have vector <op> {x,x,x,x} where x
|
||||
could be a scalar variable or a constant. Transform
|
||||
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;
|
||||
gimple def_stmt;
|
||||
|
@ -818,17 +820,18 @@ expand_vector_operations_1 (gimple_stmt_iterator *gsi)
|
|||
}
|
||||
}
|
||||
|
||||
if (VECTOR_MODE_P (TYPE_MODE (TREE_TYPE (rhs2))))
|
||||
op = optab_for_tree_code (code, type, optab_vector);
|
||||
opv = optab_for_tree_code (code, type, optab_vector);
|
||||
if (VECTOR_INTEGER_TYPE_P (TREE_TYPE (rhs2)))
|
||||
op = opv;
|
||||
else
|
||||
{
|
||||
op = optab_for_tree_code (code, type, optab_scalar);
|
||||
|
||||
/* The rtl expander will expand vector/scalar as vector/vector
|
||||
if necessary. Don't bother converting the stmt here. */
|
||||
if (op == NULL
|
||||
|| optab_handler (op, TYPE_MODE (type)) == CODE_FOR_nothing)
|
||||
op = optab_for_tree_code (code, type, optab_vector);
|
||||
if (optab_handler (op, TYPE_MODE (type)) == CODE_FOR_nothing
|
||||
&& optab_handler (opv, TYPE_MODE (type)) != CODE_FOR_nothing)
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -859,14 +862,16 @@ expand_vector_operations_1 (gimple_stmt_iterator *gsi)
|
|||
|
||||
/* For very wide vectors, try using a smaller vector mode. */
|
||||
compute_type = type;
|
||||
if (TYPE_MODE (type) == BLKmode && op)
|
||||
if (!VECTOR_MODE_P (TYPE_MODE (type)) && op)
|
||||
{
|
||||
tree vector_compute_type
|
||||
= type_for_widest_vector_mode (TYPE_MODE (TREE_TYPE (type)), op,
|
||||
TYPE_SATURATING (TREE_TYPE (type)));
|
||||
if (vector_compute_type != NULL_TREE
|
||||
&& (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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue