re PR c++/54427 (Expose more vector extensions)

2012-09-14  Marc Glisse  <marc.glisse@inria.fr>
	PR c++/54427

gcc/ChangeLog
	* fold-const.c (fold_unary_loc): Disable for VECTOR_TYPE.
	(fold_binary_loc): Likewise.
	* gimple-fold.c (and_comparisons_1): Handle VECTOR_TYPE.
	(or_comparisons_1): Likewise.

gcc/cp/ChangeLog
	* typeck.c (cp_build_binary_op) [LSHIFT_EXPR, RSHIFT_EXPR, EQ_EXPR,
	NE_EXPR, LE_EXPR, GE_EXPR, LT_EXPR, GT_EXPR]: Handle VECTOR_TYPE.

gcc/testsuite/ChangeLog
	* g++.dg/other/vector-compare.C: New testcase.
	* gcc/testsuite/c-c++-common/vector-compare-3.c: New testcase.
	* gcc.dg/vector-shift.c: Move ...
	* c-c++-common/vector-shift.c: ... here.
	* gcc.dg/vector-shift1.c: Move ...
	* c-c++-common/vector-shift1.c: ... here.
	* gcc.dg/vector-shift3.c: Move ...
	* c-c++-common/vector-shift3.c: ... here.
	* gcc.dg/vector-compare-1.c: Move ...
	* c-c++-common/vector-compare-1.c: ... here.
	* gcc.dg/vector-compare-2.c: Move ...
	* c-c++-common/vector-compare-2.c: ... here.
	* gcc.c-torture/execute/vector-compare-1.c: Move ...
	* c-c++-common/torture/vector-compare-1.c: ... here.
	* gcc.c-torture/execute/vector-compare-2.x: Delete.
	* gcc.c-torture/execute/vector-compare-2.c: Move ...
	* c-c++-common/torture/vector-compare-2.c: ... here.
	* gcc.c-torture/execute/vector-shift.c: Move ...
	* c-c++-common/torture/vector-shift.c: ... here.
	* gcc.c-torture/execute/vector-shift2.c: Move ...
	* c-c++-common/torture/vector-shift2.c: ... here.
	* gcc.c-torture/execute/vector-subscript-1.c: Move ...
	* c-c++-common/torture/vector-subscript-1.c: ... here.
	* gcc.c-torture/execute/vector-subscript-2.c: Move ...
	* c-c++-common/torture/vector-subscript-2.c: ... here.
	* gcc.c-torture/execute/vector-subscript-3.c: Move ...
	* c-c++-common/torture/vector-subscript-3.c: ... here.

From-SVN: r191308
This commit is contained in:
Marc Glisse 2012-09-14 19:17:01 +02:00 committed by Marc Glisse
parent 0290430b75
commit 31ed622658
21 changed files with 206 additions and 24 deletions

View File

@ -1,3 +1,11 @@
2012-09-14 Marc Glisse <marc.glisse@inria.fr>
PR c++/54427
* fold-const.c (fold_unary_loc): Disable for VECTOR_TYPE.
(fold_binary_loc): Likewise.
* gimple-fold.c (and_comparisons_1): Handle VECTOR_TYPE.
(or_comparisons_1): Likewise.
2012-09-14 Richard Earnshaw <rearnsha@arm.com>
PR target/54516

View File

@ -1,3 +1,9 @@
2012-09-14 Marc Glisse <marc.glisse@inria.fr>
PR c++/54427
* typeck.c (cp_build_binary_op) [LSHIFT_EXPR, RSHIFT_EXPR, EQ_EXPR,
NE_EXPR, LE_EXPR, GE_EXPR, LT_EXPR, GT_EXPR]: Handle VECTOR_TYPE.
2012-09-14 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (make_typename_type): Only error out if tf_error is set

View File

