aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2019-05-21 12:01:00 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2019-05-21 12:01:00 +0000
commit4f8b89f092467f9550cb2aa873c2e30ac809c08a (patch)
treed44631d84c87d1c813dd1788c15ca29337dbdf91 /gcc/fold-const.c
parent3b0657dce501046ebe11b7ba30653a41221f4797 (diff)
downloadgcc-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.c22
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.