mirror of git://gcc.gnu.org/git/gcc.git
gimple-fold.c (fold_gimple_assign): Do not dispatch to fold () on single RHSs.
2015-10-30 Richard Biener <rguenther@suse.de> * gimple-fold.c (fold_gimple_assign): Do not dispatch to fold () on single RHSs. Allow CONSTRUCTORS with trailing zeros to be folded to VECTOR_CSTs. * tree.c (build_vector_from_ctor): Handle VECTOR_CST elements. * fold-const.c (fold): Use build_vector_from_ctor. From-SVN: r229574
This commit is contained in:
parent
04e3481107
commit
7524f419ae
|
|
@ -1,3 +1,11 @@
|
||||||
|
2015-10-30 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
|
* gimple-fold.c (fold_gimple_assign): Do not dispatch to
|
||||||
|
fold () on single RHSs. Allow CONSTRUCTORS with trailing
|
||||||
|
zeros to be folded to VECTOR_CSTs.
|
||||||
|
* tree.c (build_vector_from_ctor): Handle VECTOR_CST elements.
|
||||||
|
* fold-const.c (fold): Use build_vector_from_ctor.
|
||||||
|
|
||||||
2015-10-30 Evandro Menezes <e.menezes@samsung.com>
|
2015-10-30 Evandro Menezes <e.menezes@samsung.com>
|
||||||
|
|
||||||
* config/aarch64/aarch64.md (*movhf_aarch64): Change the type of
|
* config/aarch64/aarch64.md (*movhf_aarch64): Change the type of
|
||||||
|
|
|
||||||
|
|
@ -11968,26 +11968,13 @@ fold (tree expr)
|
||||||
if (TREE_CODE (type) != VECTOR_TYPE)
|
if (TREE_CODE (type) != VECTOR_TYPE)
|
||||||
return t;
|
return t;
|
||||||
|
|
||||||
tree *vec = XALLOCAVEC (tree, TYPE_VECTOR_SUBPARTS (type));
|
unsigned i;
|
||||||
unsigned HOST_WIDE_INT idx, pos = 0;
|
tree val;
|
||||||
tree value;
|
FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (t), i, val)
|
||||||
|
if (! CONSTANT_CLASS_P (val))
|
||||||
FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (t), idx, value)
|
|
||||||
{
|
|
||||||
if (!CONSTANT_CLASS_P (value))
|
|
||||||
return t;
|
return t;
|
||||||
if (TREE_CODE (value) == VECTOR_CST)
|
|
||||||
{
|
|
||||||
for (unsigned i = 0; i < VECTOR_CST_NELTS (value); ++i)
|
|
||||||
vec[pos++] = VECTOR_CST_ELT (value, i);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
vec[pos++] = value;
|
|
||||||
}
|
|
||||||
for (; pos < TYPE_VECTOR_SUBPARTS (type); ++pos)
|
|
||||||
vec[pos] = build_zero_cst (TREE_TYPE (type));
|
|
||||||
|
|
||||||
return build_vector (type, vec);
|
return build_vector_from_ctor (type, CONSTRUCTOR_ELTS (t));
|
||||||
}
|
}
|
||||||
|
|
||||||
case CONST_DECL:
|
case CONST_DECL:
|
||||||
|
|
|
||||||
|
|
@ -354,8 +354,8 @@ fold_gimple_assign (gimple_stmt_iterator *si)
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (TREE_CODE (rhs) == ADDR_EXPR)
|
else if (TREE_CODE (rhs) == ADDR_EXPR)
|
||||||
{
|
{
|
||||||
tree ref = TREE_OPERAND (rhs, 0);
|
tree ref = TREE_OPERAND (rhs, 0);
|
||||||
|
|
@ -370,21 +370,29 @@ fold_gimple_assign (gimple_stmt_iterator *si)
|
||||||
else if (TREE_CODE (ref) == MEM_REF
|
else if (TREE_CODE (ref) == MEM_REF
|
||||||
&& integer_zerop (TREE_OPERAND (ref, 1)))
|
&& integer_zerop (TREE_OPERAND (ref, 1)))
|
||||||
result = fold_convert (TREE_TYPE (rhs), TREE_OPERAND (ref, 0));
|
result = fold_convert (TREE_TYPE (rhs), TREE_OPERAND (ref, 0));
|
||||||
|
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
/* Strip away useless type conversions. Both the
|
||||||
|
NON_LVALUE_EXPR that may have been added by fold, and
|
||||||
|
"useless" type conversions that might now be apparent
|
||||||
|
due to propagation. */
|
||||||
|
STRIP_USELESS_TYPE_CONVERSION (result);
|
||||||
|
|
||||||
|
if (result != rhs && valid_gimple_rhs_p (result))
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (TREE_CODE (rhs) == CONSTRUCTOR
|
else if (TREE_CODE (rhs) == CONSTRUCTOR
|
||||||
&& TREE_CODE (TREE_TYPE (rhs)) == VECTOR_TYPE
|
&& TREE_CODE (TREE_TYPE (rhs)) == VECTOR_TYPE)
|
||||||
&& (CONSTRUCTOR_NELTS (rhs)
|
|
||||||
== TYPE_VECTOR_SUBPARTS (TREE_TYPE (rhs))))
|
|
||||||
{
|
{
|
||||||
/* Fold a constant vector CONSTRUCTOR to VECTOR_CST. */
|
/* Fold a constant vector CONSTRUCTOR to VECTOR_CST. */
|
||||||
unsigned i;
|
unsigned i;
|
||||||
tree val;
|
tree val;
|
||||||
|
|
||||||
FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (rhs), i, val)
|
FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (rhs), i, val)
|
||||||
if (TREE_CODE (val) != INTEGER_CST
|
if (! CONSTANT_CLASS_P (val))
|
||||||
&& TREE_CODE (val) != REAL_CST
|
|
||||||
&& TREE_CODE (val) != FIXED_CST)
|
|
||||||
return NULL_TREE;
|
return NULL_TREE;
|
||||||
|
|
||||||
return build_vector_from_ctor (TREE_TYPE (rhs),
|
return build_vector_from_ctor (TREE_TYPE (rhs),
|
||||||
|
|
@ -393,21 +401,6 @@ fold_gimple_assign (gimple_stmt_iterator *si)
|
||||||
|
|
||||||
else if (DECL_P (rhs))
|
else if (DECL_P (rhs))
|
||||||
return get_symbol_constant_value (rhs);
|
return get_symbol_constant_value (rhs);
|
||||||
|
|
||||||
/* If we couldn't fold the RHS, hand over to the generic
|
|
||||||
fold routines. */
|
|
||||||
if (result == NULL_TREE)
|
|
||||||
result = fold (rhs);
|
|
||||||
|
|
||||||
/* Strip away useless type conversions. Both the NON_LVALUE_EXPR
|
|
||||||
that may have been added by fold, and "useless" type
|
|
||||||
conversions that might now be apparent due to propagation. */
|
|
||||||
STRIP_USELESS_TYPE_CONVERSION (result);
|
|
||||||
|
|
||||||
if (result != rhs && valid_gimple_rhs_p (result))
|
|
||||||
return result;
|
|
||||||
|
|
||||||
return NULL_TREE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
||||||
12
gcc/tree.c
12
gcc/tree.c
|
|
@ -1729,13 +1729,19 @@ tree
|
||||||
build_vector_from_ctor (tree type, vec<constructor_elt, va_gc> *v)
|
build_vector_from_ctor (tree type, vec<constructor_elt, va_gc> *v)
|
||||||
{
|
{
|
||||||
tree *vec = XALLOCAVEC (tree, TYPE_VECTOR_SUBPARTS (type));
|
tree *vec = XALLOCAVEC (tree, TYPE_VECTOR_SUBPARTS (type));
|
||||||
unsigned HOST_WIDE_INT idx;
|
unsigned HOST_WIDE_INT idx, pos = 0;
|
||||||
tree value;
|
tree value;
|
||||||
|
|
||||||
FOR_EACH_CONSTRUCTOR_VALUE (v, idx, value)
|
FOR_EACH_CONSTRUCTOR_VALUE (v, idx, value)
|
||||||
vec[idx] = value;
|
{
|
||||||
|
if (TREE_CODE (value) == VECTOR_CST)
|
||||||
|
for (unsigned i = 0; i < VECTOR_CST_NELTS (value); ++i)
|
||||||
|
vec[pos++] = VECTOR_CST_ELT (value, i);
|
||||||
|
else
|
||||||
|
vec[pos++] = value;
|
||||||
|
}
|
||||||
for (; idx < TYPE_VECTOR_SUBPARTS (type); ++idx)
|
for (; idx < TYPE_VECTOR_SUBPARTS (type); ++idx)
|
||||||
vec[idx] = build_zero_cst (TREE_TYPE (type));
|
vec[pos++] = build_zero_cst (TREE_TYPE (type));
|
||||||
|
|
||||||
return build_vector (type, vec);
|
return build_vector (type, vec);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue