diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2012-09-14 19:17:01 +0200 |
---|---|---|
committer | Marc Glisse <glisse@gcc.gnu.org> | 2012-09-14 17:17:01 +0000 |
commit | 31ed6226580ad238c8f3d4d95413225aa6885508 (patch) | |
tree | fd2bfcf1c245dc3f7d041ac30f6b07952c2c22fc | |
parent | 0290430b751b0f2d3a086d36475d4ceda5a5098e (diff) | |
download | gcc-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/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 51 | ||||
-rw-r--r-- | gcc/fold-const.c | 3 | ||||
-rw-r--r-- | gcc/gimple-fold.c | 29 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 31 | ||||
-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.c | 25 | ||||
-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.C | 36 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/vector-compare-2.x | 2 |
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 |