diff mbox series

[5/5] Mapping of components of references to pointers to structs for OpenMP/OpenACC

Message ID 5b175bd107bcacf3946ac63f043406bfdd80d8f3.1621026372.git.julian@codesourcery.com
State New
Headers show
Series OpenACC/OpenMP: Rework struct component handling | expand

Commit Message

Julian Brown May 14, 2021, 9:27 p.m. UTC
GCC currently raises a parse error for indirect accesses to struct
members, where the base of the access is a reference to a pointer.
This patch fixes that case.

OK for trunk?

Thanks,

Julian

2021-05-14  Julian Brown  <julian@codesourcery.com>

gcc/cp/
	* semantics.c (finish_omp_clauses): Handle components of references to
	pointers to structs.

libgomp/
	* testsuite/libgomp.oacc-c++/deep-copy-17.C: Update test.
---
 gcc/cp/semantics.c                                | 7 ++++++-
 libgomp/testsuite/libgomp.oacc-c++/deep-copy-17.C | 2 +-
 2 files changed, 7 insertions(+), 2 deletions(-)

Comments

Chung-Lin Tang May 17, 2021, 1:07 p.m. UTC | #1
Hi Julian,

On 2021/5/15 5:27 AM, Julian Brown wrote:
> GCC currently raises a parse error for indirect accesses to struct
> members, where the base of the access is a reference to a pointer.
> This patch fixes that case.

> gcc/cp/
> 	* semantics.c (finish_omp_clauses): Handle components of references to
> 	pointers to structs.
> 
> libgomp/
> 	* testsuite/libgomp.oacc-c++/deep-copy-17.C: Update test.

> --- a/gcc/cp/semantics.c
> +++ b/gcc/cp/semantics.c
> @@ -7670,7 +7670,12 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
>   	  if ((ort == C_ORT_ACC || ort == C_ORT_OMP)
>   	      && TREE_CODE (t) == COMPONENT_REF
>   	      && TREE_CODE (TREE_OPERAND (t, 0)) == INDIRECT_REF)
> -	    t = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
> +	    {
> +	      t = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
> +	      /* References to pointers have a double indirection here.  */
> +	      if (TREE_CODE (t) == INDIRECT_REF)
> +		t = TREE_OPERAND (t, 0);
> +	    }
>   	  if (TREE_CODE (t) == COMPONENT_REF
>   	      && ((ort & C_ORT_OMP_DECLARE_SIMD) == C_ORT_OMP
>   		  || ort == C_ORT_ACC)

There is already a large plethora of such modifications in this patch:
"[PATCH, OG10, OpenMP 5.0, committed] Remove array section base-pointer mapping semantics, and other front-end adjustments."
https://gcc.gnu.org/pipermail/gcc-patches/2021-May/570075.html

I am in the process of taking that patch to mainline, so are you sure this is not already handled there?

> diff --git a/libgomp/testsuite/libgomp.oacc-c++/deep-copy-17.C b/libgomp/testsuite/libgomp.oacc-c++/deep-copy-17.C
> index dacbb520f3d..e038e9e3802 100644
> --- a/libgomp/testsuite/libgomp.oacc-c++/deep-copy-17.C
> +++ b/libgomp/testsuite/libgomp.oacc-c++/deep-copy-17.C
> @@ -83,7 +83,7 @@ void strrp (void)
>     a[0] = 8;
>     c[0] = 10;
>     e[0] = 12;
> -  #pragma acc parallel copy(n->a[0:10], n->c[0:10], n->e[0:10])
> +  #pragma acc parallel copy(n->a[0:10], n->b, n->c[0:10], n->d, n->e[0:10])
>     {
>       n->a[0] = n->c[0] + n->e[0];
>     }

This testcase can be added.

Chung-Lin
Julian Brown May 17, 2021, 2:12 p.m. UTC | #2
On Mon, 17 May 2021 21:07:19 +0800
Chung-Lin Tang <cltang@codesourcery.com> wrote:

> Hi Julian,
> 
> On 2021/5/15 5:27 AM, Julian Brown wrote:
> > GCC currently raises a parse error for indirect accesses to struct
> > members, where the base of the access is a reference to a pointer.
> > This patch fixes that case.  
> 
> > gcc/cp/
> > 	* semantics.c (finish_omp_clauses): Handle components of
> > references to pointers to structs.
> > 
> > libgomp/
> > 	* testsuite/libgomp.oacc-c++/deep-copy-17.C: Update test.  
> 
> > --- a/gcc/cp/semantics.c
> > +++ b/gcc/cp/semantics.c
> > @@ -7670,7 +7670,12 @@ finish_omp_clauses (tree clauses, enum
> > c_omp_region_type ort) if ((ort == C_ORT_ACC || ort == C_ORT_OMP)
> >   	      && TREE_CODE (t) == COMPONENT_REF
> >   	      && TREE_CODE (TREE_OPERAND (t, 0)) == INDIRECT_REF)
> > -	    t = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
> > +	    {
> > +	      t = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
> > +	      /* References to pointers have a double indirection
> > here.  */
> > +	      if (TREE_CODE (t) == INDIRECT_REF)
> > +		t = TREE_OPERAND (t, 0);
> > +	    }
> >   	  if (TREE_CODE (t) == COMPONENT_REF
> >   	      && ((ort & C_ORT_OMP_DECLARE_SIMD) == C_ORT_OMP
> >   		  || ort == C_ORT_ACC)  
> 
> There is already a large plethora of such modifications in this patch:
> "[PATCH, OG10, OpenMP 5.0, committed] Remove array section
> base-pointer mapping semantics, and other front-end adjustments."
> https://gcc.gnu.org/pipermail/gcc-patches/2021-May/570075.html
> 
> I am in the process of taking that patch to mainline, so are you sure
> this is not already handled there?

Hmm, it might be -- thanks. Consider this patch withdrawn if so. (But
yeah, keep the test case by all means!)

Julian
diff mbox series

Patch

diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 0d590c318fb..b09023f741c 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -7670,7 +7670,12 @@  finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
 	  if ((ort == C_ORT_ACC || ort == C_ORT_OMP)
 	      && TREE_CODE (t) == COMPONENT_REF
 	      && TREE_CODE (TREE_OPERAND (t, 0)) == INDIRECT_REF)
-	    t = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
+	    {
+	      t = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
+	      /* References to pointers have a double indirection here.  */
+	      if (TREE_CODE (t) == INDIRECT_REF)
+		t = TREE_OPERAND (t, 0);
+	    }
 	  if (TREE_CODE (t) == COMPONENT_REF
 	      && ((ort & C_ORT_OMP_DECLARE_SIMD) == C_ORT_OMP
 		  || ort == C_ORT_ACC)
diff --git a/libgomp/testsuite/libgomp.oacc-c++/deep-copy-17.C b/libgomp/testsuite/libgomp.oacc-c++/deep-copy-17.C
index dacbb520f3d..e038e9e3802 100644
--- a/libgomp/testsuite/libgomp.oacc-c++/deep-copy-17.C
+++ b/libgomp/testsuite/libgomp.oacc-c++/deep-copy-17.C
@@ -83,7 +83,7 @@  void strrp (void)
   a[0] = 8;
   c[0] = 10;
   e[0] = 12;
-  #pragma acc parallel copy(n->a[0:10], n->c[0:10], n->e[0:10])
+  #pragma acc parallel copy(n->a[0:10], n->b, n->c[0:10], n->d, n->e[0:10])
   {
     n->a[0] = n->c[0] + n->e[0];
   }