diff options
author | Richard Biener <rguenther@suse.de> | 2019-05-21 12:01:00 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2019-05-21 12:01:00 +0000 |
commit | 4f8b89f092467f9550cb2aa873c2e30ac809c08a (patch) | |
tree | d44631d84c87d1c813dd1788c15ca29337dbdf91 /gcc/fold-const.c | |
parent | 3b0657dce501046ebe11b7ba30653a41221f4797 (diff) | |
download | gcc-4f8b89f092467f9550cb2aa873c2e30ac809c08a.zip gcc-4f8b89f092467f9550cb2aa873c2e30ac809c08a.tar.gz gcc-4f8b89f092467f9550cb2aa873c2e30ac809c08a.tar.bz2 |
re PR tree-optimization/90510 (Unnecessary permutation)
2019-05-21 Richard Biener <rguenther@suse.de>
PR middle-end/90510
* fold-const.c (fold_read_from_vector): New function.
* fold-const.h (fold_read_from_vector): Declare.
* match.pd (VEC_PERM_EXPR): Build BIT_INSERT_EXPRs for
single-element insert permutations. Canonicalize selector
further and fix issue with last commit.
* gcc.target/i386/pr90510.c: New testcase.
From-SVN: r271463
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 3444852..4228901 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -13793,6 +13793,28 @@ fold_read_from_constant_string (tree exp) return NULL; } +/* Folds a read from vector element at IDX of vector ARG. */ + +tree +fold_read_from_vector (tree arg, poly_uint64 idx) +{ + unsigned HOST_WIDE_INT i; + if (known_lt (idx, TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg))) + && known_ge (idx, 0u) + && idx.is_constant (&i)) + { + if (TREE_CODE (arg) == VECTOR_CST) + return VECTOR_CST_ELT (arg, i); + else if (TREE_CODE (arg) == CONSTRUCTOR) + { + if (i >= CONSTRUCTOR_NELTS (arg)) + return build_zero_cst (TREE_TYPE (TREE_TYPE (arg))); + return CONSTRUCTOR_ELT (arg, i)->value; + } + } + return NULL_TREE; +} + /* Return the tree for neg (ARG0) when ARG0 is known to be either an integer constant, real, or fixed-point constant. |