Fix omp-low ICE for indirect references based off component access [PR103642]
This issue was triggered after the patch extending syntax for component access
in map clauses in commit 0ab29cf0bb
.
In gimplify_scan_omp_clauses, the case for handling indirect accesses (which
creates firstprivate ptr and zero-length array section map for such decls) was
erroneously went into for non-pointer cases (here being the base struct decl),
so added the
appropriate checks there.
Added new testcase is a compile only test for the ICE. The original omptests
t-partial-struct test actually should not execute correctly, because for
map(t.s->a[:N]), map(t.s[:1]) is not implicitly mapped, thus the entire
offloaded access does not work as is (fixing that omptests test is out of
scope here).
2022-01-27 Chung-Lin Tang <cltang@codesourcery.com>
PR middle-end/103642
gcc/ChangeLog:
* gimplify.cc (gimplify_scan_omp_clauses): Do not do indir_p handling
for non-pointer or non-reference-to-pointer cases.
gcc/testsuite/ChangeLog:
* c-c++-common/gomp/pr103642.c: New test.
This commit is contained in:
parent
2e4bf373f2
commit
1c91b01492
|
@ -9552,7 +9552,10 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
|
|||
== REFERENCE_TYPE))
|
||||
decl = TREE_OPERAND (decl, 0);
|
||||
}
|
||||
if (decl != orig_decl && DECL_P (decl) && indir_p)
|
||||
if (decl != orig_decl && DECL_P (decl) && indir_p
|
||||
&& (TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE
|
||||
|| (decl_ref
|
||||
&& TREE_CODE (TREE_TYPE (decl_ref)) == POINTER_TYPE)))
|
||||
{
|
||||
gomp_map_kind k
|
||||
= ((code == OACC_EXIT_DATA || code == OMP_TARGET_EXIT_DATA)
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
/* PR middle-end/103642 */
|
||||
/* { dg-do compile } */
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int *a;
|
||||
} S;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
S *s;
|
||||
int *ptr;
|
||||
} T;
|
||||
|
||||
#define N 10
|
||||
|
||||
int main (void)
|
||||
{
|
||||
T t;
|
||||
t.s = (S *) malloc (sizeof (S));
|
||||
t.s->a = (int *) malloc (sizeof(int) * N);
|
||||
|
||||
#pragma omp target map(from: t.s->a[:N])
|
||||
{
|
||||
t.s->a[0] = 1;
|
||||
}
|
||||
|
||||
free (t.s->a);
|
||||
free (t.s);
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue