summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2012-09-14 19:17:01 +0200
committerMarc Glisse <glisse@gcc.gnu.org>2012-09-14 17:17:01 +0000
commit31ed6226580ad238c8f3d4d95413225aa6885508 (patch)
treefd2bfcf1c245dc3f7d041ac30f6b07952c2c22fc
parent0290430b751b0f2d3a086d36475d4ceda5a5098e (diff)
downloadgcc-31ed6226580ad238c8f3d4d95413225aa6885508.tar.gz
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
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/typeck.c51
-rw-r--r--gcc/fold-const.c3
-rw-r--r--gcc/gimple-fold.c29
-rw-r--r--gcc/testsuite/ChangeLog31
-rw-r--r--gcc/testsuite/c-c++-common/torture/vector-compare-1.c (renamed from gcc/testsuite/gcc.c-torture/execute/vector-compare-1.c)17
-rw-r--r--gcc/testsuite/c-c++-common/torture/vector-compare-2.c (renamed from gcc/testsuite/gcc.c-torture/execute/vector-compare-2.c)2
-rw-r--r--gcc/testsuite/c-c++-common/torture/vector-shift.c (renamed from gcc/testsuite/gcc.c-torture/execute/vector-shift.c)3
-rw-r--r--gcc/testsuite/c-c++-common/torture/vector-shift2.c (renamed from gcc/testsuite/gcc.c-torture/execute/vector-shift2.c)1
-rw-r--r--gcc/testsuite/c-c++-common/torture/vector-subscript-1.c (renamed from gcc/testsuite/gcc.c-torture/execute/vector-subscript-1.c)2
-rw-r--r--gcc/testsuite/c-c++-common/torture/vector-subscript-2.c (renamed from gcc/testsuite/gcc.c-torture/execute/vector-subscript-2.c)1
-rw-r--r--gcc/testsuite/c-c++-common/torture/vector-subscript-3.c (renamed from gcc/testsuite/gcc.c-torture/execute/vector-subscript-3.c)2
-rw-r--r--gcc/testsuite/c-c++-common/vector-compare-1.c (renamed from gcc/testsuite/gcc.dg/vector-compare-1.c)3
-rw-r--r--gcc/testsuite/c-c++-common/vector-compare-2.c (renamed from gcc/testsuite/gcc.dg/vector-compare-2.c)0
-rw-r--r--gcc/testsuite/c-c++-common/vector-compare-3.c25
-rw-r--r--gcc/testsuite/c-c++-common/vector-shift.c (renamed from gcc/testsuite/gcc.dg/vector-shift.c)1
-rw-r--r--gcc/testsuite/c-c++-common/vector-shift1.c (renamed from gcc/testsuite/gcc.dg/vector-shift1.c)3
-rw-r--r--gcc/testsuite/c-c++-common/vector-shift3.c (renamed from gcc/testsuite/gcc.dg/vector-shift3.c)4
-rw-r--r--gcc/testsuite/g++.dg/other/vector-compare.C36
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/vector-compare-2.x2
21 files changed, 206 insertions, 24 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 21a8f94e22f..9c6b378db35 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 630c74a343a..f70b46673b3 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index 60d7319150b..ad4b0903d67 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -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)
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 24e21ebbd2e..c76e7ff68d3 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -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
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index bb13e1fd732..4dba726f274 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -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;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ac72d3264b7..4a9715ea5db 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/gcc.c-torture/execute/vector-compare-1.c b/gcc/testsuite/c-c++-common/torture/vector-compare-1.c
index 8967d439406..4cdfcf718c1 100644
--- a/gcc/testsuite/gcc.c-torture/execute/vector-compare-1.c
+++ b/gcc/testsuite/c-c++-common/torture/vector-compare-1.c
@@ -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};
diff --git a/gcc/testsuite/gcc.c-torture/execute/vector-compare-2.c b/gcc/testsuite/c-c++-common/torture/vector-compare-2.c
index 398c8254a47..45453e6b98d 100644
--- a/gcc/testsuite/gcc.c-torture/execute/vector-compare-2.c
+++ b/gcc/testsuite/c-c++-common/torture/vector-compare-2.c
@@ -1,3 +1,5 @@
+/* { dg-do run } */
+/* { dg-options "-Wno-psabi" } */
#define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type
diff --git a/gcc/testsuite/gcc.c-torture/execute/vector-shift.c b/gcc/testsuite/c-c++-common/torture/vector-shift.c
index f52eb58a1b9..f690b7c3d6e 100644
--- a/gcc/testsuite/gcc.c-torture/execute/vector-shift.c
+++ b/gcc/testsuite/c-c++-common/torture/vector-shift.c
@@ -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) \
diff --git a/gcc/testsuite/gcc.c-torture/execute/vector-shift2.c b/gcc/testsuite/c-c++-common/torture/vector-shift2.c
index 55f10355522..d3a2ef87cd5 100644
--- a/gcc/testsuite/gcc.c-torture/execute/vector-shift2.c
+++ b/gcc/testsuite/c-c++-common/torture/vector-shift2.c
@@ -1,3 +1,4 @@
+/* { dg-do run } */
#define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type
diff --git a/gcc/testsuite/gcc.c-torture/execute/vector-subscript-1.c b/gcc/testsuite/c-c++-common/torture/vector-subscript-1.c
index 8ad8d454857..bb1350ebedc 100644
--- a/gcc/testsuite/gcc.c-torture/execute/vector-subscript-1.c
+++ b/gcc/testsuite/c-c++-common/torture/vector-subscript-1.c
@@ -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
diff --git a/gcc/testsuite/gcc.c-torture/execute/vector-subscript-2.c b/gcc/testsuite/c-c++-common/torture/vector-subscript-2.c
index d0e5b889c66..2e4a7488bbe 100644
--- a/gcc/testsuite/gcc.c-torture/execute/vector-subscript-2.c
+++ b/gcc/testsuite/c-c++-common/torture/vector-subscript-2.c
@@ -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
diff --git a/gcc/testsuite/gcc.c-torture/execute/vector-subscript-3.c b/gcc/testsuite/c-c++-common/torture/vector-subscript-3.c
index 97d531c1733..bb5c91485d7 100644
--- a/gcc/testsuite/gcc.c-torture/execute/vector-subscript-3.c
+++ b/gcc/testsuite/c-c++-common/torture/vector-subscript-3.c
@@ -1,4 +1,4 @@
-/* dg-do run */
+/* { dg-do run } */
#define vector __attribute__((vector_size(16) ))
/* Check whether register declaration of vector type still
diff --git a/gcc/testsuite/gcc.dg/vector-compare-1.c b/gcc/testsuite/c-c++-common/vector-compare-1.c
index f6c1b404b0c..ef99ae472dc 100644
--- a/gcc/testsuite/gcc.dg/vector-compare-1.c
+++ b/gcc/testsuite/c-c++-common/vector-compare-1.c
@@ -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" } */
}
diff --git a/gcc/testsuite/gcc.dg/vector-compare-2.c b/gcc/testsuite/c-c++-common/vector-compare-2.c
index 8cbcf0787c4..8cbcf0787c4 100644
--- a/gcc/testsuite/gcc.dg/vector-compare-2.c
+++ b/gcc/testsuite/c-c++-common/vector-compare-2.c
diff --git a/gcc/testsuite/c-c++-common/vector-compare-3.c b/gcc/testsuite/c-c++-common/vector-compare-3.c
new file mode 100644
index 00000000000..d6b0dac7cb9
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/vector-compare-3.c
@@ -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;
+}
+
diff --git a/gcc/testsuite/gcc.dg/vector-shift.c b/gcc/testsuite/c-c++-common/vector-shift.c
index f2b12ba73f6..593bb366943 100644
--- a/gcc/testsuite/gcc.dg/vector-shift.c
+++ b/gcc/testsuite/c-c++-common/vector-shift.c
@@ -1,4 +1,5 @@
/* { dg-do compile } */
+/* { dg-prune-output "in evaluation of" } */
#define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type
diff --git a/gcc/testsuite/gcc.dg/vector-shift1.c b/gcc/testsuite/c-c++-common/vector-shift1.c
index 51bc0ad3989..db8035667a9 100644
--- a/gcc/testsuite/gcc.dg/vector-shift1.c
+++ b/gcc/testsuite/c-c++-common/vector-shift1.c
@@ -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;
}
diff --git a/gcc/testsuite/gcc.dg/vector-shift3.c b/gcc/testsuite/c-c++-common/vector-shift3.c
index 38a9843d117..c26fb8d98ca 100644
--- a/gcc/testsuite/gcc.dg/vector-shift3.c
+++ b/gcc/testsuite/c-c++-common/vector-shift3.c
@@ -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;
}
diff --git a/gcc/testsuite/g++.dg/other/vector-compare.C b/gcc/testsuite/g++.dg/other/vector-compare.C
new file mode 100644
index 00000000000..b2d1ecbc5ed
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/vector-compare.C
@@ -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);
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/vector-compare-2.x b/gcc/testsuite/gcc.c-torture/execute/vector-compare-2.x
deleted file mode 100644
index cb7b119b8cb..00000000000
--- a/gcc/testsuite/gcc.c-torture/execute/vector-compare-2.x
+++ /dev/null
@@ -1,2 +0,0 @@
-set additional_flags "-Wno-psabi"
-return 0