277 Commits

Author SHA1 Message Date
Matt Arsenault
25a461046e OpenMP: Regenerate test checks 2023-02-16 22:40:15 -04:00
Johannes Doerfert
578d507359 [OpenMP][FIX] Ensure to determine aligned regions properly
There were missing checks in the aligned region code, copy-paste errors
(= usage of the IsReachedFromAlignedBarrierOnly value instead of
IsReachingAlignedBarrierOnly value on the forward pass), and a missing
update of the call state for sync declarations and definitions.

Partially fixes https://github.com/llvm/llvm-project/issues/60425
2023-02-02 02:28:10 -08:00
Joseph Huber
0bdde9dfb9 [OpenMP] Make OpenMPOpt aware of the OpenMP runtime's status
The `OpenMPOpt` pass contains optimizations that generate new calls into
the OpenMP runtime. This causes problems if we are in a state where the
runtime has already been linked statically. Generating these new calls
will result in them never being resolved. We should indicate if we are
in a "post-link" LTO phase and prevent OpenMPOpt from generating new
runtime calls.

Generally, it's not desireable for passes to maintain state about the
context in which they're called. But this is the only reasonable
solution to static linking when we have a pass that generates new
runtime calls.

Reviewed By: jdoerfert

Differential Revision: https://reviews.llvm.org/D142646
2023-01-26 13:23:44 -06:00
Johannes Doerfert
5238df7ed5 [Attributor] Allow (inter-procedural) "CFG" reasoning for aligned regions
If an instruction is executed in an aligned region we can ignore
threading effects and use CFG reasoning (dominance and reachability).
This is true because all threads are together in an aligned region and
there cannot be one waiting for a signal at a place not connected via
the control flow.

More dedicated tests will follow.

More details can be found here:
"Co-Designing an OpenMP GPU Runtime and Optimizations for Near-Zero
Overhead Execution", IPDPS 2022,
https://www.osti.gov/servlets/purl/1890094
2023-01-23 22:45:48 -08:00
Johannes Doerfert
fedbc689e1 [Attributor] Check assumptions to improve isAlignedBarrier queries 2023-01-23 20:34:26 -08:00
Johannes Doerfert
129faec711 [OpenMP] Identify non-aligned barriers executed in an aligned context
Even if a barrier does not enforce aligned execution, it will
effectively be like an aligned barrier if it is executed by all threads
in an aligned way. We lack control flow divergence analysis here so we
can only do (basic block) local reasoning for now.
2023-01-22 21:42:07 -08:00
Johannes Doerfert
43c1c59f73 [OpenMP] Merge barrier elimination into AAExecutionDomain
With this patch we track aligned barriers in AAExecutionDomain and also
delete unnecessary barriers there. This allows us to eliminate barriers
across blocks, across functions, and in the presence of complex accesses
that do not force a barrier. Further, we can use the collected
information to enable store-load forwarding in a threaded environment
(follow up patch).

Differential Revision: https://reviews.llvm.org/D140463
2023-01-22 16:34:59 -08:00
Johannes Doerfert
2275e325e4 [OpenMP] Guarding restrictions are required only for guarding
If we do not guard code during SPMDzation, we do not need to check
conditions for successfull guarding. That is, even if some code is
executed in different modes, it does not prevent SPMDzation if there is
no guarded code in there.
2023-01-22 15:53:42 -08:00
Johannes Doerfert
ea3c24932a [OpenMP][FIX] Properly update ParallelLevels tracker 2023-01-22 15:52:45 -08:00
Johannes Doerfert
7bc88cbe5c [OpenMP] Simplify llvm.assume operands in device code 2023-01-22 01:27:41 -08:00
Shilei Tian
bdf30603f2 [LLVM][OpenMP] Correct the function signature of __kmpc_parallel_level
`__kmpc_parallel_level` used to be a function w/o any argument, but in the new
device runtime, it accepts two. This patch simply corrects it in `OMPKinds.def`.
```
uint16_t __kmpc_parallel_level(IdentTy *Loc, uint32_t);
```

Reviewed By: jhuber6

Differential Revision: https://reviews.llvm.org/D141655
2023-01-20 09:46:45 -05:00
Jonas Paulsson
dc3875e468 Add parameter extension attributes in various instrumentation passes.
For the targets that have in their ABI the requirement that arguments and
return values are extended to the full register bitwidth, it is important
that calls when built also take care of this detail.

The OMPIRBuilder, AddressSanitizer, GCOVProfiling, MemorySanitizer and
ThreadSanitizer passes are with this patch hopefully now doing this properly.

Reviewed By: Eli Friedman, Ulrich Weigand, Johannes Doerfert

Differential Revision: https://reviews.llvm.org/D133949
2023-01-18 18:29:12 -06:00
Johannes Doerfert
27944bbbe7 [Attributor][FIX] Avoid deleting (internal) library functions
In CGSCC mode we cannot delete internal library functions, esp.
__kmpc_alloc_shared, or we trigger an assertion. While the assertion is
probably too narrow, we avoid deleting those unused functions for now to
unblock the AMDGPU buildbot.
2023-01-12 01:17:23 -08:00
Johannes Doerfert
cefa5cefdc [OpenMP] Replace ExternalizationRAII with virtual uses
The externalization was always a stopgap solution. One of the drawbacks
is that it is very conservative no matter if we actually require the
functions at the end of the pass. The new concept is more generic and
properly integrates into the dependence graph. Whenever we might need a
function, it has a "virtual use" that cannot be analyzed. If we do not
because of some AA state, there will be a dependence to ensure state
changes trigger revisits of uses, including a potentially new virtual
use.
2023-01-12 00:14:06 -08:00
Johannes Doerfert
96c335e2cc [Attributor] Always ensure the correct AAIsDead object is used
Since the Attributor::isAssumedDead lookups can jump between functions
we need to potentially replace a given FnLivenessAA for it to be useful.
2023-01-11 23:49:09 -08:00
Johannes Doerfert
91f06dd732 [OpenMP][NFC] Include global alias test 2023-01-11 22:24:22 -08:00
Johannes Doerfert
cddcbfae14 [OpenMP][FIX] Avoid performance regression accidentally introduced 2023-01-11 00:58:34 -08:00
Johannes Doerfert
b2a8d2c69b [OpenMP] Avoid running openmp-opt on dead functions
The Attributor has logic to run only on assumed live functions and this
is exposed to users now. OpenMP-opt will (mostly) ignore dead internal
functions now but run the same deduction as before if an internal
function is marked live.

This should lower compile time as we run on less code and delete more
code early on. For the full OpenMC module compiled with noinline and
JITed at runtime, we save ~25%, or ~10s on my machine during JITing.
2023-01-10 15:03:51 -08:00
Johannes Doerfert
d1033e3cad [OpenMP] Disable ICV deduction by default.
This is not tested well and needs to be revisited in the future.
2023-01-10 15:03:51 -08:00
Johannes Doerfert
22c898dbfd [OpenMP] Use Attributor to find underlying objects of stores
When we see a store in generic mode we need to decide if we should guard
it for SPMDzation. This patch changes the getUnderlyingObjects call to
the more optimistic getAssumedUnderlyingObjects call to identify more
thread local pointers.
2023-01-09 23:34:52 -08:00
Johannes Doerfert
56be9123ca [Attributor][OpenMP][NFC] Cleanup tests via update script 2023-01-09 16:40:20 -08:00
Rafael A Herrera Guaitero
13b909ef27 OpenMPOpt: Check nested parallelism in target region
Analysis that determines if a parallel region can reach another parallel region in any target region of the TU.
A new global var is emitted with the name of the kernel + "_nested_parallelism", which is either 0 or 1 depending on the result.

Reviewed By: jdoerfert

Differential Revision: https://reviews.llvm.org/D141010
2023-01-09 15:55:30 -06:00
Nikita Popov
ae1cf4577c [OpenMP] Convert some tests to opaque pointers (NFC) 2023-01-04 17:03:10 +01:00
Matt Arsenault
2e7640e6dc OpenMPOpt: Fix null dereference on missing declaration cache
Found by llvm-reduce fuzzing.
2023-01-03 16:26:37 -05:00
Matt Arsenault
c3054aeb5a OpenMPOpt: Fix using wrong address space for alloca
Using the function's address space makes no sense. Copied from the
existing test, with more addrspace variation. Could just replace the
existing one with this version if it's redundant.
2023-01-03 16:26:37 -05:00
Matt Arsenault
a87de3a6dc OpenMPOpt: Fix introducing empty nvvm.annotations into module 2023-01-03 10:32:10 -05:00
Nikita Popov
aa8e9fac2a [OpenMP] Convert some tests to opaque pointers (NFC) 2023-01-03 15:03:14 +01:00
Joseph Huber
bb4c6e7a06 [OpenMP] Remove folding logic for removed runtime function
This function was removed from the device runtime at some point but we
still have specialized code for it and an entry in the runtime kinds.
Remove it as it is no longer necessary.

Reviewed By: tianshilei1992

Differential Revision: https://reviews.llvm.org/D140402
2022-12-20 13:37:38 -06:00
Johannes Doerfert
4e0f464ce2 Reapply "[OpenMP][FIX] Restrict more unsound assmptions about threading"
This reverts commit 3b052558125cbedf18c2ddb65780b50d6f437d54.

This patch got reverted due to an unrelated memory leak that has been
fixed.
2022-12-19 18:27:52 -08:00
Johannes Doerfert
d4f3d8212a [OpenMP][FIX] Ensure to inline ompx:: functions after the rename in D140334 2022-12-19 16:41:49 -08:00
Mitch Phillips
3b05255812 Revert "[OpenMP][FIX] Restrict more unsound assmptions about threading"
This reverts commit 07c375348083170e39c9498a42a9679c7e08f07f.

Reason: This change is dependent on a commit that needs to be rolled
back because it broke the ASan buildbot. See
https://reviews.llvm.org/rGfc21f2d7bae2e0be630470cc7ca9323ed5859892 for
more information.
2022-12-16 17:56:38 -08:00
Johannes Doerfert
07c3753480 [OpenMP][FIX] Restrict more unsound assmptions about threading
Even if all loads and stores are in `nosync` functions we cannot
guarantee there is no synchronization going on between them. As such, we
cannot use CFG reasoning. We could check the entire module, or, what
happens now to minimize test churn, is to check if all accesses are in
the same function that is `nosync`. A follow up will undo some of the
regressions where possible.

Similarly, reachability cannot be used to exclude an access if the
access is not known to be executed by the same thread as the given
instruction.

The OpenMP-opt test was added for the latter problem.
2022-12-13 22:58:33 -08:00
Johannes Doerfert
23333bb6b7 [NFC] Rerun update test checks on Attributor and OpenMP-Opt tests 2022-12-13 18:44:19 -08:00
Johannes Doerfert
90609fb68f [OpenMP][NFCI] Remove effectively dead code in clang and the runtime
Differential Revision: https://reviews.llvm.org/D136903
2022-12-13 18:44:19 -08:00
Johannes Doerfert
f9c29878b0 Revert "[OpenMP][NFCI] Remove effectively dead code in clang and the runtime"
This reverts commit c1c8cbbf5f29257d084a23a2f6c4236c40b7afb9. One of the
tests seems to be flaky/non-deterministic.
2022-12-12 22:08:28 -08:00
Johannes Doerfert
f622446769 [OpenMP][FIX] Ensure combing accesses does not violate invariants 2022-12-12 20:55:36 -08:00
Johannes Doerfert
c1c8cbbf5f [OpenMP][NFCI] Remove effectively dead code in clang and the runtime 2022-12-12 20:55:36 -08:00
Bjorn Pettersson
3528e63d89 [test] Remove duplicate RUN lines in Transform tests 2022-12-08 11:47:16 +01:00
Johannes Doerfert
2dd158d655 [OpenMP] Make barrier elimination work in the presence of llvm.assume
Assumptions are droppable and eliminating them to eliminate barriers
seems reasonable.
2022-12-07 22:37:57 -08:00
Johannes Doerfert
f6e3a89cc0 [AMDGPU] Annotate the intrinsics to be default and nocallback
Differential Revision: https://reviews.llvm.org/D135155
2022-12-07 14:25:25 -08:00
Matt Arsenault
0a67e771f6 CallGraph: Fix IgnoreAssumeLikeCalls option to Function::hasAddressTaken
This was added in 29e2d9461a91b and likely never worked in a useful
way.

The test added for it fails when converted to opaque pointers, since
the lifetime intrinsic now directly uses the address. The code was
only trying to handle a user indirectly through a bitcast
instruction. That would never have been useful; a bitcast of a global
value would be folded to a ConstantExpr cast.

I also don't understand why it was special casing use_empty on the
cast. Relax the check to be either BitCastOperator or
AddrSpaceCastOperator. In practice, BitCastOperator won't appear
today.

