gimplify.c (gimplify_omp_for): For #pragma omp for simd iterator not mentioned in clauses use private clause if...

* gimplify.c (gimplify_omp_for): For #pragma omp for simd iterator
	not mentioned in clauses use private clause if the iterator is
	declared in #pragma omp for simd, and when adding lastprivate
	instead, add it to the outer #pragma omp for too.  Diagnose
	if the variable is private in outer context.  For simd collapse > 1
	loops, replace all iterators with temporaries.
	* omp-low.c (lower_rec_input_clauses): Handle LINEAR clause the
	same even in collapse > 1 loops.
gcc/c/
	* c-parser.c (c_parser_omp_for_loop): For
	#pragma omp parallel for simd move lastprivate clause from parallel
	to for rather than simd.
gcc/cp/
	* parser.c (cp_parser_omp_for_loop): For
	#pragma omp parallel for simd move lastprivate clause from parallel
	to for rather than simd.
libgomp/
	* testsuite/libgomp.c/for-2.c: Define SC to static for
	#pragma omp for simd testing.
	* testsuite/libgomp.c/for-2.h (SC): Define if not defined.
	(N(f5), N(f6), N(f7), N(f8), N(f10), N(f12), N(f14)): Use
	SC macro.
	* testsuite/libgomp.c/simd-14.c: New test.
	* testsuite/libgomp.c/simd-15.c: New test.
	* testsuite/libgomp.c/simd-16.c: New test.
	* testsuite/libgomp.c/simd-17.c: New test.
	* testsuite/libgomp.c++/for-10.C: Define SC to static for
	#pragma omp for simd testing.
	* testsuite/libgomp.c++/simd10.C: New test.
	* testsuite/libgomp.c++/simd11.C: New test.
	* testsuite/libgomp.c++/simd12.C: New test.
	* testsuite/libgomp.c++/simd13.C: New test.

From-SVN: r211930
This commit is contained in:
Jakub Jelinek 2014-06-24 09:53:52 +02:00 committed by Jakub Jelinek
parent b46ebd6c7b
commit 56ad0e3820
19 changed files with 536 additions and 33 deletions

View File

@ -1,5 +1,14 @@
2014-06-24 Jakub Jelinek <jakub@redhat.com> 2014-06-24 Jakub Jelinek <jakub@redhat.com>
* gimplify.c (gimplify_omp_for): For #pragma omp for simd iterator
not mentioned in clauses use private clause if the iterator is
declared in #pragma omp for simd, and when adding lastprivate
instead, add it to the outer #pragma omp for too. Diagnose
if the variable is private in outer context. For simd collapse > 1
loops, replace all iterators with temporaries.
* omp-low.c (lower_rec_input_clauses): Handle LINEAR clause the
same even in collapse > 1 loops.
* gimplify.c (gimplify_scan_omp_clauses) <case OMP_CLAUSE_MAP, * gimplify.c (gimplify_scan_omp_clauses) <case OMP_CLAUSE_MAP,
OMP_CLAUSE_TO, OMP_CLAUSE_FROM): Make sure OMP_CLAUSE_SIZE is OMP_CLAUSE_TO, OMP_CLAUSE_FROM): Make sure OMP_CLAUSE_SIZE is
non-NULL. non-NULL.

View File

@ -1,3 +1,9 @@
2014-06-24 Jakub Jelinek <jakub@redhat.com>
* c-parser.c (c_parser_omp_for_loop): For
#pragma omp parallel for simd move lastprivate clause from parallel
to for rather than simd.
2014-06-23 Marek Polacek <polacek@redhat.com> 2014-06-23 Marek Polacek <polacek@redhat.com>
* c-typeck.c (parser_build_binary_op): Don't call * c-typeck.c (parser_build_binary_op): Don't call

View File