@ -3985,7 +3985,15 @@ cp_build_binary_op (location_t location,
Also set SHORT_SHIFT if shifting rightward. */
case RSHIFT_EXPR:
if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE
&& TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE
&& TREE_CODE (TREE_TYPE (type1)) == INTEGER_TYPE
&& TYPE_VECTOR_SUBPARTS (type0) == TYPE_VECTOR_SUBPARTS (type1))
{
result_type = type0;
converted = 1;
}
else if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
{
result_type = type0;
if (TREE_CODE (op1) == INTEGER_CST)
@ -4014,7 +4022,15 @@ cp_build_binary_op (location_t location,
break;
case LSHIFT_EXPR:
if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE
&& TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE
&& TREE_CODE (TREE_TYPE (type1)) == INTEGER_TYPE
&& TYPE_VECTOR_SUBPARTS (type0) == TYPE_VECTOR_SUBPARTS (type1))
{
result_type = type0;
converted = 1;
}
else if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
{
result_type = type0;
if (TREE_CODE (op1) == INTEGER_CST)
@ -4072,6 +4088,8 @@ cp_build_binary_op (location_t location,
case EQ_EXPR:
case NE_EXPR:
if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE)
goto vector_compare;
if ((complain & tf_warning)
&& (FLOAT_TYPE_P (type0) || FLOAT_TYPE_P (type1)))
warning (OPT_Wfloat_equal,
@ -4314,6 +4332,35 @@ cp_build_binary_op (location_t location,
warning (OPT_Waddress, "comparison with string literal results in unspecified behaviour");
}
if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE)
{
vector_compare:
tree intt;
if (!same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (type0),
TREE_TYPE (type1)))
{
error_at (location, "comparing vectors with different "
"element types");
inform (location, "operand types are %qT and %qT", type0, type1);
return error_mark_node;
}
if (TYPE_VECTOR_SUBPARTS (type0) != TYPE_VECTOR_SUBPARTS (type1))
{
error_at (location, "comparing vectors with different "
"number of elements");
inform (location, "operand types are %qT and %qT", type0, type1);
return error_mark_node;
}
/* Always construct signed integer vector type. */
intt = c_common_type_for_size (GET_MODE_BITSIZE
(TYPE_MODE (TREE_TYPE (type0))), 0);
result_type = build_opaque_vector_type (intt,
TYPE_VECTOR_SUBPARTS (type0));
converted = 1;
break;
}
build_type = boolean_type_node;
if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
|| code0 == ENUMERAL_TYPE)

View File

