openmp: One omp_resolve_declare_variant followup
As noticed by Arseny, I got the condition when to call the add removal hook wrong wrong. Fixed thusly. 2020-05-28 Jakub Jelinek <jakub@redhat.com> PR middle-end/95315 * omp-general.c (omp_resolve_declare_variant): Fix up addition of declare variant cgraph node removal callback. * gcc.dg/gomp/pr95315-2.c: New test.
This commit is contained in:
parent
43a4fc095e
commit
3d0675f3bb
2 changed files with 47 additions and 1 deletions
|
@ -1851,7 +1851,7 @@ omp_resolve_declare_variant (tree base)
|
|||
}
|
||||
|
||||
static struct cgraph_node_hook_list *node_removal_hook_holder;
|
||||
if (node_removal_hook_holder)
|
||||
if (!node_removal_hook_holder)
|
||||
node_removal_hook_holder
|
||||
= symtab->add_cgraph_removal_hook (omp_declare_variant_remove_hook,
|
||||
NULL);
|
||||
|
|
46
gcc/testsuite/gcc.dg/gomp/pr95315-2.c
Normal file
46
gcc/testsuite/gcc.dg/gomp/pr95315-2.c
Normal file
|
@ -0,0 +1,46 @@
|
|||
/* PR middle-end/95315 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fopenmp --param ggc-min-heapsize=0" } */
|
||||
|
||||
typedef float __v4sf __attribute__((vector_size (16)));
|
||||
typedef int __v4si __attribute__((vector_size (16)));
|
||||
typedef float __v8sf __attribute__((vector_size (32)));
|
||||
typedef int __v8si __attribute__((vector_size (32)));
|
||||
__v4si f1 (__v4sf, __v4sf, float *);
|
||||
__v8si f2 (__v8sf, __v8sf, float *);
|
||||
__v4si f3 (__v4si, int, __v4si);
|
||||
|
||||
#pragma omp declare variant (f1) match (construct={parallel,for,simd(simdlen(4),notinbranch,uniform(z),aligned(z:4 * sizeof (*z)))})
|
||||
#pragma omp declare variant (f2) match (construct={for,simd(uniform(z),simdlen(8),notinbranch)})
|
||||
int f4 (float x, float y, float *z);
|
||||
|
||||
#pragma omp declare variant (f3) match (construct={simd(simdlen(4),inbranch,linear(y:1))})
|
||||
int f5 (int x, int y);
|
||||
|
||||
static inline __attribute__((always_inline)) int
|
||||
ret_false (void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
test (int *x, float *y, float *z, float *w)
|
||||
{
|
||||
#pragma omp parallel
|
||||
#pragma omp for simd aligned (w:4 * sizeof (float))
|
||||
for (int i = 0; i < 1024; i++)
|
||||
if (ret_false ())
|
||||
x[i] = f4 (y[i], z[i], w);
|
||||
#pragma omp parallel for simd aligned (w:4 * sizeof (float)) simdlen(4)
|
||||
for (int i = 1024; i < 2048; i++)
|
||||
if (ret_false ())
|
||||
x[i] = f4 (y[i], z[i], w);
|
||||
#pragma omp simd aligned (w:4 * sizeof (float))
|
||||
for (int i = 2048; i < 4096; i++)
|
||||
if (ret_false ())
|
||||
x[i] = f4 (y[i], z[i], w);
|
||||
#pragma omp simd
|
||||
for (int i = 4096; i < 8192; i++)
|
||||
if (x[i] > 10 && ret_false ())
|
||||
x[i] = f5 (x[i], i);
|
||||
}
|
Loading…
Add table
Reference in a new issue