Jakub Jelinek - [gomp] Fix C++ invisiref PARM_DECLs in firstprivate/lastprivate/private (original) (raw)
This is the mail archive of the gcc-patches@gcc.gnu.orgmailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
- From: Jakub Jelinek
- To: Richard Henderson , Diego Novillo
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Tue, 6 Feb 2007 09:46:37 -0500
- Subject: [gomp] Fix C++ invisiref PARM_DECLs in firstprivate/lastprivate/private
- Reply-to: Jakub Jelinek
Hi!
As shown on the attached testcase, we ICEd or segfaulted on C++ PARM_DECLs with TREE_ADDRESSABLE set, they need similar treatment to TREE_ADDRESSABLE RESULT_DECLs which are also passed by invisible reference.
While I could extend the gimplify_scan_omp_clauses test to also cover PARM_DECLs, I believe it is better to not change the OMP_CLAUSE_DECLs during C++ genericization, then we don't need to fix it up again.
Tested on x86_64-linux.
Ok for 4.3/4.2?
2007-02-06 Jakub Jelinek jakub@redhat.com
PR c++/30703
* gimplify.c (gimplify_scan_omp_clauses): Remove special casing
of INDIRECT_REF <RESULT_DECL>.
* cp-gimplify.c (cp_genericize_r): Don't dereference invisiref
parameters and result decls in omp clauses.
(cxx_omp_privatize_by_reference): Pass also invisiref PARM_DECLs
by reference.
* testsuite/libgomp.c++/pr30703.C: New test.
--- gcc/gimplify.c.jj 2007-02-01 11:03:13.000000000 +0100 +++ gcc/gimplify.c 2007-02-06 13:24:10.000000000 +0100 @@ -4747,11 +4747,6 @@ gimplify_scan_omp_clauses (tree list_p, remove = true; break; } - / Handle NRV results passed by reference. */ - if (TREE_CODE (decl) == INDIRECT_REF - && TREE_CODE (TREE_OPERAND (decl, 0)) == RESULT_DECL - && DECL_BY_REFERENCE (TREE_OPERAND (decl, 0))) - OMP_CLAUSE_DECL (c) = decl = TREE_OPERAND (decl, 0); omp_add_variable (ctx, decl, flags); if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION && OMP_CLAUSE_REDUCTION_PLACEHOLDER (c)) @@ -4779,11 +4774,6 @@ gimplify_scan_omp_clauses (tree list_p, remove = true; break; } - / Handle NRV results passed by reference. */ - if (TREE_CODE (decl) == INDIRECT_REF - && TREE_CODE (TREE_OPERAND (decl, 0)) == RESULT_DECL - && DECL_BY_REFERENCE (TREE_OPERAND (decl, 0))) - OMP_CLAUSE_DECL (c) = decl = TREE_OPERAND (decl, 0); do_notice: if (outer_ctx) omp_notice_variable (outer_ctx, decl, true); --- gcc/cp/cp-gimplify.c.jj 2006-12-08 15:57:53.000000000 +0100 +++ gcc/cp/cp-gimplify.c 2007-02-06 14:26:12.000000000 +0100 @@ -672,6 +672,25 @@ cp_genericize_r (tree *stmt_p, int walk && is_invisiref_parm (TREE_OPERAND (stmt, 0))) / Don't dereference an invisiref RESULT_DECL inside a RETURN_EXPR. */ *walk_subtrees = 0;
- else if (TREE_CODE (stmt) == OMP_CLAUSE)
- switch (OMP_CLAUSE_CODE (stmt))
{
case OMP_CLAUSE_PRIVATE:
case OMP_CLAUSE_SHARED:
case OMP_CLAUSE_FIRSTPRIVATE:
case OMP_CLAUSE_LASTPRIVATE:
case OMP_CLAUSE_COPYIN:
case OMP_CLAUSE_COPYPRIVATE:
- /* Don't dereference an invisiref in OpenMP clauses. */
- if (is_invisiref_parm (OMP_CLAUSE_DECL (stmt)))
*walk_subtrees = 0;
- break;
case OMP_CLAUSE_REDUCTION:
- gcc_assert (!is_invisiref_parm (OMP_CLAUSE_DECL (stmt)));
- break;
default:
- break;
else if (IS_TYPE_OR_DECL_P (stmt)) *walk_subtrees = 0;}
@@ -911,5 +930,5 @@ cxx_omp_clause_dtor (tree clause, tree d bool cxx_omp_privatize_by_reference (tree decl) {
- return TREE_CODE (decl) == RESULT_DECL && DECL_BY_REFERENCE (decl);
- return is_invisiref_parm (decl); } --- libgomp/testsuite/libgomp.c++/pr30703.C.jj 2007-02-06 13:43:50.000000000 +0100 +++ libgomp/testsuite/libgomp.c++/pr30703.C 2007-02-06 15:31:38.000000000 +0100 @@ -0,0 +1,73 @@ +// PR c++/30703 +// { dg-do run }
- +#include <omp.h>
- +extern "C" void abort ();
- +int ctor, cctor, dtor;
- +struct A +{
- A();
- A(const A &);
- ~A();
- int i; +};
- +A::A() +{ +#pragma omp atomic
- ctor++; +}
- +A::A(const A &r) +{
- i = r.i; +#pragma omp atomic
- cctor++; +}
- +A::~A() +{ +#pragma omp atomic
- dtor++; +}
- +void +foo (A a, A b) +{
- int i, j = 0; +#pragma omp parallel for firstprivate (a) lastprivate (a) private (b) schedule (static, 1) num_threads (5)
- for (i = 0; i < 5; i++)
- {
b.i = 5;
if (a.i != 6)
- #pragma omp atomic
j += 1;
a.i = b.i + i + 6;
- }
- if (j || a.i != 15)
- abort ();
+} + +void +bar () +{
- A a, b;
- a.i = 6;
- b.i = 7;
- foo (a, b); +}
- +int +main () +{
- omp_set_dynamic (false);
- if (ctor || cctor || dtor)
- abort ();
- bar ();
- if (ctor + cctor != dtor)
- abort ();
+}
Jakub
- Follow-Ups:
- Re: [gomp] Fix C++ invisiref PARM_DECLs in firstprivate/lastprivate/private
* From: Richard Henderson
- Re: [gomp] Fix C++ invisiref PARM_DECLs in firstprivate/lastprivate/private
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |