This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [openmp] Fix openmp 5.0 builtin function types
- From: Tom de Vries <tdevries at suse dot de>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Wed, 12 Dec 2018 11:22:22 +0100
- Subject: Re: [openmp] Fix openmp 5.0 builtin function types
- References: <20181108172450.GP11625@tucnak> <7637b38b-4107-08f3-9037-9a34a92b8e69@suse.de> <20181212092759.GE12380@tucnak>
On 12-12-18 10:27, Jakub Jelinek wrote:
> On Wed, Dec 12, 2018 at 09:25:06AM +0100, Tom de Vries wrote:
>> [openmp] Fix openmp 5.0 builtin function types
>>
>> Fix some openmp 5.0 builtin functions to match the type used in the
>> implementation of those functions.
>>
>> This fixes some libgomp testsuite failures for x86_64 with nvptx accelerator.
>>
>> Build on x86_64 with nvptx accelerator, tested libgomp.
>>
>> 2018-12-12 Tom de Vries <tdevries@suse.de>
>>
>> * omp-builtins.def
>> (BUILT_IN_GOMP_LOOP_MAYBE_NONMONOTONIC_RUNTIME_START)
>> (BUILT_IN_GOMP_LOOP_ULL_MAYBE_NONMONOTONIC_RUNTIME_START)
>> (BUILT_IN_GOMP_PARALLEL_LOOP_MAYBE_NONMONOTONIC_RUNTIME): Fix
>> function type.
>
> Good catch, but it looks insufficient, the builtins without _maybe have the
> same bug (copy and paste from the preceding dynamic/guided calls that do
> have that extra argument - chunk_size), so if you've caught only these,
> it seems we have insufficient testsuite covergate in the target regions.
>
> Does the following testcase show also the remaining three bugs on unpatched
> nvptx offloading
It does, I get "Call has wrong number of parameters" errors for these 3
mismatches:
...
.extern .func (.param .u32 %value_out)
GOMP_loop_nonmonotonic_runtime_start (.param .u64 %in_ar0, .param .u64
%in_ar1, .param .u64 %in_ar2, .param .u64 %in_ar3, .param .u64 %in_ar4,
.param .u64 %in_ar5);
call
(%value_in),GOMP_loop_nonmonotonic_runtime_start,(%out_arg1,%out_arg2,%out_arg3,%out_arg4,%out_arg5);
.extern .func (.param .u32 %value_out)
GOMP_loop_ull_nonmonotonic_runtime_start (.param .u32 %in_ar0, .param
.u64 %in_ar1, .param .u64 %in_ar2, .param .u64 %in_ar3, .param .u64
%in_ar4, .param .u64 %in_ar5, .param .u64 %in_ar6);
call
(%value_in),GOMP_loop_ull_nonmonotonic_runtime_start,(%out_arg1,%out_arg2,%out_arg3,%out_arg4,%out_arg5,%out_arg6);
.extern .func GOMP_parallel_loop_nonmonotonic_runtime (.param .u64
%in_ar0, .param .u64 %in_ar1, .param .u32 %in_ar2, .param .u64 %in_ar3,
.param .u64 %in_ar4, .param .u64 %in_ar5, .param .u64 %in_ar6, .param
.u32 %in_ar7);
call
GOMP_parallel_loop_nonmonotonic_runtime,(%out_arg1,%out_arg2,%out_arg3,%out_arg4,%out_arg5,%out_arg6,%out_arg7);
...
and after rebuilding the test passes.
> (sorry, don't have nvptx offloading set up right now,
> should fix that soon)?
>
Np.
Thanks,
- Tom
> 2018-12-12 Tom de Vries <tdevries@suse.de>
> Jakub Jelinek <jakub@redhat.com>
>
> * omp-builtins.def (BUILT_IN_GOMP_LOOP_NONMONOTONIC_RUNTIME_START,
> BUILT_IN_GOMP_LOOP_MAYBE_NONMONOTONIC_RUNTIME_START,
> BUILT_IN_GOMP_LOOP_ULL_NONMONOTONIC_RUNTIME_START,
> BUILT_IN_GOMP_LOOP_ULL_MAYBE_NONMONOTONIC_RUNTIME_START,
> BUILT_IN_GOMP_PARALLEL_LOOP_NONMONOTONIC_RUNTIME,
> BUILT_IN_GOMP_PARALLEL_LOOP_MAYBE_NONMONOTONIC_RUNTIME): Fix up
> function types - remove one argument.
>
> * testsuite/libgomp.c-c++-common/for-16.c: New test.
>
> --- gcc/omp-builtins.def.jj 2018-11-08 18:07:56.345070635 +0100
> +++ gcc/omp-builtins.def 2018-12-12 10:03:14.355354282 +0100
> @@ -126,11 +126,11 @@ DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_NON
> ATTR_NOTHROW_LEAF_LIST)
> DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_NONMONOTONIC_RUNTIME_START,
> "GOMP_loop_nonmonotonic_runtime_start",
> - BT_FN_BOOL_LONG_LONG_LONG_LONG_LONGPTR_LONGPTR,
> + BT_FN_BOOL_LONG_LONG_LONG_LONGPTR_LONGPTR,
> ATTR_NOTHROW_LEAF_LIST)
> DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_MAYBE_NONMONOTONIC_RUNTIME_START,
> "GOMP_loop_maybe_nonmonotonic_runtime_start",
> - BT_FN_BOOL_LONG_LONG_LONG_LONG_LONGPTR_LONGPTR,
> + BT_FN_BOOL_LONG_LONG_LONG_LONGPTR_LONGPTR,
> ATTR_NOTHROW_LEAF_LIST)
> DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ORDERED_STATIC_START,
> "GOMP_loop_ordered_static_start",
> @@ -234,11 +234,11 @@ DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ULL
> ATTR_NOTHROW_LEAF_LIST)
> DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ULL_NONMONOTONIC_RUNTIME_START,
> "GOMP_loop_ull_nonmonotonic_runtime_start",
> - BT_FN_BOOL_BOOL_ULL_ULL_ULL_ULL_ULLPTR_ULLPTR,
> + BT_FN_BOOL_BOOL_ULL_ULL_ULL_ULLPTR_ULLPTR,
> ATTR_NOTHROW_LEAF_LIST)
> DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ULL_MAYBE_NONMONOTONIC_RUNTIME_START,
> "GOMP_loop_ull_maybe_nonmonotonic_runtime_start",
> - BT_FN_BOOL_BOOL_ULL_ULL_ULL_ULL_ULLPTR_ULLPTR,
> + BT_FN_BOOL_BOOL_ULL_ULL_ULL_ULLPTR_ULLPTR,
> ATTR_NOTHROW_LEAF_LIST)
> DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ULL_ORDERED_STATIC_START,
> "GOMP_loop_ull_ordered_static_start",
> @@ -349,11 +349,11 @@ DEF_GOMP_BUILTIN (BUILT_IN_GOMP_PARALLEL
> ATTR_NOTHROW_LIST)
> DEF_GOMP_BUILTIN (BUILT_IN_GOMP_PARALLEL_LOOP_NONMONOTONIC_RUNTIME,
> "GOMP_parallel_loop_nonmonotonic_runtime",
> - BT_FN_VOID_OMPFN_PTR_UINT_LONG_LONG_LONG_LONG_UINT,
> + BT_FN_VOID_OMPFN_PTR_UINT_LONG_LONG_LONG_UINT,
> ATTR_NOTHROW_LIST)
> DEF_GOMP_BUILTIN (BUILT_IN_GOMP_PARALLEL_LOOP_MAYBE_NONMONOTONIC_RUNTIME,
> "GOMP_parallel_loop_maybe_nonmonotonic_runtime",
> - BT_FN_VOID_OMPFN_PTR_UINT_LONG_LONG_LONG_LONG_UINT,
> + BT_FN_VOID_OMPFN_PTR_UINT_LONG_LONG_LONG_UINT,
> ATTR_NOTHROW_LIST)
> DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_END, "GOMP_loop_end",
> BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST)
> --- libgomp/testsuite/libgomp.c-c++-common/for-16.c.jj 2018-12-12 10:19:50.640074341 +0100
> +++ libgomp/testsuite/libgomp.c-c++-common/for-16.c 2018-12-12 10:19:22.100540708 +0100
> @@ -0,0 +1,114 @@
> +extern
> +#ifdef __cplusplus
> +"C"
> +#endif
> +void abort (void);
> +
> +unsigned long long int k = 16;
> +#pragma omp declare target to (k)
> +
> +int
> +main ()
> +{
> + unsigned char a[144], b[144], c[144];
> + int l;
> + #pragma omp target map(from:a, b, c)
> + {
> + int i;
> + unsigned long long int j;
> + #pragma omp parallel for schedule (runtime)
> + for (i = 0; i < 16; i++)
> + a[i] = i;
> + #pragma omp parallel for schedule (monotonic: runtime)
> + for (i = 0; i < 16; i++)
> + a[i + 16] = i + 16;
> + #pragma omp parallel for schedule (nonmonotonic: runtime)
> + for (i = 0; i < 16; i++)
> + a[i + 32] = i + 32;
> + #pragma omp parallel
> + {
> + #pragma omp for schedule (runtime)
> + for (i = 0; i < 16; i++)
> + a[i + 48] = i + 48;
> + #pragma omp for schedule (monotonic: runtime)
> + for (i = 0; i < 16; i++)
> + a[i + 64] = i + 64;
> + #pragma omp for schedule (nonmonotonic: runtime)
> + for (i = 0; i < 16; i++)
> + a[i + 80] = i + 80;
> + #pragma omp for schedule (runtime)
> + for (j = 0; j < k; j++)
> + a[j + 96] = j + 96;
> + #pragma omp for schedule (monotonic: runtime)
> + for (j = 0; j < k; j++)
> + a[j + 112] = j + 112;
> + #pragma omp for schedule (nonmonotonic: runtime)
> + for (j = 0; j < k; j++)
> + a[j + 128] = j + 128;
> + }
> + #pragma omp parallel for schedule (dynamic)
> + for (i = 0; i < 16; i++)
> + b[i] = i;
> + #pragma omp parallel for schedule (monotonic: dynamic)
> + for (i = 0; i < 16; i++)
> + b[i + 16] = i + 16;
> + #pragma omp parallel for schedule (nonmonotonic: dynamic)
> + for (i = 0; i < 16; i++)
> + b[i + 32] = i + 32;
> + #pragma omp parallel
> + {
> + #pragma omp for schedule (dynamic)
> + for (i = 0; i < 16; i++)
> + b[i + 48] = i + 48;
> + #pragma omp for schedule (monotonic: dynamic)
> + for (i = 0; i < 16; i++)
> + b[i + 64] = i + 64;
> + #pragma omp for schedule (nonmonotonic: dynamic)
> + for (i = 0; i < 16; i++)
> + b[i + 80] = i + 80;
> + #pragma omp for schedule (dynamic)
> + for (j = 0; j < k; j++)
> + b[j + 96] = j + 96;
> + #pragma omp for schedule (monotonic: dynamic)
> + for (j = 0; j < k; j++)
> + b[j + 112] = j + 112;
> + #pragma omp for schedule (nonmonotonic: dynamic)
> + for (j = 0; j < k; j++)
> + b[j + 128] = j + 128;
> + }
> + #pragma omp parallel for schedule (guided)
> + for (i = 0; i < 16; i++)
> + c[i] = i;
> + #pragma omp parallel for schedule (monotonic: guided)
> + for (i = 0; i < 16; i++)
> + c[i + 16] = i + 16;
> + #pragma omp parallel for schedule (nonmonotonic: guided)
> + for (i = 0; i < 16; i++)
> + c[i + 32] = i + 32;
> + #pragma omp parallel
> + {
> + #pragma omp for schedule (guided)
> + for (i = 0; i < 16; i++)
> + c[i + 48] = i + 48;
> + #pragma omp for schedule (monotonic: guided)
> + for (i = 0; i < 16; i++)
> + c[i + 64] = i + 64;
> + #pragma omp for schedule (nonmonotonic: guided)
> + for (i = 0; i < 16; i++)
> + c[i + 80] = i + 80;
> + #pragma omp for schedule (guided)
> + for (j = 0; j < k; j++)
> + c[j + 96] = j + 96;
> + #pragma omp for schedule (monotonic: guided)
> + for (j = 0; j < k; j++)
> + c[j + 112] = j + 112;
> + #pragma omp for schedule (nonmonotonic: guided)
> + for (j = 0; j < k; j++)
> + c[j + 128] = j + 128;
> + }
> + }
> + for (l = 0; l < 144; ++l)
> + if (a[l] != l || b[l] != l || c[l] != l)
> + abort ();
> + return 0;
> +}
>
>
> Jakub
>