From 477d4906b8bcb8f248de837f5ddf9e7013f5b01f Mon Sep 17 00:00:00 2001 From: Ilya Verbin Date: Wed, 20 Apr 2016 15:48:53 +0000 Subject: [PATCH] re PR c++/69363 (ICE when doing a pragma simd reduction with max) Fix PR c++/69363 gcc/c-family/ PR c++/69363 * c-cilkplus.c (c_finish_cilk_clauses): Remove function. * c-common.h (c_finish_cilk_clauses): Remove declaration. gcc/c/ PR c++/69363 * c-parser.c (c_parser_cilk_all_clauses): Use c_finish_omp_clauses instead of c_finish_cilk_clauses. * c-tree.h (c_finish_omp_clauses): Add new default argument. * c-typeck.c (c_finish_omp_clauses): Add new argument. Allow floating-point variables in the linear clause for Cilk Plus. gcc/cp/ PR c++/69363 * cp-tree.h (finish_omp_clauses): Add new default argument. * parser.c (cp_parser_cilk_simd_all_clauses): Use finish_omp_clauses instead of c_finish_cilk_clauses. * semantics.c (finish_omp_clauses): Add new argument. Allow floating-point variables in the linear clause for Cilk Plus. gcc/testsuite/ PR c++/69363 * c-c++-common/cilk-plus/PS/clauses3.c: Adjust dg-error string. * c-c++-common/cilk-plus/PS/clauses4.c: New test. * c-c++-common/cilk-plus/PS/pr69363.c: New test. From-SVN: r235290 --- gcc/c-family/ChangeLog | 6 +++ gcc/c-family/c-cilkplus.c | 50 ------------------- gcc/c-family/c-common.h | 1 - gcc/c/ChangeLog | 9 ++++ gcc/c/c-parser.c | 2 +- gcc/c/c-tree.h | 2 +- gcc/c/c-typeck.c | 34 ++++++++++--- gcc/cp/ChangeLog | 9 ++++ gcc/cp/cp-tree.h | 3 +- gcc/cp/parser.c | 2 +- gcc/cp/semantics.c | 31 +++++++++--- gcc/testsuite/ChangeLog | 7 +++ .../c-c++-common/cilk-plus/PS/clauses3.c | 10 ++-- .../c-c++-common/cilk-plus/PS/clauses4.c | 36 +++++++++++++ .../c-c++-common/cilk-plus/PS/pr69363.c | 13 +++++ 15 files changed, 140 insertions(+), 75 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/cilk-plus/PS/clauses4.c create mode 100644 gcc/testsuite/c-c++-common/cilk-plus/PS/pr69363.c diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 7ae6903eb7e..fc772147ae8 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,9 @@ +2016-04-20 Ilya Verbin + + PR c++/69363 + * c-cilkplus.c (c_finish_cilk_clauses): Remove function. + * c-common.h (c_finish_cilk_clauses): Remove declaration. + 2016-04-18 Michael Matz * c-common.c (handle_aligned_attribute): Use SET_TYPE_ALIGN diff --git a/gcc/c-family/c-cilkplus.c b/gcc/c-family/c-cilkplus.c index 3e7902fd11e..9f1f36471a8 100644 --- a/gcc/c-family/c-cilkplus.c +++ b/gcc/c-family/c-cilkplus.c @@ -41,56 +41,6 @@ c_check_cilk_loop (location_t loc, tree decl) return true; } -/* Validate and emit code for <#pragma simd> clauses. */ - -tree -c_finish_cilk_clauses (tree clauses) -{ - for (tree c = clauses; c; c = OMP_CLAUSE_CHAIN (c)) - { - tree prev = clauses; - - /* If a variable appears in a linear clause it cannot appear in - any other OMP clause. */ - if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR) - for (tree c2 = clauses; c2; c2 = OMP_CLAUSE_CHAIN (c2)) - { - if (c == c2) - continue; - enum omp_clause_code code = OMP_CLAUSE_CODE (c2); - - switch (code) - { - case OMP_CLAUSE_LINEAR: - case OMP_CLAUSE_PRIVATE: - case OMP_CLAUSE_FIRSTPRIVATE: - case OMP_CLAUSE_LASTPRIVATE: - case OMP_CLAUSE_REDUCTION: - break; - - case OMP_CLAUSE_SAFELEN: - goto next; - - default: - gcc_unreachable (); - } - - if (OMP_CLAUSE_DECL (c) == OMP_CLAUSE_DECL (c2)) - { - error_at (OMP_CLAUSE_LOCATION (c2), - "variable appears in more than one clause"); - inform (OMP_CLAUSE_LOCATION (c), - "other clause defined here"); - // Remove problematic clauses. - OMP_CLAUSE_CHAIN (prev) = OMP_CLAUSE_CHAIN (c2); - } - next: - prev = c2; - } - } - return clauses; -} - /* Calculate number of iterations of CILK_FOR. */ tree diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h index fa3746c3725..663e457dd52 100644 --- a/gcc/c-family/c-common.h +++ b/gcc/c-family/c-common.h @@ -1369,7 +1369,6 @@ extern enum stv_conv scalar_to_vector (location_t loc, enum tree_code code, tree op0, tree op1, bool); /* In c-cilkplus.c */ -extern tree c_finish_cilk_clauses (tree); extern tree c_validate_cilk_plus_loop (tree *, int *, void *); extern bool c_check_cilk_loop (location_t, tree); diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index b46df1f0a49..e300200b009 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,12 @@ +2016-04-20 Ilya Verbin + + PR c++/69363 + * c-parser.c (c_parser_cilk_all_clauses): Use c_finish_omp_clauses + instead of c_finish_cilk_clauses. + * c-tree.h (c_finish_omp_clauses): Add new default argument. + * c-typeck.c (c_finish_omp_clauses): Add new argument. Allow + floating-point variables in the linear clause for Cilk Plus. + 2016-04-18 Michael Matz * c-decl.c (merge_decls): Use SET_DECL_ALIGN and SET_TYPE_ALIGN. diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 1b6bacd7498..bdd669dec35 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -17509,7 +17509,7 @@ c_parser_cilk_all_clauses (c_parser *parser) saw_error: c_parser_skip_to_pragma_eol (parser); - return c_finish_cilk_clauses (clauses); + return c_finish_omp_clauses (clauses, false, false, true); } /* This function helps parse the grainsize pragma for a _Cilk_for statement. diff --git a/gcc/c/c-tree.h b/gcc/c/c-tree.h index d5592077524..4633182eef9 100644 --- a/gcc/c/c-tree.h +++ b/gcc/c/c-tree.h @@ -661,7 +661,7 @@ extern tree c_begin_omp_task (void); extern tree c_finish_omp_task (location_t, tree, tree); extern void c_finish_omp_cancel (location_t, tree); extern void c_finish_omp_cancellation_point (location_t, tree); -extern tree c_finish_omp_clauses (tree, bool, bool = false); +extern tree c_finish_omp_clauses (tree, bool, bool = false, bool = false); extern tree c_build_va_arg (location_t, tree, location_t, tree); extern tree c_finish_transaction (location_t, tree, int); extern bool c_tree_equal (tree, tree); diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index 59a3c6153b7..58c21393e47 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -12496,7 +12496,8 @@ c_find_omp_placeholder_r (tree *tp, int *, void *data) Remove any elements from the list that are invalid. */ tree -c_finish_omp_clauses (tree clauses, bool is_omp, bool declare_simd) +c_finish_omp_clauses (tree clauses, bool is_omp, bool declare_simd, + bool is_cilk) { bitmap_head generic_head, firstprivate_head, lastprivate_head; bitmap_head aligned_head, map_head, map_field_head; @@ -12778,14 +12779,31 @@ c_finish_omp_clauses (tree clauses, bool is_omp, bool declare_simd) "clause on % or % constructs"); OMP_CLAUSE_LINEAR_KIND (c) = OMP_CLAUSE_LINEAR_DEFAULT; } - if (!INTEGRAL_TYPE_P (TREE_TYPE (t)) - && TREE_CODE (TREE_TYPE (t)) != POINTER_TYPE) + if (is_cilk) { - error_at (OMP_CLAUSE_LOCATION (c), - "linear clause applied to non-integral non-pointer " - "variable with type %qT", TREE_TYPE (t)); - remove = true; - break; + if (!INTEGRAL_TYPE_P (TREE_TYPE (t)) + && !SCALAR_FLOAT_TYPE_P (TREE_TYPE (t)) + && TREE_CODE (TREE_TYPE (t)) != POINTER_TYPE) + { + error_at (OMP_CLAUSE_LOCATION (c), + "linear clause applied to non-integral, " + "non-floating, non-pointer variable with type %qT", + TREE_TYPE (t)); + remove = true; + break; + } + } + else + { + if (!INTEGRAL_TYPE_P (TREE_TYPE (t)) + && TREE_CODE (TREE_TYPE (t)) != POINTER_TYPE) + { + error_at (OMP_CLAUSE_LOCATION (c), + "linear clause applied to non-integral non-pointer " + "variable with type %qT", TREE_TYPE (t)); + remove = true; + break; + } } if (declare_simd) { diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 008bc355b03..7cccddb3e44 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2016-04-20 Ilya Verbin + + PR c++/69363 + * cp-tree.h (finish_omp_clauses): Add new default argument. + * parser.c (cp_parser_cilk_simd_all_clauses): Use finish_omp_clauses + instead of c_finish_cilk_clauses. + * semantics.c (finish_omp_clauses): Add new argument. Allow + floating-point variables in the linear clause for Cilk Plus. + 2016-04-20 Nathan Sidwell * semantics.c (finish_compound_lteral): Don't wrap VECTOR_TYPEs in a diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 0df84707f88..ec92718626c 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -6396,7 +6396,8 @@ extern tree omp_reduction_id (enum tree_code, tree, tree); extern tree cp_remove_omp_priv_cleanup_stmt (tree *, int *, void *); extern void cp_check_omp_declare_reduction (tree); extern void finish_omp_declare_simd_methods (tree); -extern tree finish_omp_clauses (tree, bool, bool = false); +extern tree finish_omp_clauses (tree, bool, bool = false, + bool = false); extern tree push_omp_privatization_clauses (bool); extern void pop_omp_privatization_clauses (tree); extern void save_omp_privatization_clauses (vec &); diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 54861298c84..0a1ed1a9710 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -37714,7 +37714,7 @@ cp_parser_cilk_simd_all_clauses (cp_parser *parser, cp_token *pragma_token) if (clauses == error_mark_node) return error_mark_node; else - return c_finish_cilk_clauses (clauses); + return finish_omp_clauses (clauses, false, false, true); } /* Main entry-point for parsing Cilk Plus <#pragma simd> for loops. */ diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 1dff08e29d9..93b39ac9a77 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -5793,7 +5793,8 @@ cp_finish_omp_clause_depend_sink (tree sink_clause) Remove any elements from the list that are invalid. */ tree -finish_omp_clauses (tree clauses, bool allow_fields, bool declare_simd) +finish_omp_clauses (tree clauses, bool allow_fields, bool declare_simd, + bool is_cilk) { bitmap_head generic_head, firstprivate_head, lastprivate_head; bitmap_head aligned_head, map_head, map_field_head; @@ -5889,13 +5890,29 @@ finish_omp_clauses (tree clauses, bool allow_fields, bool declare_simd) } if (TREE_CODE (type) == REFERENCE_TYPE) type = TREE_TYPE (type); - if (!INTEGRAL_TYPE_P (type) - && TREE_CODE (type) != POINTER_TYPE) + if (is_cilk) { - error ("linear clause applied to non-integral non-pointer " - "variable with %qT type", TREE_TYPE (t)); - remove = true; - break; + if (!INTEGRAL_TYPE_P (type) + && !SCALAR_FLOAT_TYPE_P (type) + && TREE_CODE (type) != POINTER_TYPE) + { + error ("linear clause applied to non-integral, " + "non-floating, non-pointer variable with %qT type", + TREE_TYPE (t)); + remove = true; + break; + } + } + else + { + if (!INTEGRAL_TYPE_P (type) + && TREE_CODE (type) != POINTER_TYPE) + { + error ("linear clause applied to non-integral non-pointer" + " variable with %qT type", TREE_TYPE (t)); + remove = true; + break; + } } } t = OMP_CLAUSE_LINEAR_STEP (c); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 50d37d21ff0..bf59b9b1802 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2016-04-20 Ilya Verbin + + PR c++/69363 + * c-c++-common/cilk-plus/PS/clauses3.c: Adjust dg-error string. + * c-c++-common/cilk-plus/PS/clauses4.c: New test. + * c-c++-common/cilk-plus/PS/pr69363.c: New test. + 2016-04-20 Bin Cheng PR tree-optimization/56625 diff --git a/gcc/testsuite/c-c++-common/cilk-plus/PS/clauses3.c b/gcc/testsuite/c-c++-common/cilk-plus/PS/clauses3.c index 579b718a01c..0b5ace6a1a0 100644 --- a/gcc/testsuite/c-c++-common/cilk-plus/PS/clauses3.c +++ b/gcc/testsuite/c-c++-common/cilk-plus/PS/clauses3.c @@ -6,31 +6,31 @@ int A[N], B[N], C[N]; int main (void) { -#pragma simd private (B) linear(B:1) /* { dg-error "more than one clause" } */ +#pragma simd private (B) linear(B:1) /* { dg-error "applied to non-integral" } */ for (int ii = 0; ii < N; ii++) { A[ii] = B[ii] + C[ii]; } -#pragma simd private (B, C) linear(B:1) /* { dg-error "more than one clause" } */ +#pragma simd private (B, C) linear(B:1) /* { dg-error "applied to non-integral" } */ for (int ii = 0; ii < N; ii++) { A[ii] = B[ii] + C[ii]; } -#pragma simd private (B) linear(C:2, B:1) /* { dg-error "more than one clause" } */ +#pragma simd private (B) linear(C:2, B:1) /* { dg-error "applied to non-integral" } */ for (int ii = 0; ii < N; ii++) { A[ii] = B[ii] + C[ii]; } -#pragma simd reduction (+:B) linear(B:1) /* { dg-error "more than one clause" } */ +#pragma simd reduction (+:B) linear(B:1) /* { dg-error "applied to non-integral" } */ for (int ii = 0; ii < N; ii++) { A[ii] = B[ii] + C[ii]; } -#pragma simd reduction (+:B) linear(B) /* { dg-error "more than one clause" } */ +#pragma simd reduction (+:B) linear(B) /* { dg-error "applied to non-integral" } */ for (int ii = 0; ii < N; ii++) { A[ii] = B[ii] + C[ii]; diff --git a/gcc/testsuite/c-c++-common/cilk-plus/PS/clauses4.c b/gcc/testsuite/c-c++-common/cilk-plus/PS/clauses4.c new file mode 100644 index 00000000000..45dcb9f606a --- /dev/null +++ b/gcc/testsuite/c-c++-common/cilk-plus/PS/clauses4.c @@ -0,0 +1,36 @@ +/* { dg-do compile } */ +/* { dg-options "-fcilkplus" } */ + +#define N 1000 + +int B, C; +double D; + +int main (void) +{ + #pragma simd linear (D:10) + for (int ii = 0; ii < N; ii++) + ; + + #pragma simd private (B) linear(B:1) /* { dg-error "more than once" } */ + for (int ii = 0; ii < N; ii++) + ; + + #pragma simd private (B, C) linear(B:1) /* { dg-error "more than once" } */ + for (int ii = 0; ii < N; ii++) + ; + + #pragma simd private (B) linear(C:2, B:1) /* { dg-error "more than once" } */ + for (int ii = 0; ii < N; ii++) + ; + + #pragma simd reduction (+:B) linear(B:1) /* { dg-error "more than once" } */ + for (int ii = 0; ii < N; ii++) + ; + + #pragma simd reduction (+:B) linear(B) /* { dg-error "more than once" } */ + for (int ii = 0; ii < N; ii++) + ; + + return 0; +} diff --git a/gcc/testsuite/c-c++-common/cilk-plus/PS/pr69363.c b/gcc/testsuite/c-c++-common/cilk-plus/PS/pr69363.c new file mode 100644 index 00000000000..1d1bb048e49 --- /dev/null +++ b/gcc/testsuite/c-c++-common/cilk-plus/PS/pr69363.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-fcilkplus" } */ + +double t1 (double *x, int N) +{ + double result = 0.0; + + #pragma simd reduction (max: result) + for (int i = 0; i < N; ++i) + result = x[i] > result ? x[i] : result; + + return result; +} -- 2.30.2