@ -11910,8 +11910,17 @@ c_parser_omp_for_loop (location_t loc, c_parser *parser, enum tree_code code,
tree l = build_omp_clause (OMP_CLAUSE_LOCATION (*c), tree l = build_omp_clause (OMP_CLAUSE_LOCATION (*c),
OMP_CLAUSE_LASTPRIVATE); OMP_CLAUSE_LASTPRIVATE);
OMP_CLAUSE_DECL (l) = OMP_CLAUSE_DECL (*c); OMP_CLAUSE_DECL (l) = OMP_CLAUSE_DECL (*c);
if (code == OMP_SIMD)
{
OMP_CLAUSE_CHAIN (l)
= cclauses[C_OMP_CLAUSE_SPLIT_FOR];
cclauses[C_OMP_CLAUSE_SPLIT_FOR] = l;
}
else
{
OMP_CLAUSE_CHAIN (l) = clauses; OMP_CLAUSE_CHAIN (l) = clauses;
clauses = l; clauses = l;
}
OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED); OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED);
} }
} }

View File

@ -1,3 +1,9 @@
2014-06-24 Jakub Jelinek <jakub@redhat.com>
* parser.c (cp_parser_omp_for_loop): For
#pragma omp parallel for simd move lastprivate clause from parallel
to for rather than simd.
2014-06-23 Paolo Carlini <paolo.carlini@oracle.com> 2014-06-23 Paolo Carlini <paolo.carlini@oracle.com>
DR 577 DR 577

View File

@ -29418,9 +29418,17 @@ cp_parser_omp_for_loop (cp_parser *parser, enum tree_code code, tree clauses,
change it to shared (decl) in OMP_PARALLEL_CLAUSES. */ change it to shared (decl) in OMP_PARALLEL_CLAUSES. */
tree l = build_omp_clause (loc, OMP_CLAUSE_LASTPRIVATE); tree l = build_omp_clause (loc, OMP_CLAUSE_LASTPRIVATE);
OMP_CLAUSE_DECL (l) = real_decl; OMP_CLAUSE_DECL (l) = real_decl;
OMP_CLAUSE_CHAIN (l) = clauses;
CP_OMP_CLAUSE_INFO (l) = CP_OMP_CLAUSE_INFO (*c); CP_OMP_CLAUSE_INFO (l) = CP_OMP_CLAUSE_INFO (*c);
if (code == OMP_SIMD)
{
OMP_CLAUSE_CHAIN (l) = cclauses[C_OMP_CLAUSE_SPLIT_FOR];
cclauses[C_OMP_CLAUSE_SPLIT_FOR] = l;
}
else
{
OMP_CLAUSE_CHAIN (l) = clauses;
clauses = l; clauses = l;
}
OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED); OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED);
CP_OMP_CLAUSE_INFO (*c) = NULL; CP_OMP_CLAUSE_INFO (*c) = NULL;
add_private_clause = false; add_private_clause = false;

View File

