Commit Graph

9332 Commits

Author SHA1 Message Date
Michael Gottesman
7712639ab0 [region-isolation] Add support for project_block_storage.
rdar://119743743
2023-12-18 09:35:57 -08:00
Andrew Trick
b637f06acd [SIL] Bridge findPointerEscape() and fix OnoneSimplifyable
Do not bridge the hasPointerEscape flag until it is implemented.
2023-12-18 09:16:55 -08:00
Slava Pestov
2ffc8cc970 Merge pull request #70499 from slavapestov/fix-rdar119541554
AST: Fix ExistentialLayout::isObjC() handling of marker protocols
2023-12-16 07:36:01 -05:00
Slava Pestov
79e9b96835 AST: Fix ExistentialLayout::isObjC() handling of marker protocols
Fixes rdar://problem/119541554.
2023-12-15 15:33:44 -05:00
Michael Gottesman
09151bd800 [region-isolation] Add lookthrough support for a bunch of instructions.
Specifically:

* MoveValueInst
* MarkUnresolvedNonCopyableValueInst
* MarkUnresolvedReferenceBindingInst
* CopyableToMoveOnlyWrapperValueInst
* MoveOnlyWrapperToCopyableValueInst
* MoveOnlyWrapperToCopyableBoxInst
* MoveOnlyWrapperToCopyableAddrInst
* CopyableToMoveOnlyWrapperAddrInst
* MarkUninitializedInst
2023-12-14 19:11:06 -08:00
Kavon Farvardin
64226fbcba Merge pull request #70452 from kavon/fix-typelowering
[NCGenerics] fix type lowering
2023-12-14 11:38:55 -08:00
Kavon Farvardin
4657fa9d48 [NCGenerics] fix type lowering
TypeDecl::canBeNoncopyable is never going to be fully accurate. In this
instance, we were incorrectly treating some types like `S<T: ~Copyable>`
 as noncopyable, and thus non-trivial, despite them in some cases being
 Copyable.
