| #
29441e4f |
| 29-Jan-2025 |
Nikita Popov <npopov@redhat.com> |
[IR] Convert from nocapture to captures(none) (#123181)
This PR removes the old `nocapture` attribute, replacing it with the new
`captures` attribute introduced in #116990. This change is
intended
[IR] Convert from nocapture to captures(none) (#123181)
This PR removes the old `nocapture` attribute, replacing it with the new
`captures` attribute introduced in #116990. This change is
intended to be essentially NFC, replacing existing uses of `nocapture`
with `captures(none)` without adding any new analysis capabilities.
Making use of non-`none` values is left for a followup.
Some notes:
* `nocapture` will be upgraded to `captures(none)` by the bitcode
reader.
* `nocapture` will also be upgraded by the textual IR reader. This is to
make it easier to use old IR files and somewhat reduce the test churn in
this PR.
* Helper APIs like `doesNotCapture()` will check for `captures(none)`.
* MLIR import will convert `captures(none)` into an `llvm.nocapture`
attribute. The representation in the LLVM IR dialect should be updated
separately.
show more ...
|
|
Revision tags: llvmorg-21-init, llvmorg-19.1.7, llvmorg-19.1.6, llvmorg-19.1.5, llvmorg-19.1.4, llvmorg-19.1.3, llvmorg-19.1.2, llvmorg-19.1.1, llvmorg-19.1.0, llvmorg-19.1.0-rc4, llvmorg-19.1.0-rc3, llvmorg-19.1.0-rc2, llvmorg-19.1.0-rc1, llvmorg-20-init, llvmorg-18.1.8, llvmorg-18.1.7, llvmorg-18.1.6, llvmorg-18.1.5, llvmorg-18.1.4, llvmorg-18.1.3, llvmorg-18.1.2, llvmorg-18.1.1, llvmorg-18.1.0, llvmorg-18.1.0-rc4, llvmorg-18.1.0-rc3, llvmorg-18.1.0-rc2, llvmorg-18.1.0-rc1 |
|
| #
0065d067 |
| 24-Jan-2024 |
Jeremy Morse <jeremy.morse@sony.com> |
[NFC][DebugInfo] Maintain RemoveDIs flag when attributor creates functions (#79143)
We're using this flag (IsNewDbgInfoFormat) to detect the boundaries in
LLVM of what's treating debug-info as intr
[NFC][DebugInfo] Maintain RemoveDIs flag when attributor creates functions (#79143)
We're using this flag (IsNewDbgInfoFormat) to detect the boundaries in
LLVM of what's treating debug-info as intrinsics (i.e. dbg.value), and
what's using DPValue objects (the non-intrinsic replacement). The
attributor tends to create new wrapper functions and doesn't insert them
into Modules in the usual way, thus we have to manually update that flag
to signal what debug-info mode it's using.
I've added some --try-experimental-debuginfo-iterators RUN lines to
tests that would otherwise crash because of this, so that they're
exercised by our new-debuginfo-iterators buildbot.
NB: there's an attributor test with a dbg.value in it, however
attributes re-order themselves in RemoveDIs mode for various reasons, so
we're going to address that in a different patch.
show more ...
|
|
Revision tags: llvmorg-19-init, llvmorg-17.0.6, llvmorg-17.0.5, llvmorg-17.0.4, llvmorg-17.0.3, llvmorg-17.0.2, llvmorg-17.0.1, llvmorg-17.0.0, llvmorg-17.0.0-rc4, llvmorg-17.0.0-rc3, llvmorg-17.0.0-rc2, llvmorg-17.0.0-rc1 |
|
| #
ae6ad317 |
| 25-Jul-2023 |
Johannes Doerfert <johannes@jdoerfert.de> |
[Attributor] Try to remove argmem effects after signature rewrite
If the new signature has only readnone pointers we can remove any argmem effect from the function signature.
|
|
Revision tags: llvmorg-18-init |
|
| #
369930bc |
| 03-Jul-2023 |
Johannes Doerfert <johannes@jdoerfert.de> |
[Attributor] Manifest attributes implied by the IR
If an attribute is implied by the IR we do not (always) create an AA anymore. To keep test coverage, and given the lack of a good heuristic to deci
[Attributor] Manifest attributes implied by the IR
If an attribute is implied by the IR we do not (always) create an AA anymore. To keep test coverage, and given the lack of a good heuristic to decide otherwise, we will now also manifest such attributes.
show more ...
|
| #
badafc53 |
| 20-Jun-2023 |
Johannes Doerfert <johannes@jdoerfert.de> |
[Attributor] Check IR attributes before creating new AAs
Instead of creating an AA for an IR attribute we can first check if it is implied/known. If so, we can save the time to create the AA, figure
[Attributor] Check IR attributes before creating new AAs
Instead of creating an AA for an IR attribute we can first check if it is implied/known. If so, we can save the time to create the AA, figure out it is implied, fix it, and later manifest it in the IR (redundantly). Other IR attributes can be added to the list in `AA::hasAssumedIRAttr` later on, for now we support 8 different ones.
show more ...
|
| #
23dafbb1 |
| 19-Jun-2023 |
Johannes Doerfert <johannes@jdoerfert.de> |
[Attributor] Remove the iteration count verification
It was never really useful to track #iterations, though it helped during the initial development. What we should track, in a follow up, are poten
[Attributor] Remove the iteration count verification
It was never really useful to track #iterations, though it helped during the initial development. What we should track, in a follow up, are potentially #updates. That is also what we should restrict instead of the #iterations.
show more ...
|
|
Revision tags: llvmorg-16.0.6, llvmorg-16.0.5, llvmorg-16.0.4 |
|
| #
dbbe9b37 |
| 15-May-2023 |
Johannes Doerfert <johannes@jdoerfert.de> |
[Attributor] Create `AAMustProgress` for the `mustprogress` attribute
Derive the mustprogress attribute based on the willreturn attribute or the fact that all callers are mustprogress.
Differential
[Attributor] Create `AAMustProgress` for the `mustprogress` attribute
Derive the mustprogress attribute based on the willreturn attribute or the fact that all callers are mustprogress.
Differential Revision: https://reviews.llvm.org/D94740
show more ...
|
|
Revision tags: llvmorg-16.0.3, llvmorg-16.0.2, llvmorg-16.0.1, llvmorg-16.0.0, llvmorg-16.0.0-rc4, llvmorg-16.0.0-rc3, llvmorg-16.0.0-rc2, llvmorg-16.0.0-rc1, llvmorg-17-init, llvmorg-15.0.7 |
|
| #
1b9ba585 |
| 21-Dec-2022 |
Johannes Doerfert <johannes@jdoerfert.de> |
[Attributor] Allow cfg reasoning for thread-local objects
If an object (=memory) is thread-local we do not need to worry about threading effects.
|
| #
4f4787e3 |
| 23-Dec-2022 |
Nikita Popov <npopov@redhat.com> |
[Attributor] Convert some tests to opaque pointers (NFC)
These were converted without adjustments.
|
|
Revision tags: llvmorg-15.0.6, llvmorg-15.0.5 |
|
| #
304f1d59 |
| 02-Nov-2022 |
Nikita Popov <npopov@redhat.com> |
[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 argmemo
[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
show more ...
|
|
Revision tags: llvmorg-15.0.4, llvmorg-15.0.3, working |
|
| #
4040c5c2 |
| 05-Oct-2022 |
Johannes Doerfert <johannes@jdoerfert.de> |
[Attributor][NFC] Re-run update_test_checks on all Attributor tests
|
|
Revision tags: llvmorg-15.0.2 |
|
| #
846709b2 |
| 23-Sep-2022 |
Nikita Popov <npopov@redhat.com> |
[Attribute] Clean up test prefixes (NFC)
Now that the legacy PM is no longer tested, the huge matrix of test prefixes used by attributor tests is no longer needed and very confusing for the casual r
[Attribute] Clean up test prefixes (NFC)
Now that the legacy PM is no longer tested, the huge matrix of test prefixes used by attributor tests is no longer needed and very confusing for the casual reader. Reduce the prefixes down to just CHECK, TUNIT and CGSCC.
show more ...
|
|
Revision tags: llvmorg-15.0.1 |
|
| #
99c9b37d |
| 19-Sep-2022 |
Sebastian Peryt <sebastian.peryt@intel.com> |
[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
[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
show more ...
|
|
Revision tags: llvmorg-15.0.0, llvmorg-15.0.0-rc3, llvmorg-15.0.0-rc2, llvmorg-15.0.0-rc1, llvmorg-16-init, llvmorg-14.0.6, llvmorg-14.0.5, llvmorg-14.0.4 |
|
| #
62f7888d |
| 19-May-2022 |
Johannes Doerfert <johannes@jdoerfert.de> |
[Attributor] Dominating must-write accesses allow unknown initial values
If we have a dominating must-write access we do not need to know the initial value of some object to perform reasoning about
[Attributor] Dominating must-write accesses allow unknown initial values
If we have a dominating must-write access we do not need to know the initial value of some object to perform reasoning about the potential values. The dominating must-write has overwritten the initial value.
show more ...
|
| #
bf789b19 |
| 21-Jun-2022 |
Johannes Doerfert <johannes@jdoerfert.de> |
[Attributor] Replace AAValueSimplify with AAPotentialValues
For the longest time we used `AAValueSimplify` and `genericValueTraversal` to determine "potential values". This was problematic for many
[Attributor] Replace AAValueSimplify with AAPotentialValues
For the longest time we used `AAValueSimplify` and `genericValueTraversal` to determine "potential values". This was problematic for many reasons: - We recomputed the result a lot as there was no caching for the 9 locations calling `genericValueTraversal`. - We added the idea of "intra" vs. "inter" procedural simplification only as an afterthought. `genericValueTraversal` did offer an option but `AAValueSimplify` did not. Thus, we might end up with "too much" simplification in certain situations and then gave up on it. - Because `genericValueTraversal` was not a real `AA` we ended up with problems like the infinite recursion bug (#54981) as well as code duplication.
This patch introduces `AAPotentialValues` and replaces the `AAValueSimplify` uses with it. `genericValueTraversal` is folded into `AAPotentialValues` as are the instruction simplifications performed in `AAValueSimplify` before. We further distinguish "intra" and "inter" procedural simplification now.
`AAValueSimplify` was not deleted as we haven't ported the re-materialization of instructions yet. There are other differences over the former handling, e.g., we may not fold trivially foldable instructions right now, e.g., `add i32 1, 1` is not folded to `i32 2` but if an operand would be simplified to `i32 1` we would fold it still.
We are also even more aware of function/SCC boundaries in CGSCC passes, which is good even if some tests look like they regress.
Fixes: https://github.com/llvm/llvm-project/issues/54981
Note: A previous version was flawed and consequently reverted in 6555558a80589d1c5a1154b92cc3af9495f8f86c.
show more ...
|
| #
f6e0c05e |
| 08-Jul-2022 |
Johannes Doerfert <johannes@jdoerfert.de> |
Revert "[Attributor] Replace AAValueSimplify with AAPotentialValues"
This reverts commit f17639ea0cd30f52ac853ba2eb25518426cc3bb8 as three AMDGPU tests haven't been updated. Will need to verify the
Revert "[Attributor] Replace AAValueSimplify with AAPotentialValues"
This reverts commit f17639ea0cd30f52ac853ba2eb25518426cc3bb8 as three AMDGPU tests haven't been updated. Will need to verify the changes are not regressions we should avoid.
show more ...
|
| #
f17639ea |
| 21-Jun-2022 |
Johannes Doerfert <johannes@jdoerfert.de> |
[Attributor] Replace AAValueSimplify with AAPotentialValues
For the longest time we used `AAValueSimplify` and `genericValueTraversal` to determine "potential values". This was problematic for many
[Attributor] Replace AAValueSimplify with AAPotentialValues
For the longest time we used `AAValueSimplify` and `genericValueTraversal` to determine "potential values". This was problematic for many reasons: - We recomputed the result a lot as there was no caching for the 9 locations calling `genericValueTraversal`. - We added the idea of "intra" vs. "inter" procedural simplification only as an afterthought. `genericValueTraversal` did offer an option but `AAValueSimplify` did not. Thus, we might end up with "too much" simplification in certain situations and then gave up on it. - Because `genericValueTraversal` was not a real `AA` we ended up with problems like the infinite recursion bug (#54981) as well as code duplication.
This patch introduces `AAPotentialValues` and replaces the `AAValueSimplify` uses with it. `genericValueTraversal` is folded into `AAPotentialValues` as are the instruction simplifications performed in `AAValueSimplify` before. We further distinguish "intra" and "inter" procedural simplification now.
`AAValueSimplify` was not deleted as we haven't ported the re-materialization of instructions yet. There are other differences over the former handling, e.g., we may not fold trivially foldable instructions right now, e.g., `add i32 1, 1` is not folded to `i32 2` but if an operand would be simplified to `i32 1` we would fold it still.
We are also even more aware of function/SCC boundaries in CGSCC passes, which is good even if some tests look like they regress.
Fixes: https://github.com/llvm/llvm-project/issues/54981
Note: A previous version was flawed and consequently reverted in 6555558a80589d1c5a1154b92cc3af9495f8f86c.
show more ...
|
| #
6555558a |
| 09-Jun-2022 |
Johannes Doerfert <johannes@jdoerfert.de> |
Revert "[Attributor] Replace AAValueSimplify with AAPotentialValues"
This reverts commit da50dab1ae111e9e6cb0248a47a038b17f798705.
Patch broke AMD GPU OpenMP offload buildbots. https://lab.llvm.org
Revert "[Attributor] Replace AAValueSimplify with AAPotentialValues"
This reverts commit da50dab1ae111e9e6cb0248a47a038b17f798705.
Patch broke AMD GPU OpenMP offload buildbots. https://lab.llvm.org/buildbot/#/builders/193/builds/13246
show more ...
|
| #
da50dab1 |
| 10-May-2022 |
Johannes Doerfert <johannes@jdoerfert.de> |
[Attributor] Replace AAValueSimplify with AAPotentialValues
For the longest time we used `AAValueSimplify` and `genericValueTraversal` to determine "potential values". This was problematic for many
[Attributor] Replace AAValueSimplify with AAPotentialValues
For the longest time we used `AAValueSimplify` and `genericValueTraversal` to determine "potential values". This was problematic for many reasons: - We recomputed the result a lot as there was no caching for the 9 locations calling `genericValueTraversal`. - We added the idea of "intra" vs. "inter" procedural simplification only as an afterthought. `genericValueTraversal` did offer an option but `AAValueSimplify` did not. Thus, we might end up with "too much" simplification in certain situations and then gave up on it. - Because `genericValueTraversal` was not a real `AA` we ended up with problems like the infinite recursion bug (#54981) as well as code duplication.
This patch introduces `AAPotentialValues` and replaces the `AAValueSimplify` uses with it. `genericValueTraversal` is folded into `AAPotentialValues` as are the instruction simplifications performed in `AAValueSimplify` before. We further distinguish "intra" and "inter" procedural simplification now.
`AAValueSimplify` was not deleted as we haven't ported the re-materialization of instructions yet. There are other differences over the former handling, e.g., we may not fold trivially foldable instructions right now, e.g., `add i32 1, 1` is not folded to `i32 2` but if an operand would be simplified to `i32 1` we would fold it still.
We are also even more aware of function/SCC boundaries in CGSCC passes, which is good.
Fixes: https://github.com/llvm/llvm-project/issues/54981
show more ...
|
|
Revision tags: llvmorg-14.0.3, llvmorg-14.0.2 |
|
| #
e87f10a7 |
| 12-Apr-2022 |
Johannes Doerfert <johannes@jdoerfert.de> |
[Attributor] CGSCC pass should not recompute results outside the SCC (reapply)
When we run the CGSCC pass we should only invest time on the SCC. We can initialize AAs with information from the modul
[Attributor] CGSCC pass should not recompute results outside the SCC (reapply)
When we run the CGSCC pass we should only invest time on the SCC. We can initialize AAs with information from the module slice but we should not update those AAs. We make an exception for are call site of the SCC as they are helpful providing information for the SCC.
Minor modifications to pointer privatization allow us to perform it even in the CGSCC pass, similar to ArgumentPromotion.
show more ...
|
| #
39a68cc0 |
| 15-Apr-2022 |
Johannes Doerfert <johannes@jdoerfert.de> |
Revert "[Attributor] CGSCC pass should not recompute results outside the SCC"
This reverts commit 0d7f81e31315f8cda56ce6fde5ff5145e0325c51, it caused the AMDGPU tests that use the Attributor to fail.
|
| #
0d7f81e3 |
| 12-Apr-2022 |
Johannes Doerfert <johannes@jdoerfert.de> |
[Attributor] CGSCC pass should not recompute results outside the SCC
When we run the CGSCC pass we should only invest time on the SCC. We can initialize AAs with information from the module slice bu
[Attributor] CGSCC pass should not recompute results outside the SCC
When we run the CGSCC pass we should only invest time on the SCC. We can initialize AAs with information from the module slice but we should not update those AAs.
show more ...
|
|
Revision tags: llvmorg-14.0.1, llvmorg-14.0.0, llvmorg-14.0.0-rc4, llvmorg-14.0.0-rc3 |
|
| #
f3ad8cf0 |
| 10-Mar-2022 |
Johannes Doerfert <johannes@jdoerfert.de> |
[Attributor] Cleanup manifest and liveness for CGSCC passes
There was some ad-hoc handling of liveness and manifest to avoid breaking CGSCC guarantees. Things always slipped through though. This cle
[Attributor] Cleanup manifest and liveness for CGSCC passes
There was some ad-hoc handling of liveness and manifest to avoid breaking CGSCC guarantees. Things always slipped through though. This cleanup will:
1) Prevent us from manifesting any "information" outside the CGSCC. This might be too conservative but we need to opt-in to annotation not try to avoid some problematic ones. 2) Avoid running any liveness analysis outside the CGSCC. We did have some AAIsDeadFunction handling to this end but we need this for all AAIsDead classes. The reason is that AAIsDead information is only correct if we actually manifest it, since we don't (see point 1) we cannot actually derive/use it at all. We are currently trying to avoid running any AA updates outside the CGSCC but that seems to impact things quite a bit. 3) Assert, don't check, that our modifications (during cleanup) modifies only CGSCC functions.
show more ...
|
|
Revision tags: llvmorg-14.0.0-rc2, llvmorg-14.0.0-rc1 |
|
| #
d1387a26 |
| 08-Feb-2022 |
Johannes Doerfert <johannes@jdoerfert.de> |
[Attributor][FIX] Reachability needs to account for readonly callees
The oversight caused us to ignore call sites that are effectively dead when we computed reachability (or more precise the call ed
[Attributor][FIX] Reachability needs to account for readonly callees
The oversight caused us to ignore call sites that are effectively dead when we computed reachability (or more precise the call edges of a function). The problem is that loads in the readonly callee might depend on stores prior to the callee. If we do not track the call edge we mistakenly assumed the store before the call cannot reach the load. The problem is nicely visible in: `llvm/test/Transforms/Attributor/ArgumentPromotion/basictest.ll`
Caused by D118673.
Fixes https://github.com/llvm/llvm-project/issues/53726
show more ...
|
|
Revision tags: llvmorg-15-init |
|
| #
a265cf22 |
| 31-Jan-2022 |
Johannes Doerfert <johannes@jdoerfert.de> |
[Attributor] Introduce the `AA::isPotentiallyReachable` helper APIs
To make usage easier (compared to the many reachability related AAs), this patch introduces a helper API, `AA::isPotentiallyReacha
[Attributor] Introduce the `AA::isPotentiallyReachable` helper APIs
To make usage easier (compared to the many reachability related AAs), this patch introduces a helper API, `AA::isPotentiallyReachable`, which performs all the necessary steps. It also does the "backwards" reachability (see D106720) as that simplifies the AA a lot (backwards queries were somewhat different from the other query resolvers), and ensures we use cached values in every stage.
To test inter-procedural reachability in a reasonable way this patch includes an extension to `AAPointerInfo::forallInterferingWrites`. Basically, we can exclude writes if they cannot reach a load "during the lifetime" of the allocation. That is, we need to go up the call graph to determine reachability until we can determine the allocation would be dead in the caller. This leads to new constant propagations (through memory) in `value-simplify-pointer-info-gpu.ll`.
Note: The new code contains plenty debug output to determine how reachability queries are resolved.
Parts extracted from D110078.
Differential Revision: https://reviews.llvm.org/D118673
show more ...
|