Commit Graph

8681 Commits

Author SHA1 Message Date
Michael Gottesman
fb487bf0ef [move-only] Improve logging to make it more readable and add a counter to bisect on variables that we are checking.
These are only on in NDEBUG mode. It just makes it easier to quickly triage
which variable is causing a checking problem.
2023-07-03 15:49:41 -07:00
Meghana Gupta
17cba8540d Merge pull request #67072 from meg-gupta/forwardingwrappertypepr
Introduce ForwardingOperation wrapper type
2023-07-01 23:33:50 -07:00
Meghana Gupta
07863444d2 Introduce ForwardingOperation wrapper type
APIs on ForwardingInstruction should be written as static taking in
a SILInstruction as a parameter making it awkward.

Introduce a ForwardingOperation wrapper type and move the apis from the
old "mixin" class to the wrapper type.

Add new api getForwardedOperands()
2023-07-01 10:42:38 -07:00
Pavel Yaskevich
fab9e4bc62 Merge pull request #66987 from xedin/refactor-init-accessors-to-carry-more-info
[SIL] InitAccessors: Refactor `assign_or_init` instruction to carry "self"
2023-06-30 11:46:01 -07:00
Joe Groff
421c762862 Merge pull request #67031 from jckarter/allocbox-to-stack-remove-unused-original-bodies
AllocBoxToStack: Remove bodies of closure functions left unused after specialization.
2023-06-30 08:30:42 -07:00
Joe Groff
bd5f0a7af0 AllocBoxToStack: Remove bodies of closure functions left unused after specialization.
We can't remove the functions at this point in case they might have other function
passes enqueued to run on them, but we can at least remove the function contents
that are now unnecessary. We need to do this in cases when move-only types are
involved, since the semantics of the move checker rely on unescaped captures being
promoted before the pass runs, and we leave behind invalid SIL in the unpromoted code.
rdar://110675352
2023-06-29 13:45:07 -07:00
Meghana Gupta
5c743650ec Merge pull request #66995 from meg-gupta/removeselectmixin
Simplify select_enum forwarding instruction
2023-06-29 09:52:49 -07:00
eeckstein
7fcfcdeecf Merge pull request #66990 from eeckstein/bare-objects
SIL: add a `bare` attribute to `global_value` and `alloc_ref`
2023-06-29 18:48:44 +02:00
Kuba (Brecka) Mracek
d427696bf9 Allow @_silgen_name to be used on globals and add a @_silgen_name(raw: ...) version that skips mangling (#66540)
Attribute @_silgen_name is today only allowed to be used on functions, this change allows usage on globals as well. The motivation for that is to be able to "forward declare" globals just like it's today possible to do with functions (for the cases where it's not practical or convenient to use a bridging header).

Separately, this change also adds a @_silgen_name(raw: ...) syntax, which simply avoids mangling the name (by using the \01 name prefix that LLVM uses). The motivation for that is to be able to reference the "magic Darwin linker symbols" that can be used to look up section bounds (in the current dylib/module) -- those symbols don't use the underscore prefix in their mangled names.
2023-06-29 08:37:51 -07:00
Michael Gottesman
9b59588fc3 [move-only] If we have a guaranteed forwarding instruction with only trivial results, treat it as a liveness use.
The reason why we want to do this is that if we treat it as a true forwarding
use, we will visit the uses of the trivial value and treat those as liveness
uses. Since the trivial value is not tied to the lifetime of the underlying
noncopyable value, this can be outside of the lifetime of said value causing a
memory lifetime error. By just treating the guaranteed forwarding instruction
with all trivial values as a liveness use, we avoid this problem.

I added a SIL test, a Swift test, and an Interpreter test that validates this
behavior.