I believe the change in parallel_deletion_cg_update is a correct
improvement but I didn't fully follow it. .omp_outlined..0 is used in
a constant expression cast to a call which ends up getting deleted.
2022-12-05 21:41:59 -05:00
LiaoChunyu
2c2c9688f0 [OpenMP][LegacyPM] Remove OpenMPOptCGSCCLegacyPass
Using the legacy pass manager for the optimization pipeline is deprecated.
I see the new PM is available.

Reviewed By: aeubanks, jdoerfert

Differential Revision: https://reviews.llvm.org/D139004
2022-12-01 09:21:10 +08:00
Nikita Popov
304f1d59ca [IR] Switch everything to use memory attribute
This switches everything to use the memory attribute proposed in
https://discourse.llvm.org/t/rfc-unify-memory-effect-attributes/65579.
The old argmemonly, inaccessiblememonly and inaccessiblemem_or_argmemonly
attributes are dropped. The readnone, readonly and writeonly attributes
are restricted to parameters only.

The old attributes are auto-upgraded both in bitcode and IR.
The bitcode upgrade is a policy requirement that has to be retained
indefinitely. The IR upgrade is mainly there so it's not necessary
to update all tests using memory attributes in this patch, which
is already large enough. We could drop that part after migrating
tests, or retain it longer term, to make it easier to import IR
from older LLVM versions.

High-level Function/CallBase APIs like doesNotAccessMemory() or
setDoesNotAccessMemory() are mapped transparently to the memory
attribute. Code that directly manipulates attributes (e.g. via
AttributeList) on the other hand needs to switch to working with
the memory attribute instead.

Differential Revision: https://reviews.llvm.org/D135780
2022-11-04 10:21:38 +01:00
Johannes Rudolf Doerfert
41a278f56a [OpenMP][FIX] Do not add custom state machine eagerly in LTO runs
If we run LTO optimization we migth end up introducing a custom state machine
and later transforming the region into SPMD. This is a problem. While a follow
up will introduce a check for the SPMD conversion, this already prevents the
eager custom state machine generation. Only if the kernel init function is
defined, rather then declared, we will emit a custom state machine. SPMD-zation
can happen eagerly though. Tests are adjusted via a weak definition. The LTO
test was added to verify this works as expected.

Differential Revision: https://reviews.llvm.org/D136740
2022-10-26 10:40:11 -07:00
Arthur Eubanks
e23aee7175 [test] Update some legacy PM tests 2022-09-30 11:31:02 -07:00
Doru Bercea
c9adeca501 Move allocas converted from __kmpc_alloc_shared to entry block. 2022-09-27 17:16:58 +00:00
Sebastian Peryt
99c9b37d11 [NFC][1/n] Remove -enable-new-pm=0 flags from lit tests
This is the first patch in a series intended for removing flag
-enable-new-pm=0 from lit tests. This is part of a bigger
effort of completely removing legacy code related to legacy
pass manager in favor of currently default new pass manager.

In this patch flag has been removed only from tests where no significant
change has been required because checks has been duplicated for
both PMs.

Reviewed By: fhahn

Differential Revision: https://reviews.llvm.org/D134150
2022-09-19 09:57:37 -07:00
Johannes Doerfert
c922cac868 Revert "[Attributor] AAPointerInfo should allow "harmless" uses"
Revert "[Attributor] Teach AAPointerInfo to look into aggregates"

This reverts commit 844f6c5d03d58e7ac0c6b838e4a7834ac575ab9b and
4ed0a88cd8a77370073feb270d77a9e8b27bd68c as they broke the buildbots
that run openmp/libomptarget/test/offloading/bug49021.cpp.
2022-09-11 21:37:54 -07:00
Johannes Doerfert
844f6c5d03 [Attributor] AAPointerInfo should allow "harmless" uses
If a call base use will not capture a pointer we can approximate the
effects. This is important especially for readnone/only uses.
2022-09-11 20:16:11 -07:00
Johannes Doerfert
4ed0a88cd8 [Attributor] Teach AAPointerInfo to look into aggregates
If we have a constant aggregate, e.g., as an initializer, we usually
failed to extract the proper value/type from it. This patch provides the
size and offset information necessary to extract the right part of the
constant.
2022-09-11 20:16:11 -07:00