Commit 057cf66c by Marc Glisse Committed by Marc Glisse

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
parent a1c3d798
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> 2018-10-02 Jeff Law <law@redhat.com>
* gimple-fold.c (get_range_strlen): Remove dead code. * gimple-fold.c (get_range_strlen): Remove dead code.
...@@ -7143,7 +7143,7 @@ fold_plusminus_mult_expr (location_t loc, enum tree_code code, tree type, ...@@ -7143,7 +7143,7 @@ fold_plusminus_mult_expr (location_t loc, enum tree_code code, tree type,
if (!same) if (!same)
return NULL_TREE; return NULL_TREE;
if (! INTEGRAL_TYPE_P (type) if (! ANY_INTEGRAL_TYPE_P (type)
|| TYPE_OVERFLOW_WRAPS (type) || TYPE_OVERFLOW_WRAPS (type)
/* We are neither factoring zero nor minus one. */ /* We are neither factoring zero nor minus one. */
|| TREE_CODE (same) == INTEGER_CST) || TREE_CODE (same) == INTEGER_CST)
......
...@@ -11209,7 +11209,7 @@ int_cst_value (const_tree x) ...@@ -11209,7 +11209,7 @@ int_cst_value (const_tree x)
tree tree
signed_or_unsigned_type_for (int unsignedp, tree type) 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; return type;
if (TREE_CODE (type) == VECTOR_TYPE) if (TREE_CODE (type) == VECTOR_TYPE)
...@@ -11223,6 +11223,17 @@ signed_or_unsigned_type_for (int unsignedp, tree type) ...@@ -11223,6 +11223,17 @@ signed_or_unsigned_type_for (int unsignedp, tree type)
return build_vector_type (inner2, TYPE_VECTOR_SUBPARTS (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) if (!INTEGRAL_TYPE_P (type)
&& !POINTER_TYPE_P (type) && !POINTER_TYPE_P (type)
&& TREE_CODE (type) != OFFSET_TYPE) && TREE_CODE (type) != OFFSET_TYPE)
......
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