diff options
Diffstat (limited to 'gcc/omp-simd-clone.c')
-rw-r--r-- | gcc/omp-simd-clone.c | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/gcc/omp-simd-clone.c b/gcc/omp-simd-clone.c index 467d8725225..df140d40446 100644 --- a/gcc/omp-simd-clone.c +++ b/gcc/omp-simd-clone.c @@ -126,13 +126,11 @@ simd_clone_clauses_extract (struct cgraph_node *node, tree clauses, clone_info->cilk_elemental = cilk_clone; if (!clauses) - { - args.release (); - return clone_info; - } + goto out; + clauses = TREE_VALUE (clauses); if (!clauses || TREE_CODE (clauses) != OMP_CLAUSE) - return clone_info; + goto out; for (t = clauses; t; t = OMP_CLAUSE_CHAIN (t)) { @@ -252,6 +250,28 @@ simd_clone_clauses_extract (struct cgraph_node *node, tree clauses, break; } } + + out: + if (TYPE_ATOMIC (TREE_TYPE (TREE_TYPE (node->decl)))) + { + warning_at (DECL_SOURCE_LOCATION (node->decl), 0, + "ignoring %<#pragma omp declare simd%> on function " + "with %<_Atomic%> qualified return type"); + args.release (); + return NULL; + } + + for (unsigned int argno = 0; argno < clone_info->nargs; argno++) + if (TYPE_ATOMIC (args[argno]) + && clone_info->args[argno].arg_type != SIMD_CLONE_ARG_TYPE_UNIFORM) + { + warning_at (DECL_SOURCE_LOCATION (node->decl), 0, + "ignoring %<#pragma omp declare simd%> on function " + "with %<_Atomic%> qualified non-%<uniform%> argument"); + args.release (); + return NULL; + } + args.release (); return clone_info; } @@ -911,11 +931,11 @@ ipa_simd_modify_function_body (struct cgraph_node *node, } l = adjustments.length (); - for (i = 1; i < num_ssa_names; i++) + tree name; + + FOR_EACH_SSA_NAME (i, name, cfun) { - tree name = ssa_name (i); - if (name - && SSA_NAME_VAR (name) + if (SSA_NAME_VAR (name) && TREE_CODE (SSA_NAME_VAR (name)) == PARM_DECL) { for (j = 0; j < l; j++) |