aboutsummaryrefslogtreecommitdiff
path: root/gcc/omp-low.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-04-06 14:42:24 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2016-04-06 14:42:24 +0200
commitec35ea455c30c14700dbb7a2cbbd3379e0212e96 (patch)
treeadfbb9d8a87972b13facb8bacfc7b423b26a711d /gcc/omp-low.c
parentce043b0c1ccea48a249a2d55641e46b62d9d7d8f (diff)
downloadgcc-ec35ea455c30c14700dbb7a2cbbd3379e0212e96.zip
gcc-ec35ea455c30c14700dbb7a2cbbd3379e0212e96.tar.gz
gcc-ec35ea455c30c14700dbb7a2cbbd3379e0212e96.tar.bz2
re PR middle-end/70550 (-Wuninitialized false positives in OpenMP code)
PR middle-end/70550 * tree.h (OMP_CLAUSE_FIRSTPRIVATE_IMPLICIT): Define. * gimplify.c (gimplify_adjust_omp_clauses_1): Set it for implicit firstprivate clauses. * omp-low.c (lower_send_clauses): Set TREE_NO_WARNING for OMP_CLAUSE_FIRSTPRIVATE_IMPLICIT !by_ref vars in task contexts. (lower_omp_target): Set TREE_NO_WARNING for non-addressable possibly uninitialized vars which are copied into addressable temporaries or copied for GOMP_MAP_FIRSTPRIVATE_INT. * c-c++-common/gomp/pr70550-1.c: New test. * c-c++-common/gomp/pr70550-2.c: New test. From-SVN: r234779
Diffstat (limited to 'gcc/omp-low.c')
-rw-r--r--gcc/omp-low.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index 3fd6eb3..52a8005 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -6107,8 +6107,15 @@ lower_send_clauses (tree clauses, gimple_seq *ilist, gimple_seq *olist,
switch (OMP_CLAUSE_CODE (c))
{
- case OMP_CLAUSE_PRIVATE:
case OMP_CLAUSE_FIRSTPRIVATE:
+ if (OMP_CLAUSE_FIRSTPRIVATE_IMPLICIT (c)
+ && !by_ref
+ && is_task_ctx (ctx))
+ TREE_NO_WARNING (var) = 1;
+ do_in = true;
+ break;
+
+ case OMP_CLAUSE_PRIVATE:
case OMP_CLAUSE_COPYIN:
case OMP_CLAUSE__LOOPTEMP_:
do_in = true;
@@ -16083,7 +16090,16 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
|| map_kind == GOMP_MAP_POINTER
|| map_kind == GOMP_MAP_TO_PSET
|| map_kind == GOMP_MAP_FORCE_DEVICEPTR)
- gimplify_assign (avar, var, &ilist);
+ {
+ /* If we need to initialize a temporary
+ with VAR because it is not addressable, and
+ the variable hasn't been initialized yet, then
+ we'll get a warning for the store to avar.
+ Don't warn in that case, the mapping might
+ be implicit. */
+ TREE_NO_WARNING (var) = 1;
+ gimplify_assign (avar, var, &ilist);
+ }
avar = build_fold_addr_expr (avar);
gimplify_assign (x, avar, &ilist);
if ((GOMP_MAP_COPY_FROM_P (map_kind)
@@ -16252,6 +16268,8 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
tree t = var;
if (is_reference (var))
t = build_simple_mem_ref (var);
+ else if (OMP_CLAUSE_FIRSTPRIVATE_IMPLICIT (c))
+ TREE_NO_WARNING (var) = 1;
if (TREE_CODE (type) != POINTER_TYPE)
t = fold_convert (pointer_sized_int_node, t);
t = fold_convert (TREE_TYPE (x), t);
@@ -16263,6 +16281,8 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
{
tree avar = create_tmp_var (TREE_TYPE (var));
mark_addressable (avar);
+ if (OMP_CLAUSE_FIRSTPRIVATE_IMPLICIT (c))
+ TREE_NO_WARNING (var) = 1;
gimplify_assign (avar, var, &ilist);
avar = build_fold_addr_expr (avar);
gimplify_assign (x, avar, &ilist);