[multiple changes]

2012-06-15  Marc Glisse  <marc.glisse@inria.fr>

	PR c++/51033
	* c-typeck.c (c_build_vec_perm_expr): Move to c-family/c-common.c.
        * c-tree.h (c_build_vec_perm_expr): Move to c-family/c-common.h.

cp/

2012-06-15  Marc Glisse  <marc.glisse@inria.fr>

	PR c++/51033
	* semantics.c (literal_type_p): Handle VECTOR_TYPE.
        (potential_constant_expression_1): Handle VEC_PERM_EXPR.
        * parser.c (cp_parser_postfix_expression): Handle RID_BUILTIN_SHUFFLE.

c-family
2012-06-15  Marc Glisse  <marc.glisse@inria.fr>

	PR c++/51033
	* c-common.h (c_build_vec_perm_expr): Move decl here.
	* c-common.c (c_build_vec_perm_expr): Move definition
	here.

2012-06-15  Ramana Radhakrishnan  <ramana.radhakrishnan@linaro.org>

	PR c++/51033
	* c-c++-common/torture/vshuf-16.inc: Move from gcc.c-torture/execute/.
	* c-c++-common/torture/vshuf-2.inc: Likewise.
	* c-c++-common/torture/vshuf-4.inc: Likewise.
	* c-c++-common/torture/vshuf-8.inc: Likewise.
	* c-c++-common/torture/vshuf-main.inc: Likewise.
	* c-c++-common/torture/vshuf-v16hi.c: Likewise.
	* c-c++-common/torture/vshuf-v16qi.c: Likewise.
	* c-c++-common/torture/vshuf-v2df.c: Likewise.
	* c-c++-common/torture/vshuf-v2di.c: Likewise.
	* c-c++-common/torture/vshuf-v2sf.c: Likewise.
	* c-c++-common/torture/vshuf-v2si.c: Likewise.
	* c-c++-common/torture/vshuf-v4df.c: Likewise.
	* c-c++-common/torture/vshuf-v4di.c: Likewise.
	* c-c++-common/torture/vshuf-v4hi.c: Likewise.
	* c-c++-common/torture/vshuf-v4sf.c: Likewise.
	* c-c++-common/torture/vshuf-v4si.c: Likewise.
	* c-c++-common/torture/vshuf-v8hi.c: Likewise.
	* c-c++-common/torture/vshuf-v8qi.c: Likewise.
	* c-c++-common/torture/vshuf-v8si.c: Likewise.

From-SVN: r188671
This commit is contained in:
Ramana Radhakrishnan 2012-06-15 16:43:36 +00:00
parent eb6bb55998
commit 9e1a8dd161
29 changed files with 180 additions and 94 deletions

View File

@ -1,3 +1,9 @@
2012-06-15 Marc Glisse <marc.glisse@inria.fr>
PR c++/51033
* c-typeck.c (c_build_vec_perm_expr): Move to c-family/c-common.c.
* c-tree.h (c_build_vec_perm_expr): Move to c-family/c-common.h.
2012-06-15 Georg-Johann Lay <avr@gjlay.de>
* config/avr/avr.c (avr_default_expand_builtin): New function.

View File

@ -1,3 +1,10 @@
2012-06-15 Marc Glisse <marc.glisse@inria.fr>
PR c++/51033
* c-common.h (c_build_vec_perm_expr): Move decl here.
* c-common.c (c_build_vec_perm_expr): Move definition
here.
2012-06-06 Steven Bosscher <steven@gcc.gnu.org>
* c.opt (fconserve-space): Turn into a no-op.

View File

