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/fold-const.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/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 25 |
1 files changed, 6 insertions, 19 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 47ed609..7c5b75a 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -11968,26 +11968,13 @@ fold (tree expr) if (TREE_CODE (type) != VECTOR_TYPE) return t; - tree *vec = XALLOCAVEC (tree, TYPE_VECTOR_SUBPARTS (type)); - unsigned HOST_WIDE_INT idx, pos = 0; - tree value; - - FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (t), idx, value) - { - if (!CONSTANT_CLASS_P (value)) - 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)); + unsigned i; + tree val; + FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (t), i, val) + if (! CONSTANT_CLASS_P (val)) + return t; - return build_vector (type, vec); + return build_vector_from_ctor (type, CONSTRUCTOR_ELTS (t)); } case CONST_DECL: |