diff options
author | Richard Biener <rguenther@suse.de> | 2015-10-30 12:18:34 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2015-10-30 12:18:34 +0000 |
commit | 7524f419ae7935594e7ec85daf7cdf736a835b04 (patch) | |
tree | 3269624dbefe5c8fadf56f8111a9ab750dc67096 /gcc/gimple-fold.c | |
parent | 04e3481107705d98ecd442657ee0b6b594e53b78 (diff) | |
download | gcc-7524f419ae7935594e7ec85daf7cdf736a835b04.zip gcc-7524f419ae7935594e7ec85daf7cdf736a835b04.tar.gz gcc-7524f419ae7935594e7ec85daf7cdf736a835b04.tar.bz2 |
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
Diffstat (limited to 'gcc/gimple-fold.c')
-rw-r--r-- | gcc/gimple-fold.c | 37 |
1 files changed, 15 insertions, 22 deletions
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index 9760b8a..13a6219 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -354,8 +354,8 @@ fold_gimple_assign (gimple_stmt_iterator *si) return val; } } - } + else if (TREE_CODE (rhs) == ADDR_EXPR) { tree ref = TREE_OPERAND (rhs, 0); @@ -370,21 +370,29 @@ fold_gimple_assign (gimple_stmt_iterator *si) else if (TREE_CODE (ref) == MEM_REF && integer_zerop (TREE_OPERAND (ref, 1))) 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 - && TREE_CODE (TREE_TYPE (rhs)) == VECTOR_TYPE - && (CONSTRUCTOR_NELTS (rhs) - == TYPE_VECTOR_SUBPARTS (TREE_TYPE (rhs)))) + && TREE_CODE (TREE_TYPE (rhs)) == VECTOR_TYPE) { /* Fold a constant vector CONSTRUCTOR to VECTOR_CST. */ unsigned i; tree val; FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (rhs), i, val) - if (TREE_CODE (val) != INTEGER_CST - && TREE_CODE (val) != REAL_CST - && TREE_CODE (val) != FIXED_CST) + if (! CONSTANT_CLASS_P (val)) return NULL_TREE; return build_vector_from_ctor (TREE_TYPE (rhs), @@ -393,21 +401,6 @@ fold_gimple_assign (gimple_stmt_iterator *si) else if (DECL_P (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; |