aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-generic.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2012-09-28 14:18:57 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2012-09-28 14:18:57 +0200
commit4a2c20ccfabd9bcfe0293c274312a424971d0bc0 (patch)
treeed78d34a78eb25b4804dcb75880712505ce51a5f /gcc/tree-vect-generic.c
parent1a910f8f264f9ab3cc05c2ad13158201fff8b948 (diff)
downloadgcc-4a2c20ccfabd9bcfe0293c274312a424971d0bc0.zip
gcc-4a2c20ccfabd9bcfe0293c274312a424971d0bc0.tar.gz
gcc-4a2c20ccfabd9bcfe0293c274312a424971d0bc0.tar.bz2
re PR tree-optimization/54713 (error: non-trivial conversion at assignment in gcc.c-torture/compile/pr53410-2.c)
PR tree-optimization/54713 * fold-const.c (vec_cst_ctor_to_array): Give up if vector CONSTRUCTOR has vector elements. (fold_ternary_loc) <case BIT_FIELD_REF>: Likewise. * tree-vect-generic.c (vector_element): Don't rely on CONSTRUCTOR elts indexes. Use BIT_FIELD_REF if CONSTRUCTOR has vector elements. (lower_vec_perm): Use NULL_TREE CONSTRUCTOR indexes. * gcc.c-torture/compile/pr54713-1.c: New test. * gcc.c-torture/compile/pr54713-2.c: New test. * gcc.c-torture/compile/pr54713-3.c: New test. From-SVN: r191826
Diffstat (limited to 'gcc/tree-vect-generic.c')
-rw-r--r--gcc/tree-vect-generic.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c
index 85fb3a2..d950d81 100644
--- a/gcc/tree-vect-generic.c
+++ b/gcc/tree-vect-generic.c
@@ -1050,14 +1050,13 @@ vector_element (gimple_stmt_iterator *gsi, tree vect, tree idx, tree *ptmpvec)
if (TREE_CODE (vect) == VECTOR_CST)
return VECTOR_CST_ELT (vect, index);
- else if (TREE_CODE (vect) == CONSTRUCTOR)
+ else if (TREE_CODE (vect) == CONSTRUCTOR
+ && (CONSTRUCTOR_NELTS (vect) == 0
+ || TREE_CODE (TREE_TYPE (CONSTRUCTOR_ELT (vect, 0)->value))
+ != VECTOR_TYPE))
{
- unsigned i;
- tree elt_i, elt_v;
-
- FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (vect), i, elt_i, elt_v)
- if (operand_equal_p (elt_i, idx, 0))
- return elt_v;
+ if (index < CONSTRUCTOR_NELTS (vect))
+ return CONSTRUCTOR_ELT (vect, index)->value;
return build_zero_cst (vect_elt_type);
}
else
@@ -1215,7 +1214,7 @@ lower_vec_perm (gimple_stmt_iterator *gsi)
t = v0_val;
}
- CONSTRUCTOR_APPEND_ELT (v, si, t);
+ CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, t);
}
constr = build_constructor (vect_type, v);