/* { dg-do compile } */ /* { dg-additional-options "-fdump-tree-gimple -fdump-tree-ompdevlow" } */ #define N 256 void f (int a[], int num) { int i; #pragma omp metadirective \ when (target_device={device_num(num), kind("gpu"), arch("nvptx")}: \ target parallel for map(tofrom: a[0:N])) \ when (target_device={device_num(num), kind("gpu"), \ arch("amdgcn"), isa("gfx906")}: \ target parallel for) \ when (target_device={device_num(num), kind("cpu"), arch("x86_64")}: \ parallel for) for (i = 0; i < N; i++) a[i] += i; #pragma omp metadirective \ when (target_device={kind("gpu"), arch("nvptx")}: \ target parallel for map(tofrom: a[0:N])) for (i = 0; i < N; i++) a[i] += i; } /* For configurations with offloading, we expect one "pragma omp target" with "device(num)" for each target_device selector that specifies "device_num(num)". Without offloading, there should be zero as the resolution happens during gimplification. */ /* { dg-final { scan-tree-dump-times "pragma omp target\[^\\n\]* device\\(num" 3 "gimple" { target offloading_enabled } } } */ /* { dg-final { scan-tree-dump-times "pragma omp target\[^\\n\]* device\\(num" 0 "gimple" { target { ! offloading_enabled } } } } */ /* For configurations with offloading, expect one OMP_TARGET_DEVICE_MATCHES for each kind/arch/isa selector. These are supposed to go away after ompdevlow. */ /* { dg-final { scan-tree-dump-times "OMP_TARGET_DEVICE_MATCHES" 9 "gimple" { target offloading_enabled } } } */ /* { dg-final { scan-tree-dump-times "OMP_TARGET_DEVICE_MATCHES" 0 "gimple" { target { ! offloading_enabled } } } } */ /* { dg-final { scan-tree-dump-times "OMP_TARGET_DEVICE_MATCHES" 0 "ompdevlow" { target offloading_enabled } } } */