rdar://111497657
2023-06-29 00:00:05 -07:00
Erik Eckstein
55c8c433c0 SILOptimizer: add the StripObjectHeader optimization pass
It sets the `[bare]` attribute for `alloc_ref` and `global_value` instructions if their header (reference count and metatype) is not used throughout the lifetime of the object.
2023-06-29 06:57:05 +02:00
Erik Eckstein
b08710d911 SIL: add a bare attribute to alloc_ref
The `bare` attribute indicates that the object header is not used throughout the lifetime of the object.
This means, no reference counting operations are performed on the object and its metadata is not used.
The header of bare objects doesn't need to be initialized.
2023-06-29 06:57:05 +02:00
Meghana Gupta
c8001d86b1 Add a wrapper type SelectEnumOperation
SelectEnumInstBase will be templated in the next commit.
Instead of using templated SelectEnumInstBase everywhere, introduce
a new wrapper type SelectEnumOperation.
2023-06-28 14:29:10 -07:00
Pavel Yaskevich
80a1e2c2ba [SILGen] InitAccessors: Produce partial apply of init accessor ref to produce substituted closure
Instead of dealing with substitutions during raw SIL lowering,
let's produce a partial apply without argument to produce a
substituted reference that could be used by SILVerifier and
raw SIL lowering stages.
2023-06-28 12:28:15 -07:00
Michael Gottesman
4591e39d02 [move-only] Fix borrowing address only no consume diagnostic to not say can't capture.
We previously were emitting a consuming partial_apply diagnostic. I had to
reformulate slightly the way we pattern match the diagnostics to make sure that
we get the proper no consume diagnostic.

rdar://111461837
2023-06-28 11:20:27 -07:00
Erik Eckstein
6b1697eb06 use new llvm::Optional APIs to fix deprecation warnings 2023-06-28 14:28:38 +02:00
Michael Gottesman
bd90e310e1 Merge pull request #66952 from gottesmm/pr-87fcc78991b465d8a15454dc76b66d6f347ddff0
[move-only] Emit an error if we /ever/ partially consume a noncopyable type.
2023-06-28 01:00:40 -07:00
Michael Gottesman
e1ab0eb93d Merge pull request #66969 from gottesmm/pr-4c80b1d0ebd95ec75ce40df2b5e5790cf9c9941c
[move-only] When storing a trivial field of a borrowed parameter, treat the store as a trivial use.
2023-06-28 00:17:55 -07:00
Michael Gottesman
6e850d7bce [move-only] When storing a trivial field of a borrowed parameter, treat the store as a trivial use.
rdar://111354827
2023-06-27 17:08:48 -07:00
Michael Gottesman
3dde9df468 [move-only] Emit an error if we /ever/ partially consume a noncopyable type.
The reason why I am doing this is that this was not part of the original
evolution proposal (it was called an extension) and after some discussion it was
realized that partial consumption would benefit from discussion on the forums.