@ -6810,6 +6810,31 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
bool lastprivate bool lastprivate
= (!has_decl_expr = (!has_decl_expr
|| !bitmap_bit_p (has_decl_expr, DECL_UID (decl))); || !bitmap_bit_p (has_decl_expr, DECL_UID (decl)));
if (lastprivate
&& gimplify_omp_ctxp->outer_context
&& gimplify_omp_ctxp->outer_context->region_type
== ORT_WORKSHARE
&& gimplify_omp_ctxp->outer_context->combined_loop
&& !gimplify_omp_ctxp->outer_context->distribute)
{
struct gimplify_omp_ctx *outer
= gimplify_omp_ctxp->outer_context;
n = splay_tree_lookup (outer->variables,
(splay_tree_key) decl);
if (n != NULL
&& (n->value & GOVD_DATA_SHARE_CLASS) == GOVD_LOCAL)
lastprivate = false;
else if (omp_check_private (outer, decl, false))
error ("lastprivate variable %qE is private in outer "
"context", DECL_NAME (decl));
else
{
omp_add_variable (outer, decl,
GOVD_LASTPRIVATE | GOVD_SEEN);
if (outer->outer_context)
omp_notice_variable (outer->outer_context, decl, true);
}
}
c = build_omp_clause (input_location, c = build_omp_clause (input_location,
lastprivate ? OMP_CLAUSE_LASTPRIVATE lastprivate ? OMP_CLAUSE_LASTPRIVATE
: OMP_CLAUSE_PRIVATE); : OMP_CLAUSE_PRIVATE);
@ -6829,10 +6854,13 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
/* If DECL is not a gimple register, create a temporary variable to act /* If DECL is not a gimple register, create a temporary variable to act
as an iteration counter. This is valid, since DECL cannot be as an iteration counter. This is valid, since DECL cannot be
modified in the body of the loop. */ modified in the body of the loop. Similarly for any iteration vars
in simd with collapse > 1 where the iterator vars must be
lastprivate. */
if (orig_for_stmt != for_stmt) if (orig_for_stmt != for_stmt)
var = decl; var = decl;
else if (!is_gimple_reg (decl)) else if (!is_gimple_reg (decl)
|| (simd && TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) > 1))
{ {
var = create_tmp_var (TREE_TYPE (decl), get_name (decl)); var = create_tmp_var (TREE_TYPE (decl), get_name (decl));
TREE_OPERAND (t, 0) = var; TREE_OPERAND (t, 0) = var;

View File

@ -3421,8 +3421,6 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
OMP_CLAUSE__LOOPTEMP_); OMP_CLAUSE__LOOPTEMP_);
gcc_assert (c); gcc_assert (c);
tree l = OMP_CLAUSE_DECL (c); tree l = OMP_CLAUSE_DECL (c);
if (fd->collapse == 1)
{
tree n1 = fd->loop.n1; tree n1 = fd->loop.n1;
tree step = fd->loop.step; tree step = fd->loop.step;
tree itype = TREE_TYPE (l); tree itype = TREE_TYPE (l);
@ -3432,13 +3430,11 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
if (TYPE_UNSIGNED (itype) if (TYPE_UNSIGNED (itype)
&& fd->loop.cond_code == GT_EXPR) && fd->loop.cond_code == GT_EXPR)
l = fold_build2 (TRUNC_DIV_EXPR, itype, l = fold_build2 (TRUNC_DIV_EXPR, itype,
fold_build1 (NEGATE_EXPR, fold_build1 (NEGATE_EXPR, itype, l),
itype, l),
fold_build1 (NEGATE_EXPR, fold_build1 (NEGATE_EXPR,
itype, step)); itype, step));
else else
l = fold_build2 (TRUNC_DIV_EXPR, itype, l, step); l = fold_build2 (TRUNC_DIV_EXPR, itype, l, step);
}
t = fold_build2 (MULT_EXPR, stept, t = fold_build2 (MULT_EXPR, stept,
fold_convert (stept, l), t); fold_convert (stept, l), t);
if (POINTER_TYPE_P (TREE_TYPE (x))) if (POINTER_TYPE_P (TREE_TYPE (x)))

View File

@ -1,5 +1,21 @@
2014-06-24 Jakub Jelinek <jakub@redhat.com> 2014-06-24 Jakub Jelinek <jakub@redhat.com>
* testsuite/libgomp.c/for-2.c: Define SC to static for
#pragma omp for simd testing.
* testsuite/libgomp.c/for-2.h (SC): Define if not defined.
(N(f5), N(f6), N(f7), N(f8), N(f10), N(f12), N(f14)): Use
SC macro.
* testsuite/libgomp.c/simd-14.c: New test.
* testsuite/libgomp.c/simd-15.c: New test.
* testsuite/libgomp.c/simd-16.c: New test.
* testsuite/libgomp.c/simd-17.c: New test.
* testsuite/libgomp.c++/for-10.C: Define SC to static for
#pragma omp for simd testing.
* testsuite/libgomp.c++/simd10.C: New test.
* testsuite/libgomp.c++/simd11.C: New test.
* testsuite/libgomp.c++/simd12.C: New test.
* testsuite/libgomp.c++/simd13.C: New test.
* testsuite/libgomp.fortran/aligned1.f03: New test. * testsuite/libgomp.fortran/aligned1.f03: New test.
* testsuite/libgomp.fortran/nestedfn5.f90: New test. * testsuite/libgomp.fortran/nestedfn5.f90: New test.
* testsuite/libgomp.fortran/target7.f90: Surround loop spawning * testsuite/libgomp.fortran/target7.f90: Surround loop spawning

View File

@ -19,11 +19,14 @@ extern "C" void abort ();
#undef F #undef F
#undef G #undef G
#undef SC
#define SC static
#define F for simd #define F for simd
#define G f_simd #define G f_simd
#include "../libgomp.c/for-1.h" #include "../libgomp.c/for-1.h"
#undef F #undef F
#undef G #undef G
#undef SC
int int
main () main ()

View File

@ -0,0 +1,6 @@
// { dg-do run }
// { dg-options "-O2" }
// { dg-additional-options "-msse2" { target sse2_runtime } }
// { dg-additional-options "-mavx" { target avx_runtime } }
#include "../libgomp.c/simd-14.c"

View File

@ -0,0 +1,6 @@
// { dg-do run }
// { dg-options "-O2" }
// { dg-additional-options "-msse2" { target sse2_runtime } }
// { dg-additional-options "-mavx" { target avx_runtime } }
#include "../libgomp.c/simd-15.c"

View File

@ -0,0 +1,6 @@
// { dg-do run }
// { dg-options "-O2" }
// { dg-additional-options "-msse2" { target sse2_runtime } }
// { dg-additional-options "-mavx" { target avx_runtime } }
#include "../libgomp.c/simd-16.c"

View File

@ -0,0 +1,6 @@
// { dg-do run }
// { dg-options "-O2" }
// { dg-additional-options "-msse2" { target sse2_runtime } }
// { dg-additional-options "-mavx" { target avx_runtime } }
#include "../libgomp.c/simd-17.c"

View File

@ -21,11 +21,14 @@ extern void abort (void);
#undef F #undef F
#undef G #undef G
#undef SC
#define SC static
#define F for simd #define F for simd
#define G f_simd #define G f_simd
#include "for-1.h" #include "for-1.h"
#undef F #undef F
#undef G #undef G
#undef SC
int int
main () main ()

View File

@ -8,6 +8,9 @@ noreturn (void)
for (;;); for (;;);
} }
#endif #endif
#ifndef SC
#define SC
#endif
__attribute__((noinline, noclone)) void __attribute__((noinline, noclone)) void
N(f0) (void) N(f0) (void)
@ -57,7 +60,7 @@ __attribute__((noinline, noclone)) void
N(f5) (int n11, int n12, int n21, int n22, int n31, int n32, N(f5) (int n11, int n12, int n21, int n22, int n31, int n32,
int s1, int s2, int s3) int s1, int s2, int s3)
{ {
int v1, v2, v3; SC int v1, v2, v3;
#pragma omp F S collapse(3) #pragma omp F S collapse(3)
for (v1 = n11; v1 < n12; v1 += s1) for (v1 = n11; v1 < n12; v1 += s1)
for (v2 = n21; v2 < n22; v2 += s2) for (v2 = n21; v2 < n22; v2 += s2)
@ -69,8 +72,8 @@ __attribute__((noinline, noclone)) void
N(f6) (int n11, int n12, int n21, int n22, long long n31, long long n32, N(f6) (int n11, int n12, int n21, int n22, long long n31, long long n32,
int s1, int s2, long long int s3) int s1, int s2, long long int s3)
{ {
int v1, v2; SC int v1, v2;
long long v3; SC long long v3;
#pragma omp F S collapse(3) #pragma omp F S collapse(3)
for (v1 = n11; v1 > n12; v1 += s1) for (v1 = n11; v1 > n12; v1 += s1)
for (v2 = n21; v2 > n22; v2 += s2) for (v2 = n21; v2 > n22; v2 += s2)
@ -81,8 +84,8 @@ N(f6) (int n11, int n12, int n21, int n22, long long n31, long long n32,
__attribute__((noinline, noclone)) void __attribute__((noinline, noclone)) void
N(f7) (void) N(f7) (void)
{ {
unsigned int v1, v3; SC unsigned int v1, v3;
unsigned long long v2; SC unsigned long long v2;
#pragma omp F S collapse(3) #pragma omp F S collapse(3)
for (v1 = 0; v1 < 20; v1 += 2) for (v1 = 0; v1 < 20; v1 += 2)
for (v2 = __LONG_LONG_MAX__ + 16ULL; for (v2 = __LONG_LONG_MAX__ + 16ULL;
@ -94,7 +97,7 @@ N(f7) (void)
__attribute__((noinline, noclone)) void __attribute__((noinline, noclone)) void
N(f8) (void) N(f8) (void)
{ {
long long v1, v2, v3; SC long long v1, v2, v3;
#pragma omp F S collapse(3) #pragma omp F S collapse(3)
for (v1 = 0; v1 < 20; v1 += 2) for (v1 = 0; v1 < 20; v1 += 2)
for (v2 = 30; v2 < 20; v2++) for (v2 = 30; v2 < 20; v2++)
@ -118,7 +121,7 @@ N(f9) (void)
__attribute__((noinline, noclone)) void __attribute__((noinline, noclone)) void
N(f10) (void) N(f10) (void)
{ {
int i; SC int i;
#pragma omp F S collapse(3) #pragma omp F S collapse(3)
for (i = 0; i < 10; i++) for (i = 0; i < 10; i++)
for (int j = 10; j < 8; j++) for (int j = 10; j < 8; j++)
@ -146,7 +149,7 @@ N(f11) (int n)
__attribute__((noinline, noclone)) void __attribute__((noinline, noclone)) void
N(f12) (int n) N(f12) (int n)
{ {
int i; SC int i;
#pragma omp F S collapse(3) #pragma omp F S collapse(3)
for (i = 0; i < 10; i++) for (i = 0; i < 10; i++)
for (int j = n; j < 8; j++) for (int j = n; j < 8; j++)
@ -170,7 +173,7 @@ N(f13) (void)
__attribute__((noinline, noclone)) void __attribute__((noinline, noclone)) void
N(f14) (void) N(f14) (void)
{ {
float *i; SC float *i;
#pragma omp F S collapse(3) #pragma omp F S collapse(3)
for (i = &b[0][0][0]; i < &b[0][0][10]; i++) for (i = &b[0][0][0]; i < &b[0][0][10]; i++)
for (float *j = &b[0][15][0]; j > &b[0][0][0]; j -= 10) for (float *j = &b[0][15][0]; j > &b[0][0][0]; j -= 10)

View File

@ -0,0 +1,123 @@
/* { dg-do run } */
/* { dg-options "-O2" } */
/* { dg-additional-options "-msse2" { target sse2_runtime } } */
/* { dg-additional-options "-mavx" { target avx_runtime } } */
int
main ()
{
int i, j, b, c = 0;
i = 4; j = 4; b = 7;
#pragma omp simd linear(b:2) reduction(+:c)
for (i = 0; i < 64; i++)
{
c = c + (b != 7 + 2 * i);
b = b + 2;
}
if (c || i != 64 || b != 7 + 64 * 2)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp simd linear(b:3) reduction(+:c)
for (i = 0; i < 64; i += 4)
{
c = c + (b != 7 + i / 4 * 3);
b = b + 3;
}
if (c || i != 64 || b != 7 + 16 * 3)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp simd linear(i) linear(b:2) reduction(+:c)
for (i = 0; i < 64; i++)
{
c = c + (b != 7 + 2 * i);
b = b + 2;
}
if (c || i != 64 || b != 7 + 64 * 2)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp simd linear(i:4) linear(b:3) reduction(+:c)
for (i = 0; i < 64; i += 4)
{
c = c + (b != 7 + i / 4 * 3);
b = b + 3;
}
if (c || i != 64 || b != 7 + 16 * 3)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp simd collapse (2) linear(b:2) reduction(+:c)
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
{
c = c + (b != 7 + 2 * j + 2 * 8 * i);
b = b + 2;
}
if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp simd collapse (2) lastprivate (i, j) linear(b:2) reduction(+:c)
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
{
c = c + (b != 7 + 2 * j + 2 * 8 * i);
b = b + 2;
}
if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp parallel for simd schedule (static, 4) linear(b:2) reduction(+:c)
for (i = 0; i < 64; i++)
{
c = c + (b != 7 + 2 * i);
b = b + 2;
}
if (c || i != 64 || b != 7 + 64 * 2)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp parallel for simd schedule (static, 4) linear(b:3) reduction(+:c)
for (i = 0; i < 64; i += 4)
{
c = c + (b != 7 + i / 4 * 3);
b = b + 3;
}
if (c || i != 64 || b != 7 + 16 * 3)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp parallel for simd schedule (static, 4) linear(i) linear(b:2) reduction(+:c)
for (i = 0; i < 64; i++)
{
c = c + (b != 7 + 2 * i);
b = b + 2;
}
if (c || i != 64 || b != 7 + 64 * 2)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp parallel for simd schedule (static, 4) linear(i:4) linear(b:3) reduction(+:c)
for (i = 0; i < 64; i += 4)
{
c = c + (b != 7 + i / 4 * 3);
b = b + 3;
}
if (c || i != 64 || b != 7 + 16 * 3)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp parallel for simd lastprivate (i, j) collapse (2) schedule (static, 4) linear(b:2) reduction(+:c)
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
{
c = c + (b != 7 + 2 * j + 2 * 8 * i);
b = b + 2;
}
if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp parallel for simd collapse (2) schedule (static, 4) linear(b:2) reduction(+:c)
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
{
c = c + (b != 7 + 2 * j + 2 * 8 * i);
b = b + 2;
}
if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
__builtin_abort ();
return 0;
}

View File

@ -0,0 +1,129 @@
/* { dg-do run } */
/* { dg-options "-O2" } */
/* { dg-additional-options "-msse2" { target sse2_runtime } } */
/* { dg-additional-options "-mavx" { target avx_runtime } } */
static inline void
foo (int *b, int *i, int *j, int x)
{
*b = *b + x + (*i - *i) + (*j - *j);
}
int
main ()
{
int i, j, b, c = 0;
i = 4; j = 4; b = 7;
#pragma omp simd linear(b:2) reduction(+:c)
for (i = 0; i < 64; i++)
{
c = c + (b != 7 + 2 * i);
foo (&b, &i, &j, 2);
}
if (c || i != 64 || b != 7 + 64 * 2)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp simd linear(b:3) reduction(+:c)
for (i = 0; i < 64; i += 4)
{
c = c + (b != 7 + i / 4 * 3);
foo (&b, &i, &j, 3);
}
if (c || i != 64 || b != 7 + 16 * 3)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp simd linear(i) linear(b:2) reduction(+:c)
for (i = 0; i < 64; i++)
{
c = c + (b != 7 + 2 * i);
foo (&b, &i, &j, 2);
}
if (c || i != 64 || b != 7 + 64 * 2)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp simd linear(i:4) linear(b:3) reduction(+:c)
for (i = 0; i < 64; i += 4)
{
c = c + (b != 7 + i / 4 * 3);
foo (&b, &i, &j, 3);
}
if (c || i != 64 || b != 7 + 16 * 3)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp simd collapse (2) linear(b:2) reduction(+:c)
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
{
c = c + (b != 7 + 2 * j + 2 * 8 * i);
foo (&b, &i, &j, 2);
}
if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp simd collapse (2) lastprivate (i, j) linear(b:2) reduction(+:c)
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
{
c = c + (b != 7 + 2 * j + 2 * 8 * i);
foo (&b, &i, &j, 2);
}
if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp parallel for simd schedule (static, 4) linear(b:2) reduction(+:c)
for (i = 0; i < 64; i++)
{
c = c + (b != 7 + 2 * i);
foo (&b, &i, &j, 2);
}
if (c || i != 64 || b != 7 + 64 * 2)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp parallel for simd schedule (static, 4) linear(b:3) reduction(+:c)
for (i = 0; i < 64; i += 4)
{
c = c + (b != 7 + i / 4 * 3);
foo (&b, &i, &j, 3);
}
if (c || i != 64 || b != 7 + 16 * 3)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp parallel for simd schedule (static, 4) linear(i) linear(b:2) reduction(+:c)
for (i = 0; i < 64; i++)
{
c = c + (b != 7 + 2 * i);
foo (&b, &i, &j, 2);
}
if (c || i != 64 || b != 7 + 64 * 2)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp parallel for simd schedule (static, 4) linear(i:4) linear(b:3) reduction(+:c)
for (i = 0; i < 64; i += 4)
{
c = c + (b != 7 + i / 4 * 3);
foo (&b, &i, &j, 3);
}
if (c || i != 64 || b != 7 + 16 * 3)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp parallel for simd lastprivate (i, j) collapse (2) schedule (static, 4) linear(b:2) reduction(+:c)
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
{
c = c + (b != 7 + 2 * j + 2 * 8 * i);
foo (&b, &i, &j, 2);
}
if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
__builtin_abort ();
i = 4; j = 4; b = 7;
#pragma omp parallel for simd collapse (2) schedule (static, 4) linear(b:2) reduction(+:c)
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
{
c = c + (b != 7 + 2 * j + 2 * 8 * i);
foo (&b, &i, &j, 2);
}
if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
__builtin_abort ();
return 0;
}

View File

@ -0,0 +1,67 @@
/* { dg-do run } */
/* { dg-options "-O2 -std=c99" } */
/* { dg-additional-options "-msse2" { target sse2_runtime } } */
/* { dg-additional-options "-mavx" { target avx_runtime } } */
int
main ()
{
int b, c = 0;
b = 7;
#pragma omp simd linear(b:2) reduction(+:c)
for (int i = 0; i < 64; i++)
{
c = c + (b != 7 + 2 * i);
b = b + 2;
}
if (c || b != 7 + 64 * 2)
__builtin_abort ();
b = 7;
#pragma omp simd linear(b:3) reduction(+:c)
for (int i = 0; i < 64; i += 4)
{
c = c + (b != 7 + i / 4 * 3);
b = b + 3;
}
if (c || b != 7 + 16 * 3)
__builtin_abort ();
b = 7;
#pragma omp simd collapse (2) linear(b:2) reduction(+:c)
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++)
{
c = c + (b != 7 + 2 * j + 2 * 8 * i);
b = b + 2;
}
if (c || b != 7 + 64 * 2)
__builtin_abort ();
b = 7;
#pragma omp parallel for simd schedule (static, 4) linear(b:2) reduction(+:c)
for (int i = 0; i < 64; i++)
{
c = c + (b != 7 + 2 * i);
b = b + 2;
}
if (c || b != 7 + 64 * 2)
__builtin_abort ();
b = 7;
#pragma omp parallel for simd schedule (static, 4) linear(b:3) reduction(+:c)
for (int i = 0; i < 64; i += 4)
{
c = c + (b != 7 + i / 4 * 3);
b = b + 3;
}
if (c || b != 7 + 16 * 3)
__builtin_abort ();
b = 7;
#pragma omp parallel for simd collapse (2) schedule (static, 4) linear(b:2) reduction(+:c)
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++)
{
c = c + (b != 7 + 2 * j + 2 * 8 * i);
b = b + 2;
}
if (c || b != 7 + 64 * 2)
__builtin_abort ();
return 0;
}

View File

@ -0,0 +1,73 @@
/* { dg-do run } */
/* { dg-options "-O2 -std=c99" } */
/* { dg-additional-options "-msse2" { target sse2_runtime } } */
/* { dg-additional-options "-mavx" { target avx_runtime } } */
static inline void
foo (int *b, int *i, int *j, int x)
{
*b = *b + x + (*i - *i) + (*j - *j);
}
int
main ()
{
int b, c = 0;
b = 7;
#pragma omp simd linear(b:2) reduction(+:c)
for (int i = 0; i < 64; i++)
{
c = c + (b != 7 + 2 * i);
foo (&b, &i, &i, 2);
}
if (c || b != 7 + 64 * 2)
__builtin_abort ();
b = 7;
#pragma omp simd linear(b:3) reduction(+:c)
for (int i = 0; i < 64; i += 4)
{
c = c + (b != 7 + i / 4 * 3);
foo (&b, &i, &i, 3);
}
if (c || b != 7 + 16 * 3)
__builtin_abort ();
b = 7;
#pragma omp simd collapse (2) linear(b:2) reduction(+:c)
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++)
{
c = c + (b != 7 + 2 * j + 2 * 8 * i);
foo (&b, &i, &j, 2);
}
if (c || b != 7 + 64 * 2)
__builtin_abort ();
b = 7;
#pragma omp parallel for simd schedule (static, 4) linear(b:2) reduction(+:c)
for (int i = 0; i < 64; i++)
{
c = c + (b != 7 + 2 * i);
foo (&b, &i, &i, 2);
}
if (c || b != 7 + 64 * 2)
__builtin_abort ();
b = 7;
#pragma omp parallel for simd schedule (static, 4) linear(b:3) reduction(+:c)
for (int i = 0; i < 64; i += 4)
{
c = c + (b != 7 + i / 4 * 3);
foo (&b, &i, &i, 3);
}
if (c || b != 7 + 16 * 3)
__builtin_abort ();
b = 7;
#pragma omp parallel for simd collapse (2) schedule (static, 4) linear(b:2) reduction(+:c)
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++)
{
c = c + (b != 7 + 2 * j + 2 * 8 * i);
foo (&b, &i, &j, 2);
}
if (c || b != 7 + 64 * 2)
__builtin_abort ();
return 0;
}