Pavel Yaskevich
60ea598e7f
[SIL] Set actor isolation when constructing/initializing SILFunction
...
Prevents situations when actor isolation ends up not being set
un-intentionally i.e. when cloning, specializating, or creating
thunks.
The thunks get `unspecified` isolation at the moment.
2026-04-21 16:03:35 -07:00
Pavel Yaskevich
883d4ce45b
[SIL] Drop optional from SILFunction::getActorIsolation
...
SIL functions should always have actor isolation set, otherwise
it could lead to wrong deductions in optimization passes like
`SendNonSendable` or `OptimizeHopToExecutor`.
This is a first step to move isolation assignment into
`SILFunction::create`.
2026-04-21 12:21:01 -07:00
Pavel Yaskevich
f01d91f079
[SILOptimizer] Make sure that cloning also transfers the actor isolation
...
There are passes that rely on the isolation being present after
specialization and other optmizations i.e. `SendNonSendable` which
means the clones need to always preserve the isolation of the
original function.
2026-04-13 17:41:57 -07:00
Erik Eckstein
b97b3640f9
Optimizer: add some Context APIs
...
* `var isWholeModule`
* `var moduleDecl`
* `ClassDecl.hasFixedMetadataLayout`
2026-04-03 07:49:34 +02:00
Erik Eckstein
169cc9fb14
Optimizer: remove the old ClosureSpecializer pass
...
and replace it with the new ClosureSpecialization pass in the pipeline.
2026-03-16 16:12:29 +01:00
Erik Eckstein
b674585439
PassManager: add the ability to run runSwiftFunctionVerification for a function from within a module pass
2026-02-26 08:13:59 +01:00
Meghana Gupta
76b3374e81
Merge pull request #86155 from meg-gupta/removeborrowoptbailouts
...
Enable GenericSpecializer for borrow/mutate accessors and fix it for conditionally copyable types
2026-01-02 04:26:05 -08:00
Daniil Kovalev
1f77138afe
[AutoDiff] Closure specialization: specialize branch tracing enums ( #85757 )
...
This patch contains part of the changes intended to resolve #68944 .
1. Closure info gathering logic.
2. Branch tracing enum specialization logic.
3. Specialization of branch tracing enum basic block arguments in VJP.
4. Specialization of branch tracing enum payload basic block arguments
in pullback.
Note that mangling-related logic is implemented in C++ since at this
moment we have no Swift bridged for that.
Here is a simplified example of how branch tracing enum (BTE)
specialization looks like.
Before specialization:
```
enum $_AD__xxx {
case bb0(((Float) -> Float))
}
func vjp(...) {
// ...
%foo = function_ref $foo : (Float, Float) -> Float
%pa1 = partial_apply %foo(%arg1) : (Float) -> Float
%payload1 = tuple (%pa1) : ((Float) -> Float)
%bte = enum $_AD__xxx.bb0!enumelt, %payload1
// ...
}
func pullback(%bte, ...) {
// ...
%payload2 = unchecked_enum_data %bte, $_AD__xxx.bb0!enumelt : ((Float) -> Float)
%pa2 = tuple_extract %payload2, 0 : (Float) -> Float
%res = apply %pa2(%arg2) : Float
// ...
}
```
After specialization:
```
enum $_AD__xxx_spec_bb0_0 {
case bb0(((Float)))
}
func vjp(...) {
// ...
%captured1 = tuple (%arg1) : (Float)
%payload1 = tuple (%captured1) : ((Float))
%bte_spec = enum $_AD__xxx_spec_bb0_0.bb0!enumelt, %payload1
// ...
}
func pullback_spec(%bte_spec, ...) {
// ...
%payload2 = unchecked_enum_data %bte, $_AD__xxx_spec_bb0_0.bb0!enumelt : ((Float))
%captured2 = tuple_extract %payload2, 0 : (Float)
%arg1 = tuple_extract %captured2, 0 : Float
%foo = function_ref $foo : (Float, Float) -> Float
%res = apply %foo(%arg2, %arg1) : Float
// ...
}
```
2025-12-21 00:33:50 +00:00
Meghana Gupta
b467c5ec3c
[NFC] Remove unused DominanceInfo from OSSACompleteLifetime and InteriorLiveness
2025-12-17 13:30:06 -08:00
Erik Eckstein
17ca4d9787
Optimizer: add FunctionPassContext.mangle(withChangedRepresentation original: Function)
2025-11-26 16:23:47 +01:00
Erik Eckstein
ab2345a2ed
FunctionPassContext: support setting arbitrary function type representations when creating specialized functions
2025-11-26 16:23:47 +01:00
Aidan Hall
c7af4c584e
Bridging: APIs for PackSpecialization pass
2025-10-26 13:44:34 +00:00
Andrew Trick
4a7895e15b
SwiftCompilerSources: bridge Function.isAddressor()
2025-10-07 10:44:42 -07:00
Erik Eckstein
89bba668e2
Mangling: add a closure specialization mangling for arguments which specialize for the same closure as a previous argument
...
For example:
```
%1 = partial_apply %closure
apply %f(%1, %1) // first argument: `.closure(%1)`
// second argument: `.previousArgumentIndex(0)`
```
2025-10-06 09:47:41 +02:00
Erik Eckstein
8e86b5ce3b
Optimizer: add a preserveGenericSignature flag to FunctionPassContext.createSpecializedFunctionDeclaration
2025-09-04 08:15:46 +02:00
Erik Eckstein
45b1a21e74
Optimizer: make ModulePassContext.specialize() also available in FunctionPassContext and add two argument flags
...
add `convertIndirectToDirect` and `isMandatory`
2025-09-04 08:15:45 +02:00
Erik Eckstein
1a4bd76f95
Mangling: add specialization mangling for more complex constant propagated function arguments
...
So far, constant propagated arguments could only be builtin literals.
Now we support arbitrary structs (with constant arguments), e.g. `Int`.
This requires a small addition in the mangling scheme for function specializations.
Also, the de-mangling tree now looks a bit different to support a "tree" of structs and literals.
2025-09-04 08:15:44 +02:00
Jakub Florek
e3140e0ae0
Add new generalized cloner.
2025-08-28 20:57:57 +01:00
Nate Chandler
aa85694237
[NFC] OSSACompleteLifetime: Renamed.
2025-08-18 09:45:19 -07:00
Erik Eckstein
319f49ad9f
SwiftCompilerSources: move the Verifier to the SIL module
2025-07-28 14:19:11 +02:00
Erik Eckstein
e95283ba38
SwiftCompilerSources: make the testing infrastructure available in the SIL module
...
add `Test`, which is the SIL-equivalent of `FunctionTest`.
It's invocation closure gets a `TestContext` instead of a `FunctionContext`.
^ The commit message #2 will be skipped:
^ - test
2025-07-28 14:19:10 +02:00
Erik Eckstein
65c9828cb3
SwiftCompilerSources: move the Context protocols from the Optimizer to the SIL module
...
This allows to move many SIL APIs and utilities, which require a context, to the SIL module.
The SIL-part of SwiftPassInvocation is extracted into a base class SILContext which now lives in SIL.
Also: simplify the begin/end-pass functions of the SwiftPassInvocation.
2025-07-28 14:19:07 +02:00
Erik Eckstein
28dd6f7064
Optimizer: improve the SpecializationCloner
...
* add `cloneFunctionBody` without an `entryBlockArguments` argument
* remove the `swift::ClosureSpecializationCloner` from the bridging code and replace it with a more general `SpecializationCloner`
2025-06-20 08:15:02 +02:00
Erik Eckstein
d8e4e501f6
Optimizer: add some SIL modification APIs to Context
...
* `insertFunctionArgument`
* `BeginAccessInst.set(accessKind:)`
* `erase(function:)`
2025-06-20 08:15:01 +02:00
Erik Eckstein
de28cf04cc
Optimizer: add Context. mangle(withBoxToStackPromotedArguments)
2025-06-20 08:15:01 +02:00
Erik Eckstein
bc7024edfe
Optimizer: fix ModulePassContext.mangle(withDeadArguments:)
...
If mangled the wrong argument indices.
2025-06-20 08:15:00 +02:00
Erik Eckstein
4212c611e5
Optimizer: add Context.createSpecializedFunctionDeclaration
...
Originally this was a "private" utility for the ClosureSpecialization pass.
Now, make it a general utility which can be used for all kind of function specializations.
2025-06-20 08:15:00 +02:00
Meghana Gupta
aa01b2ad06
Add a new semantics attribute to disable SIL verification on a function
...
This provides a way to disable verification per function instead of the entire module.
2025-05-15 14:30:28 -07:00
Andrew Trick
6898e33edd
[NFC] fix a dropUnusedArguments parameter name
2025-04-07 14:42:10 -07:00
Erik Eckstein
e18bedaa87
CastOptimizer: pass the SIL function to the cast-classify APIs, instead of the module decl
...
NFC
2025-04-05 09:00:30 +02:00
Erik Eckstein
cf8c8561ca
Optimizer: move optimizer bridging code from PassManager.cpp into its own file.
...
The bridging code was in PassManager.cpp only for historical reasons.
It's now in OptimizerBridging.cpp.
NFC
2025-03-19 09:28:53 +01:00