Paul-Antoine Arras wrote:
When the inscan modifier is present on a for construct, a call to GOMP_loop_end
(or one of its variants) is already emitted. The extra call to one of the
*_worksharing_end functions, enabled by -fopenmp-ompt, is therefore redundant.
Looking at the code and the dump, I was confused - and I know now why :-)
With -fopenmp-ompt, the code was (before this patch):
D.3286 = __builtin_GOMP_loop_static_worksharing_start (100);
...
__builtin_GOMP_loop_end_nowait ();
__builtin_GOMP_loop_static_worksharing_end ();
The 'GOMP_loop_static_worksharing_start' dispatches the ompt_work_loop_static
callback with ompt_scope_begin
And both 'GOMP_loop_end_nowait' and 'GOMP_loop_static_worksharing_end'
dispatch: 'ompt_work_loop_static' with ompt_scope_end.
[Side remark: the nowait function knows the schedule type, i.e. it
might also dispatch other callbacks; but for static both are identical.]
Thus, the patch now removes the call to the latter.
This now LGTM.
However, without -fopenmp-ompt, the code looks as follows:
D.3282 = __builtin_GOMP_loop_static_worksharing (100);
__builtin_GOMP_loop_end_nowait ();
Both invoke the ompt_work_loop_static callback - the latter, see
above, with ompt_scope_end.
However, the former with ompt_scope_beginend. - That's inconsistent!
If there is an 'end', there needs to be a 'begin' not a 'beginend'!
Hence: If there is latere a call to GOMP_loop_end_nowait, the first
call must be to GOMP_loop_static_worksharing_start.
* * *
gcc/ChangeLog:
* omp-expand.cc (expand_omp_for_static_nochunk): Do not emit
*_static_worksharing_end call with inscan modifier.
Spurious '*' at the front of the second line.
* * *
--- a/gcc/omp-expand.cc
+++ b/gcc/omp-expand.cc
@@ -5610,7 +5610,10 @@ expand_omp_for_static_nochunk (struct omp_region *region,
}
gsi = gsi_last_nondebug_bb (exit_bb);
- if (flag_openmp_ompt)
+ if (flag_openmp_ompt
+ && !(fd->have_reductemp
+ || ((fd->have_pointer_condtemp || fd->have_scantemp)
+ && !fd->have_nonctrl_scantemp)))
{
/* Insert call to GOMP_*_static_worksharing_end at the end of exit_bb.
*/
@@ -6367,7 +6370,7 @@ expand_omp_for_static_chunk (struct omp_region *region,
}
gsi = gsi_last_nondebug_bb (exit_bb);
- if (flag_openmp_ompt)
+ if (flag_openmp_ompt && !(fd->have_reductemp || fd->have_pointer_condtemp))
{
/* Insert call to GOMP_*_static_worksharing_end at the end of exit_bb.
*/
In both functions:
* If there will be a GOMP_loop_end_nowait call, the *static*_start call has
to be called. [Also without -fopenmp-ompt], otherwise only with
-fopenmp-ompt.
Any maybe also add a comment that - as the call to GOMP_loop_end_nowait implies
the end of the scope, '_start' has to be used and '_end' can be skipped.
Maybe, it looks cleaner with some common boolean to handle the check both for
the
adding of _start and (with a !boolean) for (not) adding the _end call?
* * *
In libgomp/loop.c, can you add a comment to the non-"_start" function
that the "_start" one is called if there is a "_end_nowait" call - and note
at the "_start" function that no _end" is expected if there is an _end_nowait"
call? – Or something like that?
Thanks,
Tobias