|
Revision tags: llvmorg-20.1.0, llvmorg-20.1.0-rc3, llvmorg-20.1.0-rc2, llvmorg-20.1.0-rc1, 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, 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, llvmorg-18-init, llvmorg-16.0.6, llvmorg-16.0.5, llvmorg-16.0.4, 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, llvmorg-15.0.6, llvmorg-15.0.5, llvmorg-15.0.4, llvmorg-15.0.3, llvmorg-15.0.2, llvmorg-15.0.1, llvmorg-15.0.0, llvmorg-15.0.0-rc3, llvmorg-15.0.0-rc2, llvmorg-15.0.0-rc1, llvmorg-16-init |
|
| #
46e6dd84 |
| 21-Jul-2022 |
Nikita Popov <[email protected]> |
[MemoryBuiltins] Remove isFreeCall() function (NFC)
Remove isFreeCall() in favor of getFreedOperand(). Replace the two remaining uses with a getFreedOperand() != nullptr check, as they only care tha
[MemoryBuiltins] Remove isFreeCall() function (NFC)
Remove isFreeCall() in favor of getFreedOperand(). Replace the two remaining uses with a getFreedOperand() != nullptr check, as they only care that something is getting freed. (The usage in DSE is correct as such. The allocator-related checks in CFLGraph look rather questionable in general.)
show more ...
|
| #
c81dff3c |
| 21-Jul-2022 |
Nikita Popov <[email protected]> |
[MemoryBuiltins] Add getFreedOperand() function (NFCI)
We currently assume in a number of places that free-like functions free their first argument. This is true for all hardcoded free-like function
[MemoryBuiltins] Add getFreedOperand() function (NFCI)
We currently assume in a number of places that free-like functions free their first argument. This is true for all hardcoded free-like functions, but with the new attribute-based design, the freed argument is supposed to be indicated by the allocptr attribute.
To make sure we handle this correctly once allockind(free) is respected, add a getFreedOperand() helper which returns the freed argument, rather than just indicating whether the call frees *some* argument.
This migrates most but not all users of isFreeCall() to the new API. The remaining users are a bit more tricky.
show more ...
|
|
Revision tags: llvmorg-14.0.6, llvmorg-14.0.5, llvmorg-14.0.4, llvmorg-14.0.3, llvmorg-14.0.2 |
|
| #
13aa2c1c |
| 12-Apr-2022 |
Arthur Eubanks <[email protected]> |
[DSE] Revisit pointers that may no longer escape after removing another store
In dependent-capture, previously we'd see that %tmp4 is captured due to the first store. We'd cache this info in Capture
[DSE] Revisit pointers that may no longer escape after removing another store
In dependent-capture, previously we'd see that %tmp4 is captured due to the first store. We'd cache this info in CapturedBeforeReturn and InvisibleToCallerAfterRet. Then the first store is then removed, causing the cached values to be wrong.
We also need to revisit everything because normally we work backwards when removing stores at the end of the function, but in this case removing an earlier store causes a later store to be removable.
No compile time impact: https://llvm-compile-time-tracker.com/compare.php?from=56796ae1a8db4c85dada28676f8303a5a3609c63&to=21b7e5248ffc423cd36c9d4a020085e363451465&stat=instructions
Reviewed By: asbirlea
Differential Revision: https://reviews.llvm.org/D123686
show more ...
|
| #
871197d0 |
| 08-Jun-2022 |
Nikita Popov <[email protected]> |
[MemoryBuiltins] Accept any value in getInitialValueOfAllocation() (NFC)
Drop the requirement that getInitialValueOfAllocation() must be passed an allocator function, shifting the responsibility for
[MemoryBuiltins] Accept any value in getInitialValueOfAllocation() (NFC)
Drop the requirement that getInitialValueOfAllocation() must be passed an allocator function, shifting the responsibility for checking that into the function (which it does anyway). The motivation is to avoid some calls to isAllocationFn(), which has somewhat ill-defined semantics (given the number of allocator-related attributes we have floating around...)
(For this function, all we eventually need is an allockind of zeroed or uninitialized.)
Differential Revision: https://reviews.llvm.org/D127274
show more ...
|
| #
27e4afce |
| 20-Jun-2022 |
Heejin Ahn <[email protected]> |
[DSE] Don't remove nounwind invokes
For non-mem-intrinsic and non-lifetime `CallBase`s, the current `isRemovable` function only checks if the `CallBase` 1. has no uses 2. will return 3. does not thr
[DSE] Don't remove nounwind invokes
For non-mem-intrinsic and non-lifetime `CallBase`s, the current `isRemovable` function only checks if the `CallBase` 1. has no uses 2. will return 3. does not throw: https://github.com/llvm/llvm-project/blob/80fb7823367c1d105fcbc8f21b69205a0d68c859/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp#L1017
But we should also exclude invokes even in case they don't throw, because they are terminators and thus cannot be removed. While it doesn't seem to make much sense for `invoke`s to have an `nounwind` target, this kind of code can be generated and is also valid bitcode.
Reviewed By: nikic
Differential Revision: https://reviews.llvm.org/D128224
show more ...
|
|
Revision tags: llvmorg-14.0.1 |
|
| #
b22ffc7b |
| 07-Apr-2022 |
Arthur Eubanks <[email protected]> |
[CaptureTracking] Ignore ephemeral values in EarliestEscapeInfo
And thread DSE's ephemeral values to EarliestEscapeInfo.
This allows more precise analysis in DSEState::isReadClobber() via BatchAA.
[CaptureTracking] Ignore ephemeral values in EarliestEscapeInfo
And thread DSE's ephemeral values to EarliestEscapeInfo.
This allows more precise analysis in DSEState::isReadClobber() via BatchAA.
Followup to D123162.
Reviewed By: nikic
Differential Revision: https://reviews.llvm.org/D123342
show more ...
|
| #
17fdaccc |
| 05-Apr-2022 |
Arthur Eubanks <[email protected]> |
[CaptureTracking] Ignore ephemeral values when determining pointer escapeness
Ephemeral values cannot cause a pointer to escape.
No change in compile time: https://llvm-compile-time-tracker.com/com
[CaptureTracking] Ignore ephemeral values when determining pointer escapeness
Ephemeral values cannot cause a pointer to escape.
No change in compile time: https://llvm-compile-time-tracker.com/compare.php?from=4371710085ba1c376a094948b806ddd3b88319de&to=c5ddbcc4866f38026737762ee8d7b9b00395d4f4&stat=instructions
This partially fixes some regressions caused by more calls to `__builtin_assume` (D122397).
Reviewed By: asbirlea
Differential Revision: https://reviews.llvm.org/D123162
show more ...
|
|
Revision tags: llvmorg-14.0.0, llvmorg-14.0.0-rc4, llvmorg-14.0.0-rc3 |
|
| #
f96428e1 |
| 09-Mar-2022 |
Nikita Popov <[email protected]> |
[MemorySSA] Don't optimize uses during construction
This changes MemorySSA to be constructed in unoptimized form. MemorySSA::ensureOptimizedUses() can be called to optimize all uses (once). This sho
[MemorySSA] Don't optimize uses during construction
This changes MemorySSA to be constructed in unoptimized form. MemorySSA::ensureOptimizedUses() can be called to optimize all uses (once). This should be done by passes where having optimized uses is beneficial, either because we're going to query all uses anyway, or because we're doing def-use walks.
This should help reduce the compile-time impact of MemorySSA for some use cases (the reason why I started looking into this is D117926), which can avoid optimizing all uses upfront, and instead only optimize those that are actually queried.
Actually, we have an existing use-case for this, which is EarlyCSE. Disabling eager use optimization there gives a significant compile-time improvement, because EarlyCSE will generally only query clobbers for a subset of all uses (this change is not included in this patch).
Differential Revision: https://reviews.llvm.org/D121381
show more ...
|
| #
00a877f9 |
| 03-Mar-2022 |
Philip Reames <[email protected]> |
[DSE] Cache liveOnEntry as clobbering access
This builds on @fhahn's D112313, and caches the liveOnEntry node as a optimized access. D112313 tied to only cache a known clobber. This change adds cach
[DSE] Cache liveOnEntry as clobbering access
This builds on @fhahn's D112313, and caches the liveOnEntry node as a optimized access. D112313 tied to only cache a known clobber. This change adds caching the fact that no clobber exists. It still does not cache may-clobber results.
Differential Revision: https://reviews.llvm.org/D120842
show more ...
|
| #
b214f550 |
| 03-Mar-2022 |
Nikita Popov <[email protected]> |
[DSE] Drop redundant WalkerStepLimit adjustment
There is a general WalkerStepLimit adjustment higher up in the loop, and I don't see any reason why this particular case would need additional adjustm
[DSE] Drop redundant WalkerStepLimit adjustment
There is a general WalkerStepLimit adjustment higher up in the loop, and I don't see any reason why this particular case would need additional adjustment. Furthermore, this could underflow.
show more ...
|
| #
59630917 |
| 02-Mar-2022 |
serge-sans-paille <[email protected]> |
Cleanup includes: Transform/Scalar
Estimated impact on preprocessor output line: before: 1062981579 after: 1062494547
Discourse thread: https://discourse.llvm.org/t/include-what-you-use-include-cl
Cleanup includes: Transform/Scalar
Estimated impact on preprocessor output line: before: 1062981579 after: 1062494547
Discourse thread: https://discourse.llvm.org/t/include-what-you-use-include-cleanup Differential Revision: https://reviews.llvm.org/D120817
show more ...
|
|
Revision tags: llvmorg-14.0.0-rc2 |
|
| #
d03d3d79 |
| 16-Feb-2022 |
Florian Hahn <[email protected]> |
[DSE] Fall back to CFG scan for unreachable terminators.
Blocks with UnreachableInst terminators are considered as root nodes in the PDT. This pessimize DSE, if there are no aliasing reads from the
[DSE] Fall back to CFG scan for unreachable terminators.
Blocks with UnreachableInst terminators are considered as root nodes in the PDT. This pessimize DSE, if there are no aliasing reads from the potentially dead store and the block with the unreachable terminator.
If any of the root nodes of the PDF has UnreachableInst as terminator, fall back to the CFG scan, even the common dominator of all killing blocks does not post-dominate the block with potentially dead store.
It looks like the compile-time impact for the extra scans is negligible. https://llvm-compile-time-tracker.com/compare.php?from=779bbbf27fe631154bdfaac7a443f198d4654688&to=ac59945f1bec1c6a7d7f5590c8c69fd9c5369c53&stat=instructions
Fixes #53800.
Reviewed By: nikic
Differential Revision: https://reviews.llvm.org/D119760
show more ...
|
| #
2460a2ce |
| 15-Feb-2022 |
Nikita Popov <[email protected]> |
[DSE] Extract a common PDT check (NFC)
|
|
Revision tags: llvmorg-14.0.0-rc1, llvmorg-15-init |
|
| #
03d0acc5 |
| 26-Jan-2022 |
Nikita Popov <[email protected]> |
[DSE] Use helper for unwind check (NFCI)
This should be no functional change, as the cases supported by the helper and the cases supported by DSE are currently the same, the code structure is just s
[DSE] Use helper for unwind check (NFCI)
This should be no functional change, as the cases supported by the helper and the cases supported by DSE are currently the same, the code structure is just slightly different.
show more ...
|
|
Revision tags: llvmorg-13.0.1, llvmorg-13.0.1-rc3 |
|
| #
26f81984 |
| 18-Jan-2022 |
Nikita Popov <[email protected]> |
[DSE] Handle inaccessiblememonly calloc
Change the DSE calloc handling to assume that it is inaccessiblememonly, i.e. the defining access is liveOnEntry.
Differential Revision: https://reviews.llvm
[DSE] Handle inaccessiblememonly calloc
Change the DSE calloc handling to assume that it is inaccessiblememonly, i.e. the defining access is liveOnEntry.
Differential Revision: https://reviews.llvm.org/D117543
show more ...
|
| #
aa7f0e6a |
| 17-Jan-2022 |
Florian Hahn <[email protected]> |
[DSE] Remove commented-out InvisibleToCallerBeforeRet. (NFC)
This code was is a leftover from earlier changes and should be removed.
|
|
Revision tags: llvmorg-13.0.1-rc2 |
|
| #
00b77d91 |
| 11-Jan-2022 |
Nikita Popov <[email protected]> |
[DSE] Remove alloc function check in canSkipDef()
canSkipDef() currently skips inaccessiblememonly calls, but not if they are allocation functions. This check was added in D103009, but actually seem
[DSE] Remove alloc function check in canSkipDef()
canSkipDef() currently skips inaccessiblememonly calls, but not if they are allocation functions. This check was added in D103009, but actually seems to be a leftover from a previous implementation in D101440. canSkipDef() is not used on the storeIsNoop() path, where the relevant transform ended up being implemented.
Differential Revision: https://reviews.llvm.org/D117005
show more ...
|
| #
75de92d3 |
| 11-Jan-2022 |
Philip Reames <[email protected]> |
[DSE] Seperate malloc+memset -> calloc transform from noop store dedection [NFC]
This transformation has nothing to do with whether the store is a noop. The memset becomes a noop, but only after we
[DSE] Seperate malloc+memset -> calloc transform from noop store dedection [NFC]
This transformation has nothing to do with whether the store is a noop. The memset becomes a noop, but only after we replace the malloc with a calloc.
show more ...
|
| #
e2e7ecf2 |
| 11-Jan-2022 |
Philip Reames <[email protected]> |
[DSE] Minor style improvements to calloc formation code [NFC]
|
| #
a1bf4dda |
| 11-Jan-2022 |
Philip Reames <[email protected]> |
[DSE] Generalize store null to calloc allocated memory [NFC-ish]
This change removes a direct check for calloc-like allocation functions, and instead handles the generic case where we're storing a c
[DSE] Generalize store null to calloc allocated memory [NFC-ish]
This change removes a direct check for calloc-like allocation functions, and instead handles the generic case where we're storing a constant to constant initialized memory. This is mostly to remove the call to isCallocLike, but if someone downstream happens to have an initialized alloc which initializes to e.g. -1, this will also kick in for them. (I don't know of such an example ftr.)
show more ...
|
| #
3712372f |
| 11-Jan-2022 |
Philip Reames <[email protected]> |
[DSE] Style improvements after 3cef3cf - remove redundant dyn_casts [NFC]
I'd been working on exactly the same patch when Nikita landed his, so this patch is basically the style diff between the two
[DSE] Style improvements after 3cef3cf - remove redundant dyn_casts [NFC]
I'd been working on exactly the same patch when Nikita landed his, so this patch is basically the style diff between the two. :)
show more ...
|
| #
3cef3cf0 |
| 11-Jan-2022 |
Nikita Popov <[email protected]> |
[DSE] Check for noalias calls rather than alloc functions
For these "visible on unwind/ret" checks we only care about the fact that no other code has access to the pointer (unless it escapes). A noa
[DSE] Check for noalias calls rather than alloc functions
For these "visible on unwind/ret" checks we only care about the fact that no other code has access to the pointer (unless it escapes). A noalias call is sufficient for this, it does not have to be a known allocation function.
This is basically the same change as D116728, but for DSE rather than LICM.
show more ...
|
| #
3478d64e |
| 24-Dec-2021 |
Nikita Popov <[email protected]> |
[DSE] Check for whole object overwrite even if dead store size not known
If the killing store overwrites the whole object, we know that the preceding store is dead, regardless of the accessed offset
[DSE] Check for whole object overwrite even if dead store size not known
If the killing store overwrites the whole object, we know that the preceding store is dead, regardless of the accessed offset or size. This case was previously only handled if the size of the dead store was also known.
This allows us to perform conventional DSE for calls that write to an argument (but without known size).
Differential Revision: https://reviews.llvm.org/D116267
show more ...
|
| #
eb91d91b |
| 24-Dec-2021 |
Nikita Popov <[email protected]> |
[DSE] Fix typo in recent commit
This fixes a typo in 81d69e1bda9e4b6a83f29ba1f614e43ab4700972. Of course we should only skip the particular store if it isn't removable, not bail out of the whole loo
[DSE] Fix typo in recent commit
This fixes a typo in 81d69e1bda9e4b6a83f29ba1f614e43ab4700972. Of course we should only skip the particular store if it isn't removable, not bail out of the whole loop. Add a test to cover this case.
show more ...
|
| #
90095a0b |
| 24-Dec-2021 |
Nikita Popov <[email protected]> |
[DSE] Remove unnecessary check in getLocForWrite() (NFC)
MemoryLocation::getForDest() checks this itself, call it directly.
|