Commit 13396b6e by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/54713 (error: non-trivial conversion at assignment in…

re PR tree-optimization/54713 (error: non-trivial conversion at assignment in gcc.c-torture/compile/pr53410-2.c)

	PR tree-optimization/54713
	* expr.c (categorize_ctor_elements_1): Don't assume purpose is
	non-NULL.
	* tree-cfg.c (verify_gimple_assign_single): Add verification of
	vector CONSTRUCTORs.
	* tree-ssa-sccvn.c (vn_reference_lookup_3): For VECTOR_TYPE
	CONSTRUCTORs, don't do anything if element type is VECTOR_TYPE,
	and don't check index.
	* tree-vect-slp.c (vect_get_constant_vectors): VIEW_CONVERT_EXPR
	ctor elements first if their type isn't compatible with vector
	element type.

From-SVN: r191983
parent faf86a02
2012-10-02 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/54713
* expr.c (categorize_ctor_elements_1): Don't assume purpose is
non-NULL.
* tree-cfg.c (verify_gimple_assign_single): Add verification of
vector CONSTRUCTORs.
* tree-ssa-sccvn.c (vn_reference_lookup_3): For VECTOR_TYPE
CONSTRUCTORs, don't do anything if element type is VECTOR_TYPE,
and don't check index.
* tree-vect-slp.c (vect_get_constant_vectors): VIEW_CONVERT_EXPR
ctor elements first if their type isn't compatible with vector
element type.
2012-10-02 Eric Botcazou <ebotcazou@adacore.com> 2012-10-02 Eric Botcazou <ebotcazou@adacore.com>
* tree.h (DECL_NONLOCAL_FRAME): New macro. * tree.h (DECL_NONLOCAL_FRAME): New macro.
......
...@@ -5491,7 +5491,7 @@ categorize_ctor_elements_1 (const_tree ctor, HOST_WIDE_INT *p_nz_elts, ...@@ -5491,7 +5491,7 @@ categorize_ctor_elements_1 (const_tree ctor, HOST_WIDE_INT *p_nz_elts,
{ {
HOST_WIDE_INT mult = 1; HOST_WIDE_INT mult = 1;
if (TREE_CODE (purpose) == RANGE_EXPR) if (purpose && TREE_CODE (purpose) == RANGE_EXPR)
{ {
tree lo_index = TREE_OPERAND (purpose, 0); tree lo_index = TREE_OPERAND (purpose, 0);
tree hi_index = TREE_OPERAND (purpose, 1); tree hi_index = TREE_OPERAND (purpose, 1);
......
...@@ -4000,6 +4000,80 @@ verify_gimple_assign_single (gimple stmt) ...@@ -4000,6 +4000,80 @@ verify_gimple_assign_single (gimple stmt)
return res; return res;
case CONSTRUCTOR: case CONSTRUCTOR:
if (TREE_CODE (rhs1_type) == VECTOR_TYPE)
{
unsigned int i;
tree elt_i, elt_v, elt_t = NULL_TREE;
if (CONSTRUCTOR_NELTS (rhs1) == 0)
return res;
/* For vector CONSTRUCTORs we require that either it is empty
CONSTRUCTOR, or it is a CONSTRUCTOR of smaller vector elements
(then the element count must be correct to cover the whole
outer vector and index must be NULL on all elements, or it is
a CONSTRUCTOR of scalar elements, where we as an exception allow
smaller number of elements (assuming zero filling) and
consecutive indexes as compared to NULL indexes (such
CONSTRUCTORs can appear in the IL from FEs). */
FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (rhs1), i, elt_i, elt_v)
{
if (elt_t == NULL_TREE)
{
elt_t = TREE_TYPE (elt_v);
if (TREE_CODE (elt_t) == VECTOR_TYPE)
{
tree elt_t = TREE_TYPE (elt_v);
if (!useless_type_conversion_p (TREE_TYPE (rhs1_type),
TREE_TYPE (elt_t)))
{
error ("incorrect type of vector CONSTRUCTOR"
" elements");
debug_generic_stmt (rhs1);
return true;
}
else if (CONSTRUCTOR_NELTS (rhs1)
* TYPE_VECTOR_SUBPARTS (elt_t)
!= TYPE_VECTOR_SUBPARTS (rhs1_type))
{
error ("incorrect number of vector CONSTRUCTOR"
" elements");
debug_generic_stmt (rhs1);
return true;
}
}
else if (!useless_type_conversion_p (TREE_TYPE (rhs1_type),
elt_t))
{
error ("incorrect type of vector CONSTRUCTOR elements");
debug_generic_stmt (rhs1);
return true;
}
else if (CONSTRUCTOR_NELTS (rhs1)
> TYPE_VECTOR_SUBPARTS (rhs1_type))
{
error ("incorrect number of vector CONSTRUCTOR elements");
debug_generic_stmt (rhs1);
return true;
}
}
else if (!useless_type_conversion_p (elt_t, TREE_TYPE (elt_v)))
{
error ("incorrect type of vector CONSTRUCTOR elements");
debug_generic_stmt (rhs1);
return true;
}
if (elt_i != NULL_TREE
&& (TREE_CODE (elt_t) == VECTOR_TYPE
|| TREE_CODE (elt_i) != INTEGER_CST
|| compare_tree_int (elt_i, i) != 0))
{
error ("vector CONSTRUCTOR with non-NULL element index");
debug_generic_stmt (rhs1);
return true;
}
}
}
return res;
case OBJ_TYPE_REF: case OBJ_TYPE_REF:
case ASSERT_EXPR: case ASSERT_EXPR:
case WITH_SIZE_EXPR: case WITH_SIZE_EXPR:
......
/* SCC value numbering for trees /* SCC value numbering for trees
Copyright (C) 2006, 2007, 2008, 2009, 2010 Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012
Free Software Foundation, Inc. Free Software Foundation, Inc.
Contributed by Daniel Berlin <dan@dberlin.org> Contributed by Daniel Berlin <dan@dberlin.org>
...@@ -1639,10 +1639,14 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_) ...@@ -1639,10 +1639,14 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_)
if (i < CONSTRUCTOR_NELTS (ctor)) if (i < CONSTRUCTOR_NELTS (ctor))
{ {
constructor_elt *elt = CONSTRUCTOR_ELT (ctor, i); constructor_elt *elt = CONSTRUCTOR_ELT (ctor, i);
if (compare_tree_int (elt->index, i) == 0) if (TREE_CODE (TREE_TYPE (rhs1)) == VECTOR_TYPE)
{
if (TREE_CODE (TREE_TYPE (elt->value))
!= VECTOR_TYPE)
val = elt->value; val = elt->value;
} }
} }
}
if (val) if (val)
return vn_reference_lookup_or_insert_for_pieces return vn_reference_lookup_or_insert_for_pieces
(vuse, vr->set, vr->type, vr->operands, val); (vuse, vr->set, vr->type, vr->operands, val);
......
...@@ -2345,6 +2345,7 @@ vect_get_constant_vectors (tree op, slp_tree slp_node, ...@@ -2345,6 +2345,7 @@ vect_get_constant_vectors (tree op, slp_tree slp_node,
enum tree_code code = gimple_expr_code (stmt); enum tree_code code = gimple_expr_code (stmt);
gimple def_stmt; gimple def_stmt;
struct loop *loop; struct loop *loop;
gimple_seq ctor_seq = NULL;
if (STMT_VINFO_DEF_TYPE (stmt_vinfo) == vect_reduction_def if (STMT_VINFO_DEF_TYPE (stmt_vinfo) == vect_reduction_def
&& reduc_index != -1) && reduc_index != -1)
...@@ -2503,12 +2504,28 @@ vect_get_constant_vectors (tree op, slp_tree slp_node, ...@@ -2503,12 +2504,28 @@ vect_get_constant_vectors (tree op, slp_tree slp_node,
/* Create 'vect_ = {op0,op1,...,opn}'. */ /* Create 'vect_ = {op0,op1,...,opn}'. */
number_of_places_left_in_vector--; number_of_places_left_in_vector--;
if (constant_p if (!types_compatible_p (TREE_TYPE (vector_type), TREE_TYPE (op)))
&& !types_compatible_p (TREE_TYPE (vector_type), TREE_TYPE (op)))
{ {
op = fold_unary (VIEW_CONVERT_EXPR, TREE_TYPE (vector_type), op); if (constant_p)
{
op = fold_unary (VIEW_CONVERT_EXPR,
TREE_TYPE (vector_type), op);
gcc_assert (op && CONSTANT_CLASS_P (op)); gcc_assert (op && CONSTANT_CLASS_P (op));
} }
else
{
tree new_temp
= make_ssa_name (TREE_TYPE (vector_type), NULL);
gimple init_stmt;
op = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (vector_type),
op);
init_stmt
= gimple_build_assign_with_ops (VIEW_CONVERT_EXPR,
new_temp, op, NULL_TREE);
gimple_seq_add_stmt (&ctor_seq, init_stmt);
op = new_temp;
}
}
elts[number_of_places_left_in_vector] = op; elts[number_of_places_left_in_vector] = op;
if (number_of_places_left_in_vector == 0) if (number_of_places_left_in_vector == 0)
...@@ -2529,6 +2546,15 @@ vect_get_constant_vectors (tree op, slp_tree slp_node, ...@@ -2529,6 +2546,15 @@ vect_get_constant_vectors (tree op, slp_tree slp_node,
VEC_quick_push (tree, voprnds, VEC_quick_push (tree, voprnds,
vect_init_vector (stmt, vec_cst, vect_init_vector (stmt, vec_cst,
vector_type, NULL)); vector_type, NULL));
if (ctor_seq != NULL)
{
gimple init_stmt
= SSA_NAME_DEF_STMT (VEC_last (tree, voprnds));
gimple_stmt_iterator gsi = gsi_for_stmt (init_stmt);
gsi_insert_seq_before_without_update (&gsi, ctor_seq,
GSI_SAME_STMT);
ctor_seq = NULL;
}
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment