Hi! On 2026-07-09T10:20:25+0200, Paul-Antoine Arras <[email protected]> wrote: > [...] attached patch.
Thanks, pushed in commit f167db1fa47db24fdb93e9ef75c2786245702e09 "openmp: Pass iteration count to static worksharing builtins for OMPT". Grüße Thomas > From 661d35806b90a24fbcf52ba870cc715afcaf1de8 Mon Sep 17 00:00:00 2001 > From: Paul-Antoine Arras <[email protected]> > Date: Wed, 1 Jul 2026 18:51:07 +0200 > Subject: [PATCH v4 2/2] openmp: Pass iteration count to static worksharing > builtins for OMPT > > Add parameter to GOMP_{loop,distribute}_static_worksharing{,_start} carrying > the > total number of loop iterations. niter is unused for now, pending OMPT > implementation. > > The call in omp-expand.cc is moved after the iteration count computation > so that the iteration count is available to pass as the argument. > > gcc/ChangeLog: > > * builtin-types.def (BT_FN_COMPLEX_INT): Remove. > (BT_FN_COMPLEX_INT_ULONGLONG): New. > * omp-builtins.def (BUILT_IN_GOMP_LOOP_STATIC_WORKSHARING): Use > BT_FN_COMPLEX_INT_ULONGLONG. > (BUILT_IN_GOMP_LOOP_STATIC_WORKSHARING_START): Likewise. > (BUILT_IN_GOMP_DISTRIBUTE_STATIC_WORKSHARING): Likewise. > (BUILT_IN_GOMP_DISTRIBUTE_STATIC_WORKSHARING_START): Likewise. > * omp-expand.cc (expand_omp_for_static_nochunk): Move worksharing > builtin call after iteration count computation; pass n as niter. > (expand_omp_for_static_chunk): Likewise. > > gcc/fortran/ChangeLog: > > * types.def (BT_FN_COMPLEX_INT): Remove. > (BT_FN_COMPLEX_INT_ULONGLONG): New. > > libgomp/ChangeLog: > > * config/gcn/teams.c (GOMP_distribute_static_worksharing): Add > long niter parameter (unused). > (GOMP_distribute_static_worksharing_start): Likewise. > * config/nvptx/teams.c (GOMP_distribute_static_worksharing): > Likewise. > (GOMP_distribute_static_worksharing_start): Likewise. > * libgomp.texi: Update function signatures; fix real/imaginary > description; document niter parameter. > * libgomp_g.h (GOMP_loop_static_worksharing): Update prototype. > (GOMP_distribute_static_worksharing): Likewise. > * loop.c (GOMP_loop_static_worksharing): Add long niter parameter > (unused). > (GOMP_loop_static_worksharing_start): Likewise. > * teams.c (GOMP_distribute_static_worksharing): Likewise. > (GOMP_distribute_static_worksharing_start): Likewise. > * testsuite/libgomp.c-c++-common/for-static-1.c: Update scan > pattern to match niter argument. > * testsuite/libgomp.c-c++-common/for-static-2.c: Likewise. > * testsuite/libgomp.c-c++-common/for-static-3.c: Likewise. > > gcc/testsuite/ChangeLog: > > * c-c++-common/gomp/for-static-1.c: Update scan pattern to match > niter argument. > * c-c++-common/gomp/for-static-2.c: Likewise. > * c-c++-common/gomp/for-static-3.c: Likewise. > > Co-authored-by: Thomas Schwinge <[email protected]> > --- > gcc/builtin-types.def | 2 +- > gcc/fortran/types.def | 2 +- > gcc/omp-builtins.def | 13 +- > gcc/omp-expand.cc | 150 +++++++++--------- > .../c-c++-common/gomp/for-static-1.c | 7 +- > .../c-c++-common/gomp/for-static-2.c | 12 +- > .../c-c++-common/gomp/for-static-3.c | 18 ++- > libgomp/config/gcn/teams.c | 9 +- > libgomp/config/nvptx/teams.c | 9 +- > libgomp/libgomp.texi | 9 +- > libgomp/libgomp_g.h | 8 +- > libgomp/loop.c | 9 +- > libgomp/teams.c | 9 +- > .../libgomp.c-c++-common/for-static-1.c | 2 +- > .../libgomp.c-c++-common/for-static-2.c | 4 +- > .../libgomp.c-c++-common/for-static-3.c | 6 +- > 16 files changed, 153 insertions(+), 116 deletions(-) > > diff --git a/gcc/builtin-types.def b/gcc/builtin-types.def > index 55ed6f0cae1..d11e6e736a2 100644 > --- a/gcc/builtin-types.def > +++ b/gcc/builtin-types.def > @@ -236,7 +236,6 @@ DEF_FUNCTION_TYPE_0 (BT_FN_CONST_STRING, BT_CONST_STRING) > DEF_FUNCTION_TYPE_0 (BT_FN_PID, BT_PID) > DEF_FUNCTION_TYPE_0 (BT_FN_INT, BT_INT) > DEF_FUNCTION_TYPE_0 (BT_FN_UINT, BT_UINT) > -DEF_FUNCTION_TYPE_0 (BT_FN_COMPLEX_INT, BT_COMPLEX_INT) > DEF_FUNCTION_TYPE_0 (BT_FN_ULONG, BT_ULONG) > DEF_FUNCTION_TYPE_0 (BT_FN_ULONGLONG, BT_ULONGLONG) > DEF_FUNCTION_TYPE_0 (BT_FN_FLOAT, BT_FLOAT) > @@ -429,6 +428,7 @@ DEF_FUNCTION_TYPE_1 (BT_FN_UINT16_UINT32, BT_UINT16, > BT_UINT32) > DEF_FUNCTION_TYPE_1 (BT_FN_UINT32_UINT16, BT_UINT32, BT_UINT16) > DEF_FUNCTION_TYPE_1 (BT_FN_INT_FENV_T_PTR, BT_INT, BT_FENV_T_PTR) > DEF_FUNCTION_TYPE_1 (BT_FN_INT_CONST_FENV_T_PTR, BT_INT, BT_CONST_FENV_T_PTR) > +DEF_FUNCTION_TYPE_1 (BT_FN_COMPLEX_INT_ULONGLONG, BT_COMPLEX_INT, > BT_ULONGLONG) > > DEF_POINTER_TYPE (BT_PTR_FN_VOID_PTR, BT_FN_VOID_PTR) > > diff --git a/gcc/fortran/types.def b/gcc/fortran/types.def > index 6f98e3e48ff..b694e689360 100644 > --- a/gcc/fortran/types.def > +++ b/gcc/fortran/types.def > @@ -77,7 +77,6 @@ DEF_POINTER_TYPE (BT_PTR_PTR, BT_PTR) > DEF_FUNCTION_TYPE_0 (BT_FN_BOOL, BT_BOOL) > DEF_FUNCTION_TYPE_0 (BT_FN_PTR, BT_PTR) > DEF_FUNCTION_TYPE_0 (BT_FN_INT, BT_INT) > -DEF_FUNCTION_TYPE_0 (BT_FN_COMPLEX_INT, BT_COMPLEX_INT) > DEF_FUNCTION_TYPE_0 (BT_FN_UINT, BT_UINT) > DEF_FUNCTION_TYPE_0 (BT_FN_VOID, BT_VOID) > DEF_FUNCTION_TYPE_0 (BT_FN_ULONGLONG, BT_ULONGLONG) > @@ -91,6 +90,7 @@ DEF_FUNCTION_TYPE_1 (BT_FN_PTR_PTR, BT_PTR, BT_PTR) > DEF_FUNCTION_TYPE_1 (BT_FN_VOID_INT, BT_VOID, BT_INT) > DEF_FUNCTION_TYPE_1 (BT_FN_VOID_BOOL, BT_VOID, BT_BOOL) > DEF_FUNCTION_TYPE_1 (BT_FN_BOOL_INT, BT_BOOL, BT_INT) > +DEF_FUNCTION_TYPE_1 (BT_FN_COMPLEX_INT_ULONGLONG, BT_COMPLEX_INT, > BT_ULONGLONG) > > DEF_POINTER_TYPE (BT_PTR_FN_VOID_PTR, BT_FN_VOID_PTR) > > diff --git a/gcc/omp-builtins.def b/gcc/omp-builtins.def > index 465aeebefdb..3b0d5572043 100644 > --- a/gcc/omp-builtins.def > +++ b/gcc/omp-builtins.def > @@ -510,11 +510,14 @@ DEF_GOMP_BUILTIN (BUILT_IN_GOMP_HAS_MASKED_THREAD_NUM, > ATTR_CONST_NOTHROW_LEAF_LIST) > DEF_GOMP_BUILTIN (BUILT_IN_GOMP_MASKED_END, "GOMP_masked_end", BT_FN_VOID, > ATTR_NOTHROW_LEAF_LIST) > +/* TODO review these function attributes once OMPT implementation done */ > DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_STATIC_WORKSHARING, > - "GOMP_loop_static_worksharing", BT_FN_COMPLEX_INT, > + "GOMP_loop_static_worksharing", > + BT_FN_COMPLEX_INT_ULONGLONG, > ATTR_CONST_NOTHROW_LEAF_LIST) > DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_STATIC_WORKSHARING_START, > - "GOMP_loop_static_worksharing_start", BT_FN_COMPLEX_INT, > + "GOMP_loop_static_worksharing_start", > + BT_FN_COMPLEX_INT_ULONGLONG, > ATTR_CONST_NOTHROW_LEAF_LIST) > DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_STATIC_WORKSHARING_END, > "GOMP_loop_static_worksharing_end", BT_FN_VOID, > @@ -523,10 +526,12 @@ DEF_GOMP_BUILTIN > (BUILT_IN_GOMP_LOOP_STATIC_WORKSHARING_DISPATCH, > "GOMP_loop_static_worksharing_dispatch", BT_FN_VOID, > ATTR_NOTHROW_LEAF_LIST) > DEF_GOMP_BUILTIN (BUILT_IN_GOMP_DISTRIBUTE_STATIC_WORKSHARING, > - "GOMP_distribute_static_worksharing", BT_FN_COMPLEX_INT, > + "GOMP_distribute_static_worksharing", > + BT_FN_COMPLEX_INT_ULONGLONG, > ATTR_CONST_NOTHROW_LEAF_LIST) > DEF_GOMP_BUILTIN (BUILT_IN_GOMP_DISTRIBUTE_STATIC_WORKSHARING_START, > - "GOMP_distribute_static_worksharing_start", BT_FN_COMPLEX_INT, > + "GOMP_distribute_static_worksharing_start", > + BT_FN_COMPLEX_INT_ULONGLONG, > ATTR_CONST_NOTHROW_LEAF_LIST) > DEF_GOMP_BUILTIN (BUILT_IN_GOMP_DISTRIBUTE_STATIC_WORKSHARING_END, > "GOMP_distribute_static_worksharing_end", BT_FN_VOID, > diff --git a/gcc/omp-expand.cc b/gcc/omp-expand.cc > index ad380b27d06..388f84eddff 100644 > --- a/gcc/omp-expand.cc > +++ b/gcc/omp-expand.cc > @@ -5190,42 +5190,6 @@ expand_omp_for_static_nochunk (struct omp_region > *region, > release_ssa_name (gimple_assign_lhs (g)); > } > } > - /* Fetch the thread/team id and the number of threads/teams in a single > - call to GOMP_loop_static_worksharing or > GOMP_distribute_static_worksharing. > - The helper returns both values packed into one complex int, with > - the id as the imaginary part and the count as the real part. Returning > - (rather than writing through pointers) keeps both values as plain SSA > - names, which lets later passes - notably IPA-CP propagating constants > - into the outlined kernel - reason about them. */ > - tree decl; > - switch (gimple_omp_for_kind (fd->for_stmt)) > - { > - case GF_OMP_FOR_KIND_FOR: > - decl = builtin_decl_explicit ( > - flag_openmp_ompt ? BUILT_IN_GOMP_LOOP_STATIC_WORKSHARING_START > - : BUILT_IN_GOMP_LOOP_STATIC_WORKSHARING); > - break; > - case GF_OMP_FOR_KIND_DISTRIBUTE: > - decl = builtin_decl_explicit ( > - flag_openmp_ompt ? BUILT_IN_GOMP_DISTRIBUTE_STATIC_WORKSHARING_START > - : BUILT_IN_GOMP_DISTRIBUTE_STATIC_WORKSHARING); > - break; > - default: > - gcc_unreachable (); > - } > - { > - tree packed = build_call_expr (decl, 0); > - packed = force_gimple_operand_gsi (&gsi, packed, true, NULL_TREE, > - true, GSI_SAME_STMT); > - threadid = fold_build1 (IMAGPART_EXPR, integer_type_node, packed); > - threadid = fold_convert (itype, threadid); > - threadid = force_gimple_operand_gsi (&gsi, threadid, true, NULL_TREE, > - true, GSI_SAME_STMT); > - nthreads = fold_build1 (REALPART_EXPR, integer_type_node, packed); > - nthreads = fold_convert (itype, nthreads); > - nthreads = force_gimple_operand_gsi (&gsi, nthreads, true, NULL_TREE, > - true, GSI_SAME_STMT); > - } > > n1 = fd->loop.n1; > n2 = fd->loop.n2; > @@ -5261,6 +5225,45 @@ expand_omp_for_static_nochunk (struct omp_region > *region, > t = fold_convert (itype, t); > n = force_gimple_operand_gsi (&gsi, t, true, NULL_TREE, true, > GSI_SAME_STMT); > > + { > + /* Fetch the thread/team id and the number of threads/teams in a single > + call to GOMP_loop_static_worksharing or > + GOMP_distribute_static_worksharing. The helper returns both values > packed > + into one complex int, with the id as the imaginary part and the count > as > + the real part. Returning (rather than writing through pointers) keeps > + both values as plain SSA names, which lets later passes - notably > IPA-CP > + propagating constants into the outlined kernel - reason about them. > + Also pass the total number of iterations for OMPT. */ > + tree decl; > + switch (gimple_omp_for_kind (fd->for_stmt)) > + { > + case GF_OMP_FOR_KIND_FOR: > + decl = builtin_decl_explicit ( > + flag_openmp_ompt ? BUILT_IN_GOMP_LOOP_STATIC_WORKSHARING_START > + : BUILT_IN_GOMP_LOOP_STATIC_WORKSHARING); > + break; > + case GF_OMP_FOR_KIND_DISTRIBUTE: > + decl = builtin_decl_explicit ( > + flag_openmp_ompt ? BUILT_IN_GOMP_DISTRIBUTE_STATIC_WORKSHARING_START > + : BUILT_IN_GOMP_DISTRIBUTE_STATIC_WORKSHARING); > + break; > + default: > + gcc_unreachable (); > + } > + tree n_ull = fold_convert (long_long_unsigned_type_node, n); > + tree packed = build_call_expr (decl, 1, n_ull); > + packed = force_gimple_operand_gsi (&gsi, packed, true, NULL_TREE, > + true, GSI_SAME_STMT); > + threadid = fold_build1 (IMAGPART_EXPR, integer_type_node, packed); > + threadid = fold_convert (itype, threadid); > + threadid = force_gimple_operand_gsi (&gsi, threadid, true, NULL_TREE, > + true, GSI_SAME_STMT); > + nthreads = fold_build1 (REALPART_EXPR, integer_type_node, packed); > + nthreads = fold_convert (itype, nthreads); > + nthreads = force_gimple_operand_gsi (&gsi, nthreads, true, NULL_TREE, > + true, GSI_SAME_STMT); > + } > + > q = create_tmp_reg (itype, "q"); > t = fold_build2 (TRUNC_DIV_EXPR, itype, n, nthreads); > t = force_gimple_operand_gsi (&gsi, t, false, NULL_TREE, true, > GSI_SAME_STMT); > @@ -6008,42 +6011,6 @@ expand_omp_for_static_chunk (struct omp_region *region, > release_ssa_name (gimple_assign_lhs (g)); > } > } > - /* Fetch the thread/team id and the number of threads/teams in a single > - call to GOMP_loop_static_worksharing or > GOMP_distribute_static_worksharing. > - The helper returns both values packed into one complex int, with > - the id as the imaginary part and the count as the real part. Returning > - (rather than writing through pointers) keeps both values as plain SSA > - names, which lets later passes - notably IPA-CP propagating constants > - into the outlined kernel - reason about them. */ > - tree decl; > - switch (gimple_omp_for_kind (fd->for_stmt)) > - { > - case GF_OMP_FOR_KIND_FOR: > - decl = builtin_decl_explicit ( > - flag_openmp_ompt ? BUILT_IN_GOMP_LOOP_STATIC_WORKSHARING_START > - : BUILT_IN_GOMP_LOOP_STATIC_WORKSHARING); > - break; > - case GF_OMP_FOR_KIND_DISTRIBUTE: > - decl = builtin_decl_explicit ( > - flag_openmp_ompt ? BUILT_IN_GOMP_DISTRIBUTE_STATIC_WORKSHARING_START > - : BUILT_IN_GOMP_DISTRIBUTE_STATIC_WORKSHARING); > - break; > - default: > - gcc_unreachable (); > - } > - { > - tree packed = build_call_expr (decl, 0); > - packed = force_gimple_operand_gsi (&gsi, packed, true, NULL_TREE, > - true, GSI_SAME_STMT); > - threadid = fold_build1 (IMAGPART_EXPR, integer_type_node, packed); > - threadid = fold_convert (itype, threadid); > - threadid = force_gimple_operand_gsi (&gsi, threadid, true, NULL_TREE, > - true, GSI_SAME_STMT); > - nthreads = fold_build1 (REALPART_EXPR, integer_type_node, packed); > - nthreads = fold_convert (itype, nthreads); > - nthreads = force_gimple_operand_gsi (&gsi, nthreads, true, NULL_TREE, > - true, GSI_SAME_STMT); > - } > > n1 = fd->loop.n1; > n2 = fd->loop.n2; > @@ -6086,6 +6053,45 @@ expand_omp_for_static_chunk (struct omp_region *region, > n = force_gimple_operand_gsi (&gsi, t, true, NULL_TREE, > true, GSI_SAME_STMT); > > + { > + /* Fetch the thread/team id and the number of threads/teams in a single > + call to GOMP_loop_static_worksharing or > + GOMP_distribute_static_worksharing. The helper returns both values > packed > + into one complex int, with the id as the imaginary part and the count > as > + the real part. Returning (rather than writing through pointers) keeps > + both values as plain SSA names, which lets later passes - notably > IPA-CP > + propagating constants into the outlined kernel - reason about them. > + Also pass the total number of iterations for OMPT. */ > + tree decl; > + switch (gimple_omp_for_kind (fd->for_stmt)) > + { > + case GF_OMP_FOR_KIND_FOR: > + decl = builtin_decl_explicit ( > + flag_openmp_ompt ? BUILT_IN_GOMP_LOOP_STATIC_WORKSHARING_START > + : BUILT_IN_GOMP_LOOP_STATIC_WORKSHARING); > + break; > + case GF_OMP_FOR_KIND_DISTRIBUTE: > + decl = builtin_decl_explicit ( > + flag_openmp_ompt ? BUILT_IN_GOMP_DISTRIBUTE_STATIC_WORKSHARING_START > + : BUILT_IN_GOMP_DISTRIBUTE_STATIC_WORKSHARING); > + break; > + default: > + gcc_unreachable (); > + } > + tree n_ull = fold_convert (long_long_unsigned_type_node, n); > + tree packed = build_call_expr (decl, 1, n_ull); > + packed = force_gimple_operand_gsi (&gsi, packed, true, NULL_TREE, true, > + GSI_SAME_STMT); > + threadid = fold_build1 (IMAGPART_EXPR, integer_type_node, packed); > + threadid = fold_convert (itype, threadid); > + threadid = force_gimple_operand_gsi (&gsi, threadid, true, NULL_TREE, > true, > + GSI_SAME_STMT); > + nthreads = fold_build1 (REALPART_EXPR, integer_type_node, packed); > + nthreads = fold_convert (itype, nthreads); > + nthreads = force_gimple_operand_gsi (&gsi, nthreads, true, NULL_TREE, > true, > + GSI_SAME_STMT); > + } > + > trip_var = create_tmp_reg (itype, ".trip"); > if (gimple_in_ssa_p (cfun)) > { > diff --git a/gcc/testsuite/c-c++-common/gomp/for-static-1.c > b/gcc/testsuite/c-c++-common/gomp/for-static-1.c > index 50d4e176f3d..09e533c931d 100644 > --- a/gcc/testsuite/c-c++-common/gomp/for-static-1.c > +++ b/gcc/testsuite/c-c++-common/gomp/for-static-1.c > @@ -9,8 +9,11 @@ > > #include "for-static.h" > > -/* { dg-final { scan-tree-dump-times "GOMP_loop_static_worksharing \\(" 2 > "ompexp" } } */ > -/* { dg-final { scan-tree-dump-times "GOMP_distribute_static_worksharing > \\(" 2 "ompexp" } } */ > +/* { dg-final { scan-tree-dump-times "GOMP_loop_static_worksharing > \\(\[^\\)\]" 2 "ompexp" } } */ > +/* { dg-final { scan-tree-dump-not "GOMP_loop_static_worksharing_start" > "ompexp" } } */ > +/* { dg-final { scan-tree-dump-not "GOMP_loop_static_worksharing_dispatch" > "ompexp" } } */ > +/* { dg-final { scan-tree-dump-not "GOMP_loop_static_worksharing_end" > "ompexp" } } */ > +/* { dg-final { scan-tree-dump-times "GOMP_distribute_static_worksharing > \\(\[^\\)\]" 2 "ompexp" } } */ > /* { dg-final { scan-tree-dump-not "omp_get_num_threads" "ompexp" } } */ > /* { dg-final { scan-tree-dump-not "omp_get_thread_num" "ompexp" } } */ > /* { dg-final { scan-tree-dump-not "omp_get_num_teams" "ompexp" } } */ > diff --git a/gcc/testsuite/c-c++-common/gomp/for-static-2.c > b/gcc/testsuite/c-c++-common/gomp/for-static-2.c > index c3d25b97bed..d99f59d7471 100644 > --- a/gcc/testsuite/c-c++-common/gomp/for-static-2.c > +++ b/gcc/testsuite/c-c++-common/gomp/for-static-2.c > @@ -5,11 +5,15 @@ > > #include "for-static.h" > > -/* { dg-final { scan-tree-dump-times "GOMP_loop_static_worksharing_start > \\(" 2 "ompexp" } } */ > -/* { dg-final { scan-tree-dump-times "GOMP_loop_static_worksharing_end \\(" > 2 "ompexp" } } */ > -/* { dg-final { scan-tree-dump-times > "GOMP_distribute_static_worksharing_start \\(" 2 "ompexp" } } */ > -/* { dg-final { scan-tree-dump-times "GOMP_distribute_static_worksharing_end > \\(" 2 "ompexp" } } */ > /* { dg-final { scan-tree-dump-not "GOMP_loop_static_worksharing \\(" > "ompexp" } } */ > +/* { dg-final { scan-tree-dump-times "GOMP_loop_static_worksharing_start > \\(\[^\\)\]" 2 "ompexp" } } */ > /* { dg-final { scan-tree-dump-not "GOMP_loop_static_worksharing_dispatch" > "ompexp" } } */ > +/* { dg-final { scan-tree-dump-times "GOMP_loop_static_worksharing_end > \\(\\)" 2 "ompexp" } } */ > /* { dg-final { scan-tree-dump-not "GOMP_distribute_static_worksharing \\(" > "ompexp" } } */ > +/* { dg-final { scan-tree-dump-times > "GOMP_distribute_static_worksharing_start \\(\[^\\)\]" 2 "ompexp" } } */ > /* { dg-final { scan-tree-dump-not > "GOMP_distribute_static_worksharing_dispatch" "ompexp" } } */ > +/* { dg-final { scan-tree-dump-times "GOMP_distribute_static_worksharing_end > \\(\\)" 2 "ompexp" } } */ > +/* { dg-final { scan-tree-dump-not "omp_get_num_threads" "ompexp" } } */ > +/* { dg-final { scan-tree-dump-not "omp_get_thread_num" "ompexp" } } */ > +/* { dg-final { scan-tree-dump-not "omp_get_num_teams" "ompexp" } } */ > +/* { dg-final { scan-tree-dump-not "omp_get_team_num" "ompexp" } } */ > diff --git a/gcc/testsuite/c-c++-common/gomp/for-static-3.c > b/gcc/testsuite/c-c++-common/gomp/for-static-3.c > index 6fd1da6c407..8e45223c353 100644 > --- a/gcc/testsuite/c-c++-common/gomp/for-static-3.c > +++ b/gcc/testsuite/c-c++-common/gomp/for-static-3.c > @@ -6,9 +6,15 @@ > > #include "for-static.h" > > -/* { dg-final { scan-tree-dump-times "GOMP_loop_static_worksharing_start > \\(" 2 "ompexp" } } */ > -/* { dg-final { scan-tree-dump-times "GOMP_loop_static_worksharing_dispatch > \\(" 2 "ompexp" } } */ > -/* { dg-final { scan-tree-dump-times "GOMP_loop_static_worksharing_end \\(" > 2 "ompexp" } } */ > -/* { dg-final { scan-tree-dump-times > "GOMP_distribute_static_worksharing_start \\(" 2 "ompexp" } } */ > -/* { dg-final { scan-tree-dump-times > "GOMP_distribute_static_worksharing_dispatch \\(" 2 "ompexp" } } */ > -/* { dg-final { scan-tree-dump-times "GOMP_distribute_static_worksharing_end > \\(" 2 "ompexp" } } */ > +/* { dg-final { scan-tree-dump-not "GOMP_loop_static_worksharing \\(" > "ompexp" } } */ > +/* { dg-final { scan-tree-dump-times "GOMP_loop_static_worksharing_start > \\(\[^\\)\]" 2 "ompexp" } } */ > +/* { dg-final { scan-tree-dump-times "GOMP_loop_static_worksharing_dispatch > \\(\\)" 2 "ompexp" } } */ > +/* { dg-final { scan-tree-dump-times "GOMP_loop_static_worksharing_end > \\(\\)" 2 "ompexp" } } */ > +/* { dg-final { scan-tree-dump-not "GOMP_distribute_static_worksharing \\(" > "ompexp" } } */ > +/* { dg-final { scan-tree-dump-times > "GOMP_distribute_static_worksharing_start \\(\[^\\)\]" 2 "ompexp" } } */ > +/* { dg-final { scan-tree-dump-times > "GOMP_distribute_static_worksharing_dispatch \\(\\)" 2 "ompexp" } } */ > +/* { dg-final { scan-tree-dump-times "GOMP_distribute_static_worksharing_end > \\(\\)" 2 "ompexp" } } */ > +/* { dg-final { scan-tree-dump-not "omp_get_num_threads" "ompexp" } } */ > +/* { dg-final { scan-tree-dump-not "omp_get_thread_num" "ompexp" } } */ > +/* { dg-final { scan-tree-dump-not "omp_get_num_teams" "ompexp" } } */ > +/* { dg-final { scan-tree-dump-not "omp_get_team_num" "ompexp" } } */ > diff --git a/libgomp/config/gcn/teams.c b/libgomp/config/gcn/teams.c > index 99f807ac876..4354131f9b7 100644 > --- a/libgomp/config/gcn/teams.c > +++ b/libgomp/config/gcn/teams.c > @@ -39,10 +39,12 @@ GOMP_teams_reg (void (*fn) (void *), void *data, unsigned > int num_teams, > } > > /* For a distribute construct with static schedule, return the team ID and > - number of teams packed into a single complexvalue. */ > + number of teams packed into a single complex value. NITER is the total > + number of iterations. */ > > _Complex int > -GOMP_distribute_static_worksharing (void) > +GOMP_distribute_static_worksharing (unsigned long long niter > + __attribute__ ((unused))) > { > int __lds *gomp_team_num = (int __lds *) GOMP_TEAM_NUM; > unsigned tid = *gomp_team_num; > @@ -53,7 +55,8 @@ GOMP_distribute_static_worksharing (void) > /* OMPT variant enabled by -fopenmp-ompt. */ > > _Complex int > -GOMP_distribute_static_worksharing_start (void) > +GOMP_distribute_static_worksharing_start (unsigned long long niter > + __attribute__ ((unused))) > { > int __lds *gomp_team_num = (int __lds *) GOMP_TEAM_NUM; > unsigned tid = *gomp_team_num; > diff --git a/libgomp/config/nvptx/teams.c b/libgomp/config/nvptx/teams.c > index 3e6ea287276..e04f8bbbdb1 100644 > --- a/libgomp/config/nvptx/teams.c > +++ b/libgomp/config/nvptx/teams.c > @@ -42,10 +42,12 @@ GOMP_teams_reg (void (*fn) (void *), void *data, unsigned > int num_teams, > } > > /* For a distribute construct with static schedule, return the team ID and > - number of teams packed into a single complexvalue. */ > + number of teams packed into a single complex value. NITER is the total > + number of iterations. */ > > _Complex int > -GOMP_distribute_static_worksharing (void) > +GOMP_distribute_static_worksharing (unsigned long long niter > + __attribute__ ((unused))) > { > unsigned tid = __gomp_team_num; > unsigned nteams = gomp_num_teams_var + 1; > @@ -55,7 +57,8 @@ GOMP_distribute_static_worksharing (void) > /* OMPT variant enabled by -fopenmp-ompt. */ > > _Complex int > -GOMP_distribute_static_worksharing_start (void) > +GOMP_distribute_static_worksharing_start (unsigned long long niter > + __attribute__ ((unused))) > { > unsigned tid = __gomp_team_num; > unsigned nteams = gomp_num_teams_var + 1; > diff --git a/libgomp/libgomp.texi b/libgomp/libgomp.texi > index 83b90e6dc53..5d29da0984d 100644 > --- a/libgomp/libgomp.texi > +++ b/libgomp/libgomp.texi > @@ -8318,17 +8318,18 @@ but since its supposed to remain unchanged, we can > also not if we like. > For @code{schedule(static)} without @code{ordered}, the compiler uses: > > @smallexample > - _Complex int GOMP_loop_static_worksharing (void) > + _Complex int GOMP_loop_static_worksharing (unsigned long long) > @end smallexample > > -which returns the thread id in the real part and the thread count in the > imaginary > -part as a single value, avoiding separate @code{omp_get_thread_num} / > +which returns the thread id in the imaginary part and the thread count in the > +real part as a single value, avoiding separate @code{omp_get_thread_num} / > @code{omp_get_num_threads} calls that OMPT cannot distinguish from user > queries. > +For OMPT, the total number of loop iterations is passed as argument. > > Similarly, for @code{distribute} constructs: > > @smallexample > - _Complex int GOMP_distribute_static_worksharing (void) > + _Complex int GOMP_distribute_static_worksharing (unsigned long long) > @end smallexample > > returns the team id and team count. > diff --git a/libgomp/libgomp_g.h b/libgomp/libgomp_g.h > index 4a3565684cc..27d0db8c93b 100644 > --- a/libgomp/libgomp_g.h > +++ b/libgomp/libgomp_g.h > @@ -144,8 +144,8 @@ extern void GOMP_loop_end (void); > extern void GOMP_loop_end_nowait (void); > extern bool GOMP_loop_end_cancel (void); > > -extern __complex__ int GOMP_loop_static_worksharing (void); > -extern __complex__ int GOMP_loop_static_worksharing_start (void); > +extern _Complex int GOMP_loop_static_worksharing (unsigned long long); > +extern _Complex int GOMP_loop_static_worksharing_start (unsigned long long); > extern void GOMP_loop_static_worksharing_dispatch (void); > extern void GOMP_loop_static_worksharing_end (void); > > @@ -386,8 +386,8 @@ extern void *GOMP_target_map_indirect_ptr (void *); > > extern void GOMP_teams_reg (void (*) (void *), void *, unsigned, unsigned, > unsigned); > -extern __complex__ int GOMP_distribute_static_worksharing (void); > -extern __complex__ int GOMP_distribute_static_worksharing_start (void); > +extern _Complex int GOMP_distribute_static_worksharing (unsigned long long); > +extern _Complex int GOMP_distribute_static_worksharing_start (unsigned long > long); > extern void GOMP_distribute_static_worksharing_dispatch (void); > extern void GOMP_distribute_static_worksharing_end (void); > > diff --git a/libgomp/loop.c b/libgomp/loop.c > index f286ce6b6db..f4d96266774 100644 > --- a/libgomp/loop.c > +++ b/libgomp/loop.c > @@ -1188,10 +1188,12 @@ GOMP_loop_ordered_guided_next (long *istart, long > *iend) > #endif > > /* For a worksharing-loop construct with static schedule, return the thread > ID > - and number of threads packed into a single complex value. */ > + and number of threads packed into a single complex value. NITER is the > total > + number of iterations. */ > > _Complex int > -GOMP_loop_static_worksharing (void) > +GOMP_loop_static_worksharing (unsigned long long niter > + __attribute__ ((unused))) > { > struct gomp_team *team = gomp_thread ()->ts.team; > unsigned tid = gomp_thread ()->ts.team_id; > @@ -1202,7 +1204,8 @@ GOMP_loop_static_worksharing (void) > /* OMPT variant enabled by -fopenmp-ompt. */ > > _Complex int > -GOMP_loop_static_worksharing_start (void) > +GOMP_loop_static_worksharing_start (unsigned long long niter > + __attribute__ ((unused))) > { > struct gomp_team *team = gomp_thread ()->ts.team; > unsigned tid = gomp_thread ()->ts.team_id; > diff --git a/libgomp/teams.c b/libgomp/teams.c > index f501123d647..71c40ef5b46 100644 > --- a/libgomp/teams.c > +++ b/libgomp/teams.c > @@ -59,10 +59,12 @@ GOMP_teams_reg (void (*fn) (void *), void *data, unsigned > int num_teams, > } > > /* For a distribute construct with static schedule, return the team ID and > - number of teams packed into a single complex value. */ > + number of teams packed into a single complex value. NITER is the total > + number of iterations. */ > > _Complex int > -GOMP_distribute_static_worksharing (void) > +GOMP_distribute_static_worksharing (unsigned long long > + niter __attribute__ ((unused))) > { > struct gomp_thread *thr = gomp_thread (); > unsigned tid = thr->team_num; > @@ -73,7 +75,8 @@ GOMP_distribute_static_worksharing (void) > /* OMPT variant enabled by -fopenmp-ompt. */ > > _Complex int > -GOMP_distribute_static_worksharing_start (void) > +GOMP_distribute_static_worksharing_start (unsigned long long > + niter __attribute__ ((unused))) > { > struct gomp_thread *thr = gomp_thread (); > unsigned tid = thr->team_num; > diff --git a/libgomp/testsuite/libgomp.c-c++-common/for-static-1.c > b/libgomp/testsuite/libgomp.c-c++-common/for-static-1.c > index b304c8c10ec..2eb63e3d1ad 100644 > --- a/libgomp/testsuite/libgomp.c-c++-common/for-static-1.c > +++ b/libgomp/testsuite/libgomp.c-c++-common/for-static-1.c > @@ -8,6 +8,6 @@ > > #include "for-static.h" > > -/* { dg-final { scan-offload-tree-dump-times > "GOMP_distribute_static_worksharing \\(" 2 "optimized" } } */ > +/* { dg-final { scan-offload-tree-dump-times > "GOMP_distribute_static_worksharing \\(\[^\\)\]" 2 "optimized" } } */ > /* { dg-final { scan-offload-tree-dump-not "omp_get_num_teams" "optimized" } > } */ > /* { dg-final { scan-offload-tree-dump-not "omp_get_team_num" "optimized" } > } */ > diff --git a/libgomp/testsuite/libgomp.c-c++-common/for-static-2.c > b/libgomp/testsuite/libgomp.c-c++-common/for-static-2.c > index 83e577a3298..ff756a38489 100644 > --- a/libgomp/testsuite/libgomp.c-c++-common/for-static-2.c > +++ b/libgomp/testsuite/libgomp.c-c++-common/for-static-2.c > @@ -5,7 +5,7 @@ > > #include "for-static.h" > > -/* { dg-final { scan-offload-tree-dump-times > "GOMP_distribute_static_worksharing_start \\(" 2 "optimized" } } */ > -/* { dg-final { scan-offload-tree-dump-times > "GOMP_distribute_static_worksharing_end \\(" 2 "optimized" } } */ > +/* { dg-final { scan-offload-tree-dump-times > "GOMP_distribute_static_worksharing_start \\(\[^\\)\]" 2 "optimized" } } */ > +/* { dg-final { scan-offload-tree-dump-times > "GOMP_distribute_static_worksharing_end \\(\\)" 2 "optimized" } } */ > /* { dg-final { scan-offload-tree-dump-not > "GOMP_distribute_static_worksharing \\(" "optimized" } } */ > /* { dg-final { scan-offload-tree-dump-not > "GOMP_distribute_static_worksharing_dispatch" "optimized" } } */ > diff --git a/libgomp/testsuite/libgomp.c-c++-common/for-static-3.c > b/libgomp/testsuite/libgomp.c-c++-common/for-static-3.c > index e7b904eedc3..d783b2c7c6b 100644 > --- a/libgomp/testsuite/libgomp.c-c++-common/for-static-3.c > +++ b/libgomp/testsuite/libgomp.c-c++-common/for-static-3.c > @@ -6,6 +6,6 @@ > > #include "for-static.h" > > -/* { dg-final { scan-offload-tree-dump-times > "GOMP_distribute_static_worksharing_start \\(" 2 "optimized" } } */ > -/* { dg-final { scan-offload-tree-dump-times > "GOMP_distribute_static_worksharing_dispatch \\(" 2 "optimized" } } */ > -/* { dg-final { scan-offload-tree-dump-times > "GOMP_distribute_static_worksharing_end \\(" 2 "optimized" } } */ > +/* { dg-final { scan-offload-tree-dump-times > "GOMP_distribute_static_worksharing_start \\(\[^\\)\]" 2 "optimized" } } */ > +/* { dg-final { scan-offload-tree-dump-times > "GOMP_distribute_static_worksharing_dispatch \\(\\)" 2 "optimized" } } */ > +/* { dg-final { scan-offload-tree-dump-times > "GOMP_distribute_static_worksharing_end \\(\\)" 2 "optimized" } } */ > -- > 2.53.0