rdar://111353459
2023-06-27 13:52:49 -07:00
Michael Gottesman
170ba67bd3 [move-only] Eliminate some temporary copies inserted by SILGen when accessing fields of lets.
In the next commit, I am modifying the move only checker to ensure that we
always error when partially invalidating. While doing this I discovered that
these copies were getting in the way of emitting good diagnostics in that case.
2023-06-27 13:41:31 -07:00
Nate Chandler
d00da4a0c1 [MoveOnlyAddressChecker] Fix repr for initInsts.
The address checker records instructions that initialize fields in its
initInsts map.  Previously, that map mapped from an instruction to a
range of fields of the type.  But an instruction can initialize multiple
discontiguous fields of a single value.  (Indeed an attempt to add a
second range that was initialized by an already initializing
instruction--even if it were overlapping or adjacent--would have no
effect and the map wouldn't be updated.)  Here, this is fixed by fixing
the representation and updating the storage whenver a new range is seen
to be initialized by the instruction.  As in
https://github.com/apple/swift/pull/66728 , a SmallBitVector is the
representation chosen.

rdar://111391893
2023-06-27 12:10:52 -07:00
Nate Chandler
f7f5802664 [MoveOnlyAddressChecker] NFC: Extracted helpers.
In preparation for having a third instance getting or creating the bits
affected by an instruction, introduce a typealias for maps
SILInstruction->SmallBitVector and a helper function that returns
a reference to the SmallBitVector for an instruction and two others that
set into those bits the bits from another bit vector or from a range.
2023-06-27 12:10:52 -07:00
Nate Chandler
4a5009a612 [MoveOnlyAddressChecker] Fix repr for reinits.
The address checker records instructions that reinit fields in its
reinitInsts map.  Previously, that map mapped from an instruction to a
range of fields of the type.  But an instruction can use multiple
discontiguous fields of a single value.  (Indeed an attempt to add a
second range that was reinit'd by an already reinit'ing
instruction--even if it were overlapping or adjacent--would have no
effect and the map wouldn't be updated.)  Here, this is fixed by fixing
the representation and updating the storage whenver a new range is seen
to be reinit'd by the instruction.  As in
https://github.com/apple/swift/pull/66728 , a SmallBitVector is the
representation chosen.

rdar://111356251
2023-06-27 12:10:52 -07:00
Nate Chandler
50798ff67e [MoveOnlyAddressChecker] NFC: Extracted function.
In preparation to share the getOrCreateConsumingBlock functionality with
another overload of recordConsumingBlock.
2023-06-27 11:24:47 -07:00
Nate Chandler
eb698970dd [MoveOnlyAddressChecker] NFC: Used helper.
Used the TypeTreeLeafTypeRange::setBits helper rather than looping over
the range and setting the bits in place.
2023-06-27 11:24:47 -07:00
Pavel Yaskevich
3063e9d778 [SIL] InitAccessors: Reference "self" in assign_or_init instruction
First step on the path to remove dependence on "setter".
2023-06-27 09:45:05 -07:00
Evan Wilde
250082df25 [NFC] Reformat all the LLVMs
Reformatting everything now that we have `llvm` namespaces. I've
separated this from the main commit to help manage merge-conflicts and
for making it a bit easier to read the mega-patch.
2023-06-27 09:03:52 -07:00
Evan Wilde
f3ff561c6f [NFC] add llvm namespace to Optional and None
This is phase-1 of switching from llvm::Optional to std::optional in the
next rebranch. llvm::Optional was removed from upstream LLVM, so we need
to migrate off rather soon. On Darwin, std::optional, and llvm::Optional
have the same layout, so we don't need to be as concerned about ABI
beyond the name mangling. `llvm::Optional` is only returned from one
function in
```
getStandardTypeSubst(StringRef TypeName,
                     bool allowConcurrencyManglings);
```
It's the return value, so it should not impact the mangling of the
function, and the layout is the same as `std::optional`, so it should be
mostly okay. This function doesn't appear to have users, and the ABI was
already broken 2 years ago for concurrency and no one seemed to notice
so this should be "okay".

I'm doing the migration incrementally so that folks working on main can
cherry-pick back to the release/5.9 branch. Once 5.9 is done and locked
away, then we can go through and finish the replacement. Since `None`
and `Optional` show up in contexts where they are not `llvm::None` and
`llvm::Optional`, I'm preparing the work now by going through and
removing the namespace unwrapping and making the `llvm` namespace
explicit. This should make it fairly mechanical to go through and
replace llvm::Optional with std::optional, and llvm::None with
std::nullopt. It's also a change that can be brought onto the
release/5.9 with minimal impact. This should be an NFC change.
2023-06-27 09:03:52 -07:00
nate-chandler
98d895db52 Merge pull request #66892 from nate-chandler/rdar111221183
[MoveOnlyAddressChecker] Fixed two use-before-def handlings.
2023-06-23 19:13:56 -07:00
swift-ci
995c41c008 Merge pull request #66826 from nate-chandler/rdar110862719
[FieldSensitivePL] NFC: Added unit tests.
2023-06-23 14:51:38 -07:00
Nate Chandler
ff7aa3c99a [LifetimeExtension] Fixed reinit collection.
During initializeLiveness, all blocks which contain destroys are to be
recorded in consuming blocks.  Previously, however, certain reinits were
not being added.  Here, all reinits are correctly added.
2023-06-23 12:50:05 -07:00
Nate Chandler
8eff2e8299 [LifetimeExtension] Handle use-before-def.
The multi-def algorithm is based off the single-def algorithm.  However,
it differs from it in needing to handle "liveness holes"--uses before defs.

When identifying blocks which are originally live, the algorithm starts
from consuming blocks and walks backwards until a condition is met.

Previously, that condition was finding blocks which were originally
live.  That makes sense in the single-def case: if a block is originally
live, either it was already walked through or else it was one of the
blocks discovered by liveness.  In either case, its predecessors have
already been visited if appropriate.

However, in the multi-def case, this condition is too stringent.  It
fails to account for the possibility of a block with has a "liveness
hole".  Only stop the backwards walk if the predecessor not only (1) was
in originally live but additionally (2) "kills liveness"--doesn't have a
use before a def.

rdar://111221183
2023-06-23 12:50:04 -07:00
Meghana Gupta
6da1df23c8 Merge pull request #66825 from meg-gupta/addressphilast
Sink address projections in ArrayPropertyOpt and enable verification to ensure we have no address phis
2023-06-23 12:27:42 -07:00
Nate Chandler
7322ccb25b [FieldSensitivePL] NFC: Added unit tests.
Ported versions of the unit tests that Andy added to pruned liveness to
FieldSensitivePL.

rdar://110862719
2023-06-23 10:16:53 -07:00
Rintaro Ishizaki
196ea79eac Merge pull request #66821 from rintaro/completion-macro-expanded-rdar110535113
[CodeCompletion] Suggest synthesized declarations from macros
2023-06-23 09:45:07 -07:00
Rintaro Ishizaki
096d8ea142 [CodeCompletion] Suggest synthesized declarations from macros
* Don't invalidate the lookup cache in 'getOrCreateSynthesizedFile()'
  Adding a synthesized file itself doesn't introduce any decls. Instead,
  we should invalidate the right after the actual declrations are added
  in the file
* Remove 'SourceLookupCache::invalidate()' method. It was just used
  right before the destruction. It was just not necessary
* Include auxiliary decls in 'SourceLookupCache::lookupVisibleDecls()'
  Previously, global symbol completion didn't include decls synthesized
  by peer macros or freestanding decl macros
* Include "auxiliary decls" in visible member lookup, and visible local
  decl lookup
* Hide macro unique names

rdar://110535113
2023-06-22 13:18:46 -07:00
Meghana Gupta
1e89ad6035 Sink address projections in ArrayPropertyOpt so that there are no address phis 2023-06-22 10:55:02 -07:00
swift-ci
0f201443ac Merge pull request #66846 from kavon/standardize-workqueue
Add a `BasicBlockWorkqueue` as a common utility.
2023-06-22 04:26:34 -07:00
Kavon Farvardin
057b1e5be4 change a BFS traversal in PullbackCloner to use BasicBlockWorkqueue 2023-06-21 23:40:08 -07:00
Kavon Farvardin
ba885d9ec2 rewrite emitMissingConsumeInDiscardingContext to use BasicBlockWorkqueue 2023-06-21 23:40:08 -07:00
Kavon Farvardin
51eaf4a1e5 rewrite findNonisolatedBlame to use BasicBlockWorkqueue
also simplifies the logic of the search quite a bit.
2023-06-21 23:40:08 -07:00
Meghana Gupta
28df449d38 Merge pull request #66723 from meg-gupta/improvefindpointerescape
Refactor swift::findPointerEscape and handle additional cases
2023-06-21 21:04:21 -07:00
Meghana Gupta
03b8c49371 Merge pull request #66645 from meg-gupta/mixinremovesmall
Simplify forwarding instruction definitions in SIL
2023-06-21 13:02:13 -07:00
Meghana Gupta
46bed7c617 Add SinkAddressProjections::newProjections 2023-06-21 12:33:32 -07:00
Meghana Gupta
37d858694d Update SILSSAUpdater::areIdentical to check for SILArgument 2023-06-21 12:24:26 -07:00
Meghana Gupta
b08eb62569 Rename SinkAddressProjections::projections -> SinkAddressProjections::oldProjections 2023-06-21 12:24:26 -07:00
Michael Gottesman
b8a4132af7 Merge pull request #66783 from gottesmm/pr-9c93f4322f46013f6053b162d35adfe4b4252b8f
[move-only] Remove use after move in CopiedLoadBorrowEliminationVisitor.
2023-06-21 10:53:55 -07:00
eeckstein
b4b12add65 Merge pull request #66800 from eeckstein/fix-allocref-combine
SILCombine: correctly set the `[stack]` flag when replacing `alloc_ref_dynamic` with `alloc_ref`
2023-06-21 19:28:37 +02:00
Joe Groff
282a9a7364 Merge pull request #66792 from jckarter/nonescaping-closure-conversion-moveonly-checker
MoveOnlyChecker: Look through `convert_function` of nonescaping closures.
2023-06-21 09:36:33 -07:00