No a*x+b*x factorization for signed vectors

2018-10-02  Marc Glisse  <marc.glisse@inria.fr>

	PR middle-end/87319
	* fold-const.c (fold_plusminus_mult_expr): Handle complex and vectors.
	* tree.c (signed_or_unsigned_type_for): Handle complex.

From-SVN: r264790
This commit is contained in:
Marc Glisse 2018-10-02 16:55:39 +02:00 committed by Marc Glisse
parent a1c3d798ef
commit 057cf66ca3
3 changed files with 19 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2018-10-02 Marc Glisse <marc.glisse@inria.fr>
PR middle-end/87319
* fold-const.c (fold_plusminus_mult_expr): Handle complex and vectors.
* tree.c (signed_or_unsigned_type_for): Handle complex.
2018-10-02 Jeff Law <law@redhat.com>
* gimple-fold.c (get_range_strlen): Remove dead code.

View File

@ -7143,7 +7143,7 @@ fold_plusminus_mult_expr (location_t loc, enum tree_code code, tree type,
if (!same)
return NULL_TREE;
if (! INTEGRAL_TYPE_P (type)
if (! ANY_INTEGRAL_TYPE_P (type)
|| TYPE_OVERFLOW_WRAPS (type)
/* We are neither factoring zero nor minus one. */
|| TREE_CODE (same) == INTEGER_CST)

View File

@ -11209,7 +11209,7 @@ int_cst_value (const_tree x)
tree
signed_or_unsigned_type_for (int unsignedp, tree type)
{
if (TREE_CODE (type) == INTEGER_TYPE && TYPE_UNSIGNED (type) == unsignedp)
if (ANY_INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type) == unsignedp)
return type;
if (TREE_CODE (type) == VECTOR_TYPE)
@ -11223,6 +11223,17 @@ signed_or_unsigned_type_for (int unsignedp, tree type)
return build_vector_type (inner2, TYPE_VECTOR_SUBPARTS (type));
}
if (TREE_CODE (type) == COMPLEX_TYPE)
{
tree inner = TREE_TYPE (type);
tree inner2 = signed_or_unsigned_type_for (unsignedp, inner);
if (!inner2)
return NULL_TREE;
if (inner == inner2)
return type;
return build_complex_type (inner2);
}
if (!INTEGRAL_TYPE_P (type)
&& !POINTER_TYPE_P (type)
&& TREE_CODE (type) != OFFSET_TYPE)