@ -430,7 +430,7 @@ const struct c_common_resword c_common_reswords[] =
{ "__bases", RID_BASES, D_CXXONLY },
{ "__builtin_choose_expr", RID_CHOOSE_EXPR, D_CONLY },
{ "__builtin_complex", RID_BUILTIN_COMPLEX, D_CONLY },
{ "__builtin_shuffle", RID_BUILTIN_SHUFFLE, D_CONLY },
{ "__builtin_shuffle", RID_BUILTIN_SHUFFLE, 0 },
{ "__builtin_offsetof", RID_OFFSETOF, 0 },
{ "__builtin_types_compatible_p", RID_TYPES_COMPATIBLE_P, D_CONLY },
{ "__builtin_va_arg", RID_VA_ARG, 0 },
@ -1950,6 +1950,101 @@ vector_types_convertible_p (const_tree t1, const_tree t2, bool emit_lax_note)
return false;
}
/* Build a VEC_PERM_EXPR if V0, V1 and MASK are not error_mark_nodes
and have vector types, V0 has the same type as V1, and the number of
elements of V0, V1, MASK is the same.
In case V1 is a NULL_TREE it is assumed that __builtin_shuffle was
called with two arguments. In this case implementation passes the
first argument twice in order to share the same tree code. This fact
could enable the mask-values being twice the vector length. This is
an implementation accident and this semantics is not guaranteed to
the user. */
tree
c_build_vec_perm_expr (location_t loc, tree v0, tree v1, tree mask)
{
tree ret;
bool wrap = true;
bool maybe_const = false;
bool two_arguments = false;
if (v1 == NULL_TREE)
{
two_arguments = true;
v1 = v0;
}
if (v0 == error_mark_node || v1 == error_mark_node
|| mask == error_mark_node)
return error_mark_node;
if (TREE_CODE (TREE_TYPE (mask)) != VECTOR_TYPE
|| TREE_CODE (TREE_TYPE (TREE_TYPE (mask))) != INTEGER_TYPE)
{
error_at (loc, "__builtin_shuffle last argument must "
"be an integer vector");
return error_mark_node;
}
if (TREE_CODE (TREE_TYPE (v0)) != VECTOR_TYPE
|| TREE_CODE (TREE_TYPE (v1)) != VECTOR_TYPE)
{
error_at (loc, "__builtin_shuffle arguments must be vectors");
return error_mark_node;
}
if (TYPE_MAIN_VARIANT (TREE_TYPE (v0)) != TYPE_MAIN_VARIANT (TREE_TYPE (v1)))
{
error_at (loc, "__builtin_shuffle argument vectors must be of "
"the same type");
return error_mark_node;
}
if (TYPE_VECTOR_SUBPARTS (TREE_TYPE (v0))
!= TYPE_VECTOR_SUBPARTS (TREE_TYPE (mask))
&& TYPE_VECTOR_SUBPARTS (TREE_TYPE (v1))
!= TYPE_VECTOR_SUBPARTS (TREE_TYPE (mask)))
{
error_at (loc, "__builtin_shuffle number of elements of the "
"argument vector(s) and the mask vector should "
"be the same");
return error_mark_node;
}
if (GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (v0))))
!= GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (mask)))))
{
error_at (loc, "__builtin_shuffle argument vector(s) inner type "
"must have the same size as inner type of the mask");
return error_mark_node;
}
if (!c_dialect_cxx ())
{
/* Avoid C_MAYBE_CONST_EXPRs inside VEC_PERM_EXPR. */
v0 = c_fully_fold (v0, false, &maybe_const);
wrap &= maybe_const;
if (two_arguments)
v1 = v0 = save_expr (v0);
else
{
v1 = c_fully_fold (v1, false, &maybe_const);
wrap &= maybe_const;
}
mask = c_fully_fold (mask, false, &maybe_const);
wrap &= maybe_const;
}
ret = build3_loc (loc, VEC_PERM_EXPR, TREE_TYPE (v0), v0, v1, mask);
if (!c_dialect_cxx () && !wrap)
ret = c_wrap_maybe_const (ret, true);
return ret;
}
/* Like tree.c:get_narrower, but retain conversion from C++0x scoped enum
to integral type. */

View File

@ -919,6 +919,7 @@ extern bool lvalue_p (const_tree);
extern bool vector_targets_convertible_p (const_tree t1, const_tree t2);
extern bool vector_types_convertible_p (const_tree t1, const_tree t2, bool emit_lax_note);
extern tree c_build_vec_perm_expr (location_t, tree, tree, tree);
extern rtx c_expand_expr (tree, rtx, enum machine_mode, int, rtx *);