2023-12-14 08:45:27 -08:00
Erik Eckstein
60baf111ff Remove Type.selfOrAnyFieldHasValueDeinit
It's not needed anymore
2023-12-13 20:03:02 +01:00
Alejandro Alonso
f365316d74 Merge pull request #70327 from Azoy/inject-get-enum-tag-builtins
[IRGen] Add getEnumTag and injectEnumTag builtins
2023-12-12 16:07:56 -08:00
Michael Gottesman
486b7ceb94 Merge pull request #70394 from gottesmm/pr-f328e7893b344f5252d43a4358baf49fb4589abe
[region-isolation] Add the ability to write SIL tests for actor isolation
2023-12-12 15:47:12 -06:00
Konrad `ktoso` Malawski
828f589be4 Initial Task Executor implementation Task(on:), addTask(on:) etc. (#68793)
Co-authored-by: John McCall <rjmccall@gmail.com>
2023-12-12 17:14:24 +09:00
Michael Gottesman
a43e5e661c Add variant include. 2023-12-11 21:33:20 -06:00
Michael Gottesman
f328e7893b [region-isolation] Add support for representing ApplyIsolationCrossing at the SIL level on apply, begin_apply, try_apply.
Some notes:

This is not emitted by SILGen. This is just intended to be used so I can write
SIL test cases for transfer non sendable. I did this by adding an
ActorIsolationCrossing field to all FullApplySites rather than adding it into
the type system on a callee. The reason that this makes sense from a modeling
perspective is that an actor isolation crossing is a caller concept since it is
describing a difference in between the caller's and callee's isolation. As a
bonus it makes this a less viral change.

For simplicity, I made it so that the isolation is represented as an optional
modifier on the instructions:

  apply [callee_isolation=XXXX] [caller_isolation=XXXX]

where XXXX is a printed representation of the actor isolation.

When neither callee or caller isolation is specified then the
ApplyIsolationCrossing is std::nullopt. If only one is specified, we make the
other one ActorIsolation::Unspecified.

This required me to move ActorIsolationCrossing from AST/Expr.h ->
AST/ActorIsolation.h to work around compilation issues... Arguably that is where
it should exist anyways so it made sense.

rdar://118521597
2023-12-11 19:27:27 -06:00
Michael Gottesman
5883f77b50 [sil] Add the ability to parse SILOptionalAttr of the form [NAME=STRING]. 2023-12-11 19:27:04 -06:00
Michael Gottesman
e44757a299 [sil] Move SILParser into its own local header.
This will let me add functionality into the SILParser into other files. The main
file is already very large.
2023-12-11 19:27:04 -06:00
Alejandro Alonso
0ed4a19c73 Don't check inject enum tag's 2nd operand 2023-12-11 10:58:31 -08:00
Alejandro Alonso
49b0a23561 Add getEnumTag and injectEnumTag builtins 2023-12-11 10:58:29 -08:00
eeckstein
484fc77a8c Merge pull request #70301 from eeckstein/fixed-array
Add experimental support for fixed arrays
2023-12-11 09:36:29 +01:00
Kavon Farvardin
a4a6c69e97 Merge pull request #70277 from kavon/inverse-escapable
[NCGenerics] add `~Escapable`
2023-12-10 05:42:24 -08:00
Kavon Farvardin
e99ce1cc5d [NCGenerics] add ~Escapable
Basic implementation of `~Escapable` in the type system.

rdar://119216918
2023-12-10 01:25:43 -08:00
Erik Eckstein
dd9ce40ba1 add the allocVector builtin 2023-12-09 18:49:57 +01:00
Erik Eckstein
e652f2c92e SIL: add the alloc_vector and vector instructions
* `alloc_vector`: allocates an uninitialized vector of elements on the stack or in a statically initialized global
* `vector`: creates an initialized vector in a statically initialized global
2023-12-09 18:49:55 +01:00
Dario Rexin
36dd2c9450 [SilOpt] Add new layout type _TrivialStride and add pre-specialization suppport for it (#70308)
rdar://119329771

This layout allows adding pre-specializations for trivial types that have a different size, but the same stride. This is especially useful for collections, where the stride is the important factor.
2023-12-09 08:13:50 -08:00
Dario Rexin
df35f3327d [SilOpt] Add new layout _BridgeObject and add pre-specialization support for it (#70239)
rdar://119048001
2023-12-08 14:34:16 -08:00
Kavon Farvardin
338d426b3d Merge pull request #70278 from kavon/refactor-InverseType
[NCGenerics] fold InverseType into PCT
2023-12-08 02:44:45 -08:00
Kavon Farvardin
63b3e7624d [NCGenerics] fold InverseType into PCT
We already need to track the inverses separate from the members in a
ProtocolCompositionType, since inverses aren't real types. Thus, the
only purpose being served by InverseType is to be eliminated by
RequirementLowering when it appears in a conformance requirement.

Instead, we introduce separate type InverseRequirement just to keep
track of which inverses we encounter to facilitate cancelling-out
defaults and ensuring that the inverses are respected after running
the RequirementMachine.
2023-12-07 22:14:23 -08:00
Doug Gregor
d204d04da4 Merge pull request #70303 from DougGregor/sil-subst-error-closures-typed-throws
[SIL] Fix computation of substituted error type against an abstraction pattern
2023-12-07 12:52:42 -08:00
Doug Gregor
42d77df648 [SIL] Fix computation of substituted error type against an abstraction pattern
We were attempting to perform substitution against the original pattern
even when it didn't have a substitution map, and then trying to cover
for the resulting errors by adjusting to `any Error`... which isn't
always correct. Do the substitution only when it makes sense.

Fixes rdar://119217570 & rdar://119219214.
2023-12-07 10:05:38 -08:00
Meghana Gupta
b6326f5f24 Add initial support for _resultDependsOn
These attributes are used to establish lifetime dependence between
argument and the result.

Add them under NonEscapableTypes experimental feature
2023-12-06 16:38:38 -08:00
Andrew Trick
23ddaafdc8 Fix MemoryLifetimeVerifier to ignore thin functions.
SILGen optimizes creation of closure down a thin function when it has
no captures:

  %1 = thin_to_thick_function %0
  : $@convention(thin) () -> () to $@callee_guaranteed () -> ()

ValueOwnership.cpp has a sketchy optimization that treat the result
like a trivial type, even though it is not:

>  CONSTANT_OWNERSHIP_INST(None, ThinToThickFunction)

commit 8c5737d1d5
Date:   Fri Oct 23 15:12:18 2020 -0700

    [ownership] Change thin_to_thick function to always produce a none value.

This creates a mismatch between the SILType and the SILValue
ownership. This is not a coherent design--we have a similar problem
with enums which is endlessly buggy--but reverting the decision will
be hard. Instead, I'll hack the memory verifier to silence this case.

Fixes rdar://115735132 (Lifetime verifier error with opaque return
type and closure)
2023-12-05 09:16:07 -08:00
Hamish Knight
c3b055a9a8 [Profiler] Improve if statement coverage
Fix counters for regions following `else if`s, fix
the counters for `else if` conditions, and fix
handling of `break` statements. Also while here,
clean up the handling of branch exit regions such
that we don't generate multiple overlapping
regions for each branch, but a single region at
the end of the entire `if` statement that accounts
for all exiting control flow.

rdar://104078910
rdar://104079242
2023-12-04 11:09:01 +00:00
eeckstein
1c3bd3e722 Merge pull request #70158 from eeckstein/fix-sil-linker
SIL linker: delay function verification to end of linking
2023-12-04 08:54:46 +01:00
eeckstein
10ff55b2b3 Merge pull request #70155 from eeckstein/refactoring
MemoryLifetimeVerifier: use CalleeCache instead of AliasAnalysis
2023-12-04 08:53:59 +01:00
Robert Widmann
db28fc8adb Merge pull request #70100 from CodaFi/cereal-milk
Don't Serialize Declarations with `package` Access
2023-12-01 13:48:21 -07:00
Erik Eckstein
0897d8a720 MemoryLifetimeVerifier: use CalleeCache instead of AliasAnalysis
To verify if a function may read from an indirect argument, don't use AliasAnalysis.
Instead use the CalleeCache to get the list of callees of an apply instruction.
Then use a simple call-back into the swift Function to check if a callee has any relevant memory effect set.

This avoids a dependency from SIL to the Optimizer.
It fixes a linker error when building some unit tests in debug.
2023-12-01 19:20:18 +01:00
Erik Eckstein
e80fedc52a move CalleeCache from SILOptimizer to SIL
Extract the CalleeCache from BasicCalleeAnalysis so that it can be used in SIL without BasicCalleeAnalysis
2023-12-01 19:20:18 +01:00
zoecarver
69498e2f2e [opt] Add three new perf annotations: @_noRuntime, @_noExistential, and @_noObjCBridging. 2023-12-01 09:13:24 -07:00
Erik Eckstein
4d2fe9690a SIL linker: delay function verification to end of linking
The SIL linker de-serializes functions. Immediately after de-serialization some `[serialized]` flags of referenced functions may not be set correctly, yet.
This is fixed by the linker. But it also means that the SIL is only valid after the linker has finished processing all functions.

Fixes a SIL verifier error.
2023-12-01 16:09:30 +01:00
Hamish Knight
144ede78a5 Merge pull request #70121 from hamishknight/zero-subs 2023-11-30 17:52:37 +00:00
Pavel Yaskevich
4db2cf7b71 Merge pull request #70076 from xedin/sendable-keypath-literals
[ConstraintSystem] Implement sendability inference for key path expressions
2023-11-30 09:48:32 -08:00
Hamish Knight
25e6e96016 [Profiler] Avoid crashing on redundant break in repeat-while
Treat subtracting zero as a no-op, avoiding the
assertion guarding against creating negative
counters.
2023-11-30 13:23:26 +00:00
Hamish Knight
322ce4e3f4 [Profiler] Fix handling of property wrapper backing inits
Previously we were walking into the
PropertyWrapperValuePlaceholderExpr when generating
coverage for a property wrapper backing initializer.
This meant that we were duplicating the coverage of
the initializer expression, and it could cause
crashes if a refined counter was introduced within
the top-most expression region, such as with a
throwing expression in a `try!`.

rdar://118939162
2023-11-29 22:58:29 +00:00
Robert Widmann
a987ba48d0 Don't Serialize Declarations with package Access
This accidentally started happening when I adjusted getEffectiveAccess to return `Public` for `Package` declarations in #69709. As a result, the optimizer thought it had more opportunities to go after declarations that used to be opaque. Unfortunately, this resulted in a miscompile as the devirtualizer was able to look through now-serialized package (static) functions. In one specific instance, the optimizer created direct calls to hidden accessors instead of going through the dispatch thunk.
2023-11-29 14:09:48 -07:00
Pavel Yaskevich
511dad557c [Sema/SIL] NFC: Get existential layout directly from an existential type 2023-11-29 09:25:16 -08:00
Michael Gottesman
ccefdebb26 Merge pull request #70031 from gottesmm/region-isolation-async-let
[region-isolation] Add support for async let
2023-11-28 20:30:47 -08:00
Pavel Yaskevich
229e580174 [SIL] Add a way to retrieve key path type from KeyPathInst
Since the type of the instruction could be existential it's
better to keep retrival logic in one place.
2023-11-28 13:02:17 -08:00
Nate Chandler
b4f783e660 [SIL] Added var_decl flag to borrows/moves. 2023-11-28 07:26:08 -08:00
nate-chandler
8d669bbc4b Merge pull request #69924 from nate-chandler/opaque-values/20231116/1/resilient_empty_enum_case
[SIL] Addr-only enums have non-none ownership.
2023-11-27 13:05:25 -08:00
Hamish Knight
b430a025ea Merge pull request #69986 from hamishknight/try-try-again 2023-11-27 20:18:53 +00:00
Erik Eckstein
6f6c0a5608 SwiftCompilerSources: add a few enum related APIs in Type and Builder
* `Type.getEnumCases`
* `Builder.createUncheckedTakeEnumDataAddr`
* `Builder.createSwitchEnumAddr`
2023-11-27 09:21:33 +01:00