openacc: Remove unnecessary barriers (gimple worker partitioning/broadcast)
authorJulian Brown <julian@codesourcery.com>
Mon, 29 Jun 2020 20:17:30 +0000 (13:17 -0700)
committerThomas Schwinge <thomas@codesourcery.com>
Fri, 17 Sep 2021 19:04:30 +0000 (21:04 +0200)
commit2961ac45b9e19523958757e607d11c5893d6368b
treeb5c070c46b04dc1db6c0b7ffa6cf5de74d3b9701
parent2a3f9f6532bb21d8ab6f16fbe9ee603f6b1405f2
openacc: Remove unnecessary barriers (gimple worker partitioning/broadcast)

This is an optimisation for middle-end worker-partitioning support (used
to support multiple workers on AMD GCN).  At present, barriers may be
emitted in cases where they aren't needed and cannot be optimised away.
This patch stops the extraneous barriers from being emitted in the
first place.

One exception to the above (where the barrier is still needed) is for
predicated blocks of code that perform a write to gang-private shared
memory from one worker.  We must execute a barrier before other workers
read that shared memory location.

gcc/
* config/gcn/gcn.c (gimple.h): Include.
(gcn_fork_join): Emit barrier for worker-level joins.
* omp-oacc-neuter-broadcast.cc (find_local_vars_to_propagate): Add
writes_gang_private bitmap parameter. Set bit for blocks
containing gang-private variable writes.
(worker_single_simple): Don't emit barrier after predicated block.
(worker_single_copy): Don't emit barrier if we're not broadcasting
anything and the block contains no gang-private writes.
(neuter_worker_single): Don't predicate blocks that only contain
NOPs or internal marker functions.  Pass has_gang_private_write
argument to worker_single_copy.
(oacc_do_neutering): Add writes_gang_private bitmap handling.
gcc/config/gcn/gcn.c
gcc/omp-oacc-neuter-broadcast.cc