7855700e63
* gimplify.c (gimplify_scan_omp_clauses): Don't sorry_at on lastprivate conditional on combined for simd. * omp-low.c (struct omp_context): Add combined_into_simd_safelen0 member. (lower_rec_input_clauses): For gimple_omp_for_combined_into_p max_vf 1 constructs, don't remove lastprivate_conditional_map, but instead set ctx->combined_into_simd_safelen0 and adjust hash_map, so that it points to parent construct temporaries. (lower_lastprivate_clauses): Handle ctx->combined_into_simd_safelen0 like !ctx->lastprivate_conditional_map. (lower_omp_1) <case GIMPLE_ASSIGN>: If up->combined_into_simd_safelen0, use up->outer context instead of up. * omp-expand.c (expand_omp_for_generic): Perform cond_var bump even if gimple_omp_for_combined_p. (expand_omp_for_static_nochunk): Likewise. (expand_omp_for_static_chunk): Add forgotten cond_var bump that was probably moved over into expand_omp_for_generic rather than being copied there. gcc/cp/ * cp-tree.h (CP_OMP_CLAUSE_INFO): Allow for any clauses up to _condvar_ instead of only up to linear. gcc/testsuite/ * c-c++-common/gomp/lastprivate-conditional-2.c (foo): Don't expect a sorry_at on any of the clauses. libgomp/ * testsuite/libgomp.c-c++-common/lastprivate-conditional-7.c: New test. * testsuite/libgomp.c-c++-common/lastprivate-conditional-8.c: New test. * testsuite/libgomp.c-c++-common/lastprivate-conditional-9.c: New test. * testsuite/libgomp.c-c++-common/lastprivate-conditional-10.c: New test. From-SVN: r271907
61 lines
1.3 KiB
C
61 lines
1.3 KiB
C
/* { dg-do run } */
|
|
/* { dg-additional-options "-O2 -fdump-tree-vect-details" } */
|
|
/* { dg-additional-options "-mavx" { target avx_runtime } } */
|
|
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 3 "vect" { target avx_runtime } } } */
|
|
|
|
int v, x;
|
|
|
|
__attribute__((noipa)) int
|
|
foo (int *a)
|
|
{
|
|
#pragma omp parallel for simd lastprivate (conditional: x) schedule(simd: static)
|
|
for (int i = 0; i < 128; i++)
|
|
if (a[i])
|
|
x = a[i];
|
|
return x;
|
|
}
|
|
|
|
__attribute__((noipa)) int
|
|
bar (int *a, int *b)
|
|
{
|
|
#pragma omp parallel
|
|
#pragma omp for simd lastprivate (conditional: x, v) schedule(static, 16)
|
|
for (int i = 16; i < 128; ++i)
|
|
{
|
|
if (a[i])
|
|
x = a[i];
|
|
if (b[i])
|
|
v = b[i] + 10;
|
|
}
|
|
return x;
|
|
}
|
|
|
|
__attribute__((noipa)) int
|
|
baz (int *a)
|
|
{
|
|
#pragma omp parallel for simd lastprivate (conditional: x) schedule(simd: dynamic, 16)
|
|
for (int i = 0; i < 128; i++)
|
|
if (a[i])
|
|
x = a[i] + 5;
|
|
return x;
|
|
}
|
|
|
|
int
|
|
main ()
|
|
{
|
|
int a[128], b[128], i;
|
|
for (i = 0; i < 128; i++)
|
|
{
|
|
a[i] = ((i % 11) == 2) ? i + 10 : 0;
|
|
asm volatile ("" : "+g" (i));
|
|
b[i] = ((i % 13) == 5) ? i * 2 : 0;
|
|
}
|
|
if (foo (a) != 133)
|
|
__builtin_abort ();
|
|
if (bar (b, a) != 244 || v != 143)
|
|
__builtin_abort ();
|
|
if (baz (b) != 249)
|
|
__builtin_abort ();
|
|
return 0;
|
|
}
|