View File

@ -645,7 +645,6 @@ extern tree c_finish_omp_task (location_t, tree, tree);
extern tree c_finish_omp_clauses (tree);
extern tree c_build_va_arg (location_t, tree, tree);
extern tree c_finish_transaction (location_t, tree, int);
extern tree c_build_vec_perm_expr (location_t, tree, tree, tree);
/* Set to 0 at beginning of a function definition, set to 1 if
a return statement that specifies a return value is seen. */

View File

@ -2866,98 +2866,6 @@ build_function_call_vec (location_t loc, tree function, VEC(tree,gc) *params,
}
return require_complete_type (result);
}
/* Build a VEC_PERM_EXPR if V0, V1 and MASK are not error_mark_nodes
and have vector types, V0 has the same type as V1, and the number of
elements of V0, V1, MASK is the same.
In case V1 is a NULL_TREE it is assumed that __builtin_shuffle was
called with two arguments. In this case implementation passes the
first argument twice in order to share the same tree code. This fact
could enable the mask-values being twice the vector length. This is
an implementation accident and this semantics is not guaranteed to
the user. */
tree
c_build_vec_perm_expr (location_t loc, tree v0, tree v1, tree mask)
{
tree ret;
bool wrap = true;
bool maybe_const = false;
bool two_arguments = false;
if (v1 == NULL_TREE)
{
two_arguments = true;
v1 = v0;
}
if (v0 == error_mark_node || v1 == error_mark_node
|| mask == error_mark_node)
return error_mark_node;
if (TREE_CODE (TREE_TYPE (mask)) != VECTOR_TYPE
|| TREE_CODE (TREE_TYPE (TREE_TYPE (mask))) != INTEGER_TYPE)
{
error_at (loc, "__builtin_shuffle last argument must "
"be an integer vector");
return error_mark_node;
}
if (TREE_CODE (TREE_TYPE (v0)) != VECTOR_TYPE
|| TREE_CODE (TREE_TYPE (v1)) != VECTOR_TYPE)
{
error_at (loc, "__builtin_shuffle arguments must be vectors");
return error_mark_node;
}
if (TYPE_MAIN_VARIANT (TREE_TYPE (v0)) != TYPE_MAIN_VARIANT (TREE_TYPE (v1)))
{
error_at (loc, "__builtin_shuffle argument vectors must be of "
"the same type");
return error_mark_node;
}
if (TYPE_VECTOR_SUBPARTS (TREE_TYPE (v0))
!= TYPE_VECTOR_SUBPARTS (TREE_TYPE (mask))
&& TYPE_VECTOR_SUBPARTS (TREE_TYPE (v1))
!= TYPE_VECTOR_SUBPARTS (TREE_TYPE (mask)))
{
error_at (loc, "__builtin_shuffle number of elements of the "
"argument vector(s) and the mask vector should "
"be the same");
return error_mark_node;
}
if (GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (v0))))
!= GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (mask)))))
{
error_at (loc, "__builtin_shuffle argument vector(s) inner type "
"must have the same size as inner type of the mask");
return error_mark_node;
}
/* Avoid C_MAYBE_CONST_EXPRs inside VEC_PERM_EXPR. */
v0 = c_fully_fold (v0, false, &maybe_const);
wrap &= maybe_const;
if (two_arguments)
v1 = v0 = save_expr (v0);
else
{
v1 = c_fully_fold (v1, false, &maybe_const);
wrap &= maybe_const;
}
mask = c_fully_fold (mask, false, &maybe_const);
wrap &= maybe_const;
ret = build3_loc (loc, VEC_PERM_EXPR, TREE_TYPE (v0), v0, v1, mask);
if (!wrap)
ret = c_wrap_maybe_const (ret, true);
return ret;
}
/* Convert the argument expressions in the vector VALUES
to the types in the list TYPELIST.

View File

@ -1,3 +1,10 @@
2012-06-15 Marc Glisse <marc.glisse@inria.fr>
PR c++/51033
* semantics.c (literal_type_p): Handle VECTOR_TYPE.
(potential_constant_expression_1): Handle VEC_PERM_EXPR.
* parser.c (cp_parser_postfix_expression): Handle RID_BUILTIN_SHUFFLE.
2012-06-09 Jason Merrill <jason@redhat.com>
* pt.c (tsubst_expr) [TAG_DEFN]: Instantiate local class.

View File

@ -5448,6 +5448,44 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
}
break;
case RID_BUILTIN_SHUFFLE:
{
VEC(tree,gc)* vec;
unsigned int i;
tree p;
location_t loc = token->location;
cp_lexer_consume_token (parser->lexer);
vec = cp_parser_parenthesized_expression_list (parser, non_attr,
/*cast_p=*/false, /*allow_expansion_p=*/true,
/*non_constant_p=*/NULL);
if (vec == NULL)
return error_mark_node;
FOR_EACH_VEC_ELT (tree, vec, i, p)
mark_exp_read (p);
if (VEC_length (tree, vec) == 2)
return
c_build_vec_perm_expr
(loc, VEC_index (tree, vec, 0),
NULL_TREE, VEC_index (tree, vec, 1));
else if (VEC_length (tree, vec) == 3)
return
c_build_vec_perm_expr
(loc, VEC_index (tree, vec, 0),
VEC_index (tree, vec, 1),
VEC_index (tree, vec, 2));
else
{
error_at (loc, "wrong number of arguments to "
"%<__builtin_shuffle%>");
return error_mark_node;
}
break;
}
default:
{
tree type;

View File

@ -5622,6 +5622,7 @@ bool
literal_type_p (tree t)
{
if (SCALAR_TYPE_P (t)
|| TREE_CODE (t) == VECTOR_TYPE
|| TREE_CODE (t) == REFERENCE_TYPE)
return true;
if (CLASS_TYPE_P (t))
@ -8505,6 +8506,7 @@ potential_constant_expression_1 (tree t, bool want_rval, tsubst_flags_t flags)
return true;
case FMA_EXPR:
case VEC_PERM_EXPR:
for (i = 0; i < 3; ++i)
if (!potential_constant_expression_1 (TREE_OPERAND (t, i),
true, flags))

View File

@ -1,3 +1,26 @@
2012-06-15 Ramana Radhakrishnan <ramana.radhakrishnan@linaro.org>
PR c++/51033
* c-c++-common/torture/vshuf-16.inc: Move from gcc.c-torture/execute/.
* c-c++-common/torture/vshuf-2.inc: Likewise.
* c-c++-common/torture/vshuf-4.inc: Likewise.
* c-c++-common/torture/vshuf-8.inc: Likewise.
* c-c++-common/torture/vshuf-main.inc: Likewise.
* c-c++-common/torture/vshuf-v16hi.c: Likewise.
* c-c++-common/torture/vshuf-v16qi.c: Likewise.
* c-c++-common/torture/vshuf-v2df.c: Likewise.
* c-c++-common/torture/vshuf-v2di.c: Likewise.
* c-c++-common/torture/vshuf-v2sf.c: Likewise.
* c-c++-common/torture/vshuf-v2si.c: Likewise.
* c-c++-common/torture/vshuf-v4df.c: Likewise.
* c-c++-common/torture/vshuf-v4di.c: Likewise.
* c-c++-common/torture/vshuf-v4hi.c: Likewise.
* c-c++-common/torture/vshuf-v4sf.c: Likewise.
* c-c++-common/torture/vshuf-v4si.c: Likewise.
* c-c++-common/torture/vshuf-v8hi.c: Likewise.
* c-c++-common/torture/vshuf-v8qi.c: Likewise.
* c-c++-common/torture/vshuf-v8si.c: Likewise.
2012-06-15 Michael Matz <matz@suse.de>
* gcc.dg/tree-ssa/vector-4.c: New test.