mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
fad08d127f
commit
477d4906b8
|
|
@ -1,3 +1,9 @@
|
||||||
|
2016-04-20 Ilya Verbin <ilya.verbin@intel.com>
|
||||||
|
|
||||||
|
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 <matz@suse.de>
|
2016-04-18 Michael Matz <matz@suse.de>
|
||||||
|
|
||||||
* c-common.c (handle_aligned_attribute): Use SET_TYPE_ALIGN
|
* c-common.c (handle_aligned_attribute): Use SET_TYPE_ALIGN
|
||||||
|
|
|
||||||
|
|
@ -41,56 +41,6 @@ c_check_cilk_loop (location_t loc, tree decl)
|
||||||
return true;
|
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. */
|
/* Calculate number of iterations of CILK_FOR. */
|
||||||
|
|
||||||
tree
|
tree
|
||||||
|
|
|
||||||
|
|
@ -1369,7 +1369,6 @@ extern enum stv_conv scalar_to_vector (location_t loc, enum tree_code code,
|
||||||
tree op0, tree op1, bool);
|
tree op0, tree op1, bool);
|
||||||
|
|
||||||
/* In c-cilkplus.c */
|
/* In c-cilkplus.c */
|
||||||
extern tree c_finish_cilk_clauses (tree);
|
|
||||||
extern tree c_validate_cilk_plus_loop (tree *, int *, void *);
|
extern tree c_validate_cilk_plus_loop (tree *, int *, void *);
|
||||||
extern bool c_check_cilk_loop (location_t, tree);
|
extern bool c_check_cilk_loop (location_t, tree);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,12 @@
|
||||||
|
2016-04-20 Ilya Verbin <ilya.verbin@intel.com>
|
||||||
|
|
||||||
|
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 <matz@suse.de>
|
2016-04-18 Michael Matz <matz@suse.de>
|
||||||
|
|
||||||
* c-decl.c (merge_decls): Use SET_DECL_ALIGN and SET_TYPE_ALIGN.
|
* c-decl.c (merge_decls): Use SET_DECL_ALIGN and SET_TYPE_ALIGN.
|
||||||
|
|
|
||||||
|
|
@ -17509,7 +17509,7 @@ c_parser_cilk_all_clauses (c_parser *parser)
|
||||||
|
|
||||||
saw_error:
|
saw_error:
|
||||||
c_parser_skip_to_pragma_eol (parser);
|
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.
|
/* This function helps parse the grainsize pragma for a _Cilk_for statement.
|
||||||
|
|
|
||||||
|
|
@ -661,7 +661,7 @@ extern tree c_begin_omp_task (void);
|
||||||
extern tree c_finish_omp_task (location_t, tree, tree);
|
extern tree c_finish_omp_task (location_t, tree, tree);
|
||||||
extern void c_finish_omp_cancel (location_t, tree);
|
extern void c_finish_omp_cancel (location_t, tree);
|
||||||
extern void c_finish_omp_cancellation_point (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_build_va_arg (location_t, tree, location_t, tree);
|
||||||
extern tree c_finish_transaction (location_t, tree, int);
|
extern tree c_finish_transaction (location_t, tree, int);
|
||||||
extern bool c_tree_equal (tree, tree);
|
extern bool c_tree_equal (tree, tree);
|
||||||
|
|
|
||||||
|
|
@ -12496,7 +12496,8 @@ c_find_omp_placeholder_r (tree *tp, int *, void *data)
|
||||||
Remove any elements from the list that are invalid. */
|
Remove any elements from the list that are invalid. */
|
||||||
|
|
||||||
tree
|
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 generic_head, firstprivate_head, lastprivate_head;
|
||||||
bitmap_head aligned_head, map_head, map_field_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 %<simd%> or %<for%> constructs");
|
"clause on %<simd%> or %<for%> constructs");
|
||||||
OMP_CLAUSE_LINEAR_KIND (c) = OMP_CLAUSE_LINEAR_DEFAULT;
|
OMP_CLAUSE_LINEAR_KIND (c) = OMP_CLAUSE_LINEAR_DEFAULT;
|
||||||
}
|
}
|
||||||
if (!INTEGRAL_TYPE_P (TREE_TYPE (t))
|
if (is_cilk)
|
||||||
&& TREE_CODE (TREE_TYPE (t)) != POINTER_TYPE)
|
|
||||||
{
|
{
|
||||||
error_at (OMP_CLAUSE_LOCATION (c),
|
if (!INTEGRAL_TYPE_P (TREE_TYPE (t))
|
||||||
"linear clause applied to non-integral non-pointer "
|
&& !SCALAR_FLOAT_TYPE_P (TREE_TYPE (t))
|
||||||
"variable with type %qT", TREE_TYPE (t));
|
&& TREE_CODE (TREE_TYPE (t)) != POINTER_TYPE)
|
||||||
remove = true;
|
{
|
||||||
break;
|
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)
|
if (declare_simd)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,12 @@
|
||||||
|
2016-04-20 Ilya Verbin <ilya.verbin@intel.com>
|
||||||
|
|
||||||
|
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 <nathan@acm.org>
|
2016-04-20 Nathan Sidwell <nathan@acm.org>
|
||||||
|
|
||||||
* semantics.c (finish_compound_lteral): Don't wrap VECTOR_TYPEs in a
|
* semantics.c (finish_compound_lteral): Don't wrap VECTOR_TYPEs in a
|
||||||
|
|
|
||||||
|
|
@ -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 tree cp_remove_omp_priv_cleanup_stmt (tree *, int *, void *);
|
||||||
extern void cp_check_omp_declare_reduction (tree);
|
extern void cp_check_omp_declare_reduction (tree);
|
||||||
extern void finish_omp_declare_simd_methods (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 tree push_omp_privatization_clauses (bool);
|
||||||
extern void pop_omp_privatization_clauses (tree);
|
extern void pop_omp_privatization_clauses (tree);
|
||||||
extern void save_omp_privatization_clauses (vec<tree> &);
|
extern void save_omp_privatization_clauses (vec<tree> &);
|
||||||
|
|
|
||||||
|
|
@ -37714,7 +37714,7 @@ cp_parser_cilk_simd_all_clauses (cp_parser *parser, cp_token *pragma_token)
|
||||||
if (clauses == error_mark_node)
|
if (clauses == error_mark_node)
|
||||||
return error_mark_node;
|
return error_mark_node;
|
||||||
else
|
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. */
|
/* Main entry-point for parsing Cilk Plus <#pragma simd> for loops. */
|
||||||
|
|
|
||||||
|
|
@ -5793,7 +5793,8 @@ cp_finish_omp_clause_depend_sink (tree sink_clause)
|
||||||
Remove any elements from the list that are invalid. */
|
Remove any elements from the list that are invalid. */
|
||||||
|
|
||||||
tree
|
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 generic_head, firstprivate_head, lastprivate_head;
|
||||||
bitmap_head aligned_head, map_head, map_field_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)
|
if (TREE_CODE (type) == REFERENCE_TYPE)
|
||||||
type = TREE_TYPE (type);
|
type = TREE_TYPE (type);
|
||||||
if (!INTEGRAL_TYPE_P (type)
|
if (is_cilk)
|
||||||
&& TREE_CODE (type) != POINTER_TYPE)
|
|
||||||
{
|
{
|
||||||
error ("linear clause applied to non-integral non-pointer "
|
if (!INTEGRAL_TYPE_P (type)
|
||||||
"variable with %qT type", TREE_TYPE (t));
|
&& !SCALAR_FLOAT_TYPE_P (type)
|
||||||
remove = true;
|
&& TREE_CODE (type) != POINTER_TYPE)
|
||||||
break;
|
{
|
||||||
|
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);
|
t = OMP_CLAUSE_LINEAR_STEP (c);
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,10 @@
|
||||||
|
2016-04-20 Ilya Verbin <ilya.verbin@intel.com>
|
||||||
|
|
||||||
|
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 <bin.cheng@arm.com>
|
2016-04-20 Bin Cheng <bin.cheng@arm.com>
|
||||||
|
|
||||||
PR tree-optimization/56625
|
PR tree-optimization/56625
|
||||||
|
|
|
||||||
|
|
@ -6,31 +6,31 @@
|
||||||
int A[N], B[N], C[N];
|
int A[N], B[N], C[N];
|
||||||
int main (void)
|
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++)
|
for (int ii = 0; ii < N; ii++)
|
||||||
{
|
{
|
||||||
A[ii] = B[ii] + C[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++)
|
for (int ii = 0; ii < N; ii++)
|
||||||
{
|
{
|
||||||
A[ii] = B[ii] + C[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++)
|
for (int ii = 0; ii < N; ii++)
|
||||||
{
|
{
|
||||||
A[ii] = B[ii] + C[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++)
|
for (int ii = 0; ii < N; ii++)
|
||||||
{
|
{
|
||||||
A[ii] = B[ii] + C[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++)
|
for (int ii = 0; ii < N; ii++)
|
||||||
{
|
{
|
||||||
A[ii] = B[ii] + C[ii];
|
A[ii] = B[ii] + C[ii];
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue