From 057cf66ca3d290e0f68f66eba0e43379cb77f870 Mon Sep 17 00:00:00 2001 From: Marc Glisse Date: Tue, 2 Oct 2018 16:55:39 +0200 Subject: [PATCH] No a*x+b*x factorization for signed vectors 2018-10-02 Marc Glisse 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 --- gcc/ChangeLog | 6 ++++++ gcc/fold-const.c | 2 +- gcc/tree.c | 13 ++++++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 59a01f86436..236f70c52e0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-10-02 Marc Glisse + + 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 * gimple-fold.c (get_range_strlen): Remove dead code. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 3a6d1b19b48..59cedeafd71 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -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) diff --git a/gcc/tree.c b/gcc/tree.c index d52f8777392..748ece690ea 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -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) -- 2.30.2