@ -7771,7 +7771,7 @@ fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0)
return build2_loc (loc, TREE_CODE (op0), type,
TREE_OPERAND (op0, 0),
TREE_OPERAND (op0, 1));
else if (!INTEGRAL_TYPE_P (type))
else if (!INTEGRAL_TYPE_P (type) && TREE_CODE (type) != VECTOR_TYPE)
return build3_loc (loc, COND_EXPR, type, op0,
constant_boolean_node (true, type),
constant_boolean_node (false, type));
@ -9829,6 +9829,7 @@ fold_binary_loc (location_t loc,
if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
|| code == EQ_EXPR || code == NE_EXPR)
&& TREE_CODE (type) != VECTOR_TYPE
&& ((truth_value_p (TREE_CODE (arg0))
&& (truth_value_p (TREE_CODE (arg1))
|| (TREE_CODE (arg1) == BIT_AND_EXPR

View File

@ -30,6 +30,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-ssa-propagate.h"
#include "target.h"
#include "gimple-fold.h"
#include "langhooks.h"
/* Return true when DECL can be referenced from current unit.
FROM_DECL (if non-null) specify constructor of variable DECL was taken from.
@ -1692,6 +1693,16 @@ static tree
and_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
enum tree_code code2, tree op2a, tree op2b)
{
tree truth_type = boolean_type_node;
if (TREE_CODE (TREE_TYPE (op1a)) == VECTOR_TYPE)
{
tree vec_type = TREE_TYPE (op1a);
tree elem = lang_hooks.types.type_for_size
(GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (vec_type))), 0);
truth_type = build_opaque_vector_type (elem,
TYPE_VECTOR_SUBPARTS (vec_type));
}
/* First check for ((x CODE1 y) AND (x CODE2 y)). */
if (operand_equal_p (op1a, op2a, 0)
&& operand_equal_p (op1b, op2b, 0))
@ -1699,7 +1710,7 @@ and_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
/* Result will be either NULL_TREE, or a combined comparison. */
tree t = combine_comparisons (UNKNOWN_LOCATION,
TRUTH_ANDIF_EXPR, code1, code2,
boolean_type_node, op1a, op1b);
truth_type, op1a, op1b);
if (t)
return t;
}
@ -1712,7 +1723,7 @@ and_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
tree t = combine_comparisons (UNKNOWN_LOCATION,
TRUTH_ANDIF_EXPR, code1,
swap_tree_comparison (code2),
boolean_type_node, op1a, op1b);
truth_type, op1a, op1b);
if (t)
return t;
}
@ -2154,6 +2165,16 @@ static tree
or_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
enum tree_code code2, tree op2a, tree op2b)
{
tree truth_type = boolean_type_node;
if (TREE_CODE (TREE_TYPE (op1a)) == VECTOR_TYPE)
{
tree vec_type = TREE_TYPE (op1a);
tree elem = lang_hooks.types.type_for_size
(GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (vec_type))), 0);
truth_type = build_opaque_vector_type (elem,
TYPE_VECTOR_SUBPARTS (vec_type));
}
/* First check for ((x CODE1 y) OR (x CODE2 y)). */
if (operand_equal_p (op1a, op2a, 0)
&& operand_equal_p (op1b, op2b, 0))
@ -2161,7 +2182,7 @@ or_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
/* Result will be either NULL_TREE, or a combined comparison. */
tree t = combine_comparisons (UNKNOWN_LOCATION,
TRUTH_ORIF_EXPR, code1, code2,
boolean_type_node, op1a, op1b);
truth_type, op1a, op1b);
if (t)
return t;
}
@ -2174,7 +2195,7 @@ or_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
tree t = combine_comparisons (UNKNOWN_LOCATION,
TRUTH_ORIF_EXPR, code1,
swap_tree_comparison (code2),
boolean_type_node, op1a, op1b);
truth_type, op1a, op1b);
if (t)
return t;
}

View File

@ -1,3 +1,34 @@
2012-09-14 Marc Glisse <marc.glisse@inria.fr>
PR c++/54427
* g++.dg/other/vector-compare.C: New testcase.
* gcc/testsuite/c-c++-common/vector-compare-3.c: New testcase.
* gcc.dg/vector-shift.c: Move ...
* c-c++-common/vector-shift.c: ... here.
* gcc.dg/vector-shift1.c: Move ...
* c-c++-common/vector-shift1.c: ... here.
* gcc.dg/vector-shift3.c: Move ...
* c-c++-common/vector-shift3.c: ... here.
* gcc.dg/vector-compare-1.c: Move ...
* c-c++-common/vector-compare-1.c: ... here.
* gcc.dg/vector-compare-2.c: Move ...
* c-c++-common/vector-compare-2.c: ... here.
* gcc.c-torture/execute/vector-compare-1.c: Move ...
* c-c++-common/torture/vector-compare-1.c: ... here.
* gcc.c-torture/execute/vector-compare-2.x: Delete.
* gcc.c-torture/execute/vector-compare-2.c: Move ...
* c-c++-common/torture/vector-compare-2.c: ... here.
* gcc.c-torture/execute/vector-shift.c: Move ...
* c-c++-common/torture/vector-shift.c: ... here.
* gcc.c-torture/execute/vector-shift2.c: Move ...
* c-c++-common/torture/vector-shift2.c: ... here.
* gcc.c-torture/execute/vector-subscript-1.c: Move ...
* c-c++-common/torture/vector-subscript-1.c: ... here.
* gcc.c-torture/execute/vector-subscript-2.c: Move ...
* c-c++-common/torture/vector-subscript-2.c: ... here.
* gcc.c-torture/execute/vector-subscript-3.c: Move ...
* c-c++-common/torture/vector-subscript-3.c: ... here.
2012-09-14 Joseph Myers <joseph@codesourcery.com>
PR c/54103

View File

@ -1,3 +1,4 @@
/* { dg-do run } */
#define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type
@ -38,7 +39,7 @@ int main (int argc, char *argv[]) {
vector (4, int) ires;
int i;
i0 = (vector (4, INT)){argc, 1, 2, 10};
i0 = (vector (4, INT)){(INT)argc, 1, 2, 10};
i1 = (vector (4, INT)){0, 3, 2, (INT)-23};
test (4, i0, i1, ires, "%i");
#undef INT
@ -48,7 +49,7 @@ int main (int argc, char *argv[]) {
vector (4, INT) u0;
vector (4, INT) u1;
u0 = (vector (4, INT)){argc, 1, 2, 10};
u0 = (vector (4, INT)){(INT)argc, 1, 2, 10};
u1 = (vector (4, INT)){0, 3, 2, (INT)-23};
test (4, u0, u1, ures, "%u");
#undef INT
@ -59,7 +60,7 @@ int main (int argc, char *argv[]) {
vector (8, SHORT) s1;
vector (8, short) sres;
s0 = (vector (8, SHORT)){argc, 1, 2, 10, 6, 87, (SHORT)-5, 2};
s0 = (vector (8, SHORT)){(SHORT)argc, 1, 2, 10, 6, 87, (SHORT)-5, 2};
s1 = (vector (8, SHORT)){0, 3, 2, (SHORT)-23, 12, 10, (SHORT)-2, 0};
test (8, s0, s1, sres, "%i");
#undef SHORT
@ -69,7 +70,7 @@ int main (int argc, char *argv[]) {
vector (8, SHORT) us1;
vector (8, short) usres;
us0 = (vector (8, SHORT)){argc, 1, 2, 10, 6, 87, (SHORT)-5, 2};
us0 = (vector (8, SHORT)){(SHORT)argc, 1, 2, 10, 6, 87, (SHORT)-5, 2};
us1 = (vector (8, SHORT)){0, 3, 2, (SHORT)-23, 12, 10, (SHORT)-2, 0};
test (8, us0, us1, usres, "%u");
#undef SHORT
@ -79,8 +80,8 @@ int main (int argc, char *argv[]) {
vector (16, CHAR) c1;
vector (16, signed char) cres;
c0 = (vector (16, CHAR)){argc, 1, 2, 10, 6, 87, (CHAR)-5, 2, \
argc, 1, 2, 10, 6, 87, (CHAR)-5, 2 };
c0 = (vector (16, CHAR)){(CHAR)argc, 1, 2, 10, 6, 87, (CHAR)-5, 2, \
(CHAR)argc, 1, 2, 10, 6, 87, (CHAR)-5, 2 };
c1 = (vector (16, CHAR)){0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0, \
0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0};
@ -92,8 +93,8 @@ int main (int argc, char *argv[]) {
vector (16, CHAR) uc1;
vector (16, signed char) ucres;
uc0 = (vector (16, CHAR)){argc, 1, 2, 10, 6, 87, (CHAR)-5, 2, \
argc, 1, 2, 10, 6, 87, (CHAR)-5, 2 };
uc0 = (vector (16, CHAR)){(CHAR)argc, 1, 2, 10, 6, 87, (CHAR)-5, 2, \
(CHAR)argc, 1, 2, 10, 6, 87, (CHAR)-5, 2 };
uc1 = (vector (16, CHAR)){0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0, \
0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0};

View File

@ -1,3 +1,5 @@
/* { dg-do run } */
/* { dg-options "-Wno-psabi" } */
#define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type

View File

@ -1,3 +1,4 @@
/* { dg-do run } */
#define vector __attribute__((vector_size(sizeof(int)*4) ))
@ -16,7 +17,7 @@ static vector unsigned int unumbersrightshiftallones = {0, 0, 1, 1};
#define TEST(result, expected) \
do { \
typeof(result) result1 = result; \
__typeof__(result) result1 = result; \
if(sizeof (result1) != sizeof (expected)) \
__builtin_abort (); \
if (__builtin_memcmp (&result1, &expected, sizeof(result1)) != 0) \

View File

@ -1,3 +1,4 @@
/* { dg-do run } */
#define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type

View File

@ -1,4 +1,4 @@
/* dg-do run */
/* { dg-do run } */
#define vector __attribute__((vector_size(sizeof(int)*4) ))
/* Check to make sure that we extract and insert the vector at the same

View File

@ -1,3 +1,4 @@
/* { dg-do run } */
#define vector __attribute__((vector_size(sizeof(int)*4) ))
/* Check to make sure that we extract and insert the vector at the same

View File

@ -1,4 +1,4 @@
/* dg-do run */
/* { dg-do run } */
#define vector __attribute__((vector_size(16) ))
/* Check whether register declaration of vector type still

View File

@ -1,5 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-mabi=altivec" { target { { powerpc*-*-linux* } && ilp32 } } } */
/* { dg-prune-output "operand types are" } */
#define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type
@ -14,6 +15,6 @@ foo (vector (4, int) x, vector (4, float) y)
vector (4, float) f4;
r4 = x > y; /* { dg-error "comparing vectors with different element types" } */
r8 = (x != p4); /* { dg-error "incompatible types when assigning to type" } */
r8 = (x != p4); /* { dg-error "incompatible types when assigning to type|cannot convert" } */
r8 == r4; /* { dg-error "comparing vectors with different number of elements" } */
}

View File

@ -0,0 +1,25 @@
/* { dg-do compile } */
/* { dg-options "-O2" } */
typedef int v4i __attribute__((vector_size(4*sizeof(int))));
// fold should not turn (vec_other)(x<y) into (x<y)?vec_other(-1):vec_other(0).
void use (v4i const *z);
void
f (v4i *x, v4i *y)
{
v4i const zz = *x < *y;
use (&zz);
}
// Optimizations shouldn't introduce a boolean type in there
void
g (v4i *x, v4i const *y, v4i *z, v4i *t)
{
*z = *x < *y | *x == *y;
*t = *x < *y & *x > *y;
}

View File

@ -1,4 +1,5 @@
/* { dg-do compile } */
/* { dg-prune-output "in evaluation of" } */
#define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type

View File

@ -1,4 +1,5 @@
/* { dg-do compile } */
/* { dg-prune-output "in evaluation of" } */
#define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type
@ -11,7 +12,7 @@ int main (int argc, char *argv[]) {
vint <<= vfloat0; /* { dg-error "nvalid operands to binary <<" } */
vfloat0 >>= vint; /* { dg-error "nvalid operands to binary >>" } */
vfloat0 <<= vfloat1; /* { dg-error "nvalid operands to binary <<" } */
vfloat0 <<= vfloat1; /* { dg-error "nvalid operands" } */
return 0;
}

View File

@ -5,11 +5,11 @@ __attribute__((vector_size((elcount)*sizeof(type)))) type
int main (int argc, char *argv[]) {
vector(8, short) v0 = {argc,2,3,4,5,6,7};
vector(8, short) v0 = {(short)argc,2,3,4,5,6,7};
short sc;
scalar1 <<= v0; /* { dg-error ".*scalar1.*undeclared" } */
scalar1 <<= v0; /* { dg-error "scalar1.*(undeclared|was not declared)" } */
return 0;
}

View File

@ -0,0 +1,36 @@
/* { dg-do compile } */
/* { dg-options "-std=gnu++11 -Wall" } */
// Check that we can compare vector types that really are the same through
// typedefs.
typedef float v4f __attribute__((vector_size(4*sizeof(float))));
template <class T> void eat (T&&) {}
template <class T, int n>
struct Vec
{
typedef T type __attribute__((vector_size(4*sizeof(T))));
template <class U>
static void fun (type const& t, U& u) { eat (t > u); }
};
long long
f (v4f *x, v4f const *y)
{
return ((*x < *y) | (*x <= *y))[2];
}
int main ()
{
v4f x = {0,1,2,3};
Vec<const volatile float,4>::type f = {-1,5,2,3.1};
auto c = (x == f) == (x >= x);
eat (c[3]);
Vec<const volatile float,4>::fun (f, x);
Vec<const volatile float,4>::fun (x, f);
Vec<const volatile float,4>::fun (f, f);
Vec<const volatile float,4>::fun (x, x);
}

View File

@ -1,2 +0,0 @@
set additional_flags "-Wno-psabi"
return 0