Commit Graph

6583 Commits

Author SHA1 Message Date
Anton Korobeynikov
c7a216058f [AutoDiff] First cut of coroutines differentiation (#71461)
This PR implements first set of changes required to support autodiff for coroutines. It mostly targeted to `_modify` accessors in standard library (and beyond), but overall implementation is quite generic.

There are some specifics of implementation and known limitations:
 - Only `@yield_once` coroutines are naturally supported
 - VJP is a coroutine itself: it yields the results *and* returns a pullback closure as a normal return. This allows us to capture values produced in resume part of a coroutine (this is required for defers and other cleanups / commits)
 - Pullback is a coroutine, we assume that coroutine cannot abort and therefore we execute the original coroutine in reverse from return via yield and then back to the entry
 - It seems there is no semantically sane way to support `_read` coroutines (as we will need to "accept" adjoints via yields), therefore only coroutines with inout yields are supported (`_modify` accessors). Pullbacks of such coroutines take adjoint buffer as input argument, yield this buffer (to accumulate adjoint values in the caller) and finally return the adjoints indirectly.
 - Coroutines (as opposed to normal functions) are not first-class values: there is no AST type for them, one cannot e.g. store them into tuples, etc. So, everywhere where AST type is required, we have to hack around.
 - As there is no AST type for coroutines, there is no way one could register custom derivative for coroutines. So far only compiler-produced derivatives are supported
 - There are lots of common things wrt normal function apply's, but still there are subtle but important differences. I tried to organize the code to enable code reuse, still it was not always possible, so some code duplication could be seen
 - The order of how pullback closures are produced in VJP is a bit different: for normal apply's VJP produces both value and pullback closure via a single nested VJP apply. This is not so anymore with coroutine VJP's: yielded values are produced at `begin_apply` site and pullback closure is available only from `end_apply`, so we need to track the order in which pullbacks are produced (and arrange consumption of the values accordingly – effectively delay them)
 - On the way some complementary changes were required in e.g. mangler / demangler

This patch covers the generation of derivatives up to SIL level, however, it is not enough as codegen of `partial_apply` of a coroutine is completely broken. The fix for this will be submitted separately as it is not directly autodiff-related.

---------

Co-authored-by: Andrew Savonichev <andrew.savonichev@gmail.com>
Co-authored-by: Richard Wei <rxwei@apple.com>
2024-04-04 17:24:55 -07:00
Emil Pedersen
efa09088ac Revert "[DebugInfo][SIL] Introduce the 'implicit' attribute for debug variable"
This reverts commit e63632fda8.

rdar://125939953
2024-04-04 17:23:32 -07:00
Andrew Trick
6aa07ff9bf Merge pull request #72777 from atrick/fix-lifedep-throw
LifetimeDependence: handle dependent values in throwing calls.
2024-04-04 08:06:31 -07:00
Pavel Yaskevich
7e4d170330 Merge pull request #72798 from mrs1669/fix/typos
Fix some typos
2024-04-04 00:15:52 -07:00
Andrew Trick
581010d00c SIL: Make drop_deinit a ForwardingInstruction.
drop_deinit forwards ownership while effectively stripping the deinitializer. It is similar to a type cast.

Fixes rdar://125590074 ([NonescapableTypes] Nonescapable types
cannot have deinits)
2024-04-03 18:53:18 -07:00
Meghana Gupta
0cddd69415 Merge pull request #72780 from meg-gupta/enablesilcombineossa
Enable inject_enum_addr silcombine in ossa
2024-04-03 15:59:22 -07:00
Meghana Gupta
72a9075b8e Return index from SwitchValueInst::getUniqueCaseForDestination 2024-04-03 10:30:52 -07:00
Takumi Muraishi
b82c3bd79b fix typo in SIL 2024-04-03 18:03:30 +09:00
Slava Pestov
5cf05ecfcf Revert "SILCloner: allow builtin conformances"
This reverts commit abae144c92.
2024-04-01 14:19:01 -04:00
Michael Gottesman
77dccacbd3 Make ActorIsolation on SILFunction non-optional.
ActorIsolation already has a "I have no value case": unspecified. Lets just use
that.

Just a mistake I made that I am trying to fix before anything further depends on
this code.
2024-03-29 14:39:26 -07:00
Kavon Farvardin
8b22079291 Merge pull request #72683 from kavon/fix-make-abstract-conformance-attempt2
SILCloner: allow builtin conformances
2024-03-29 10:03:38 -07:00
Alejandro Alonso
36bf2ae3bf Merge pull request #72592 from Azoy/raw-layout-inst
[IRGen] Add Builtin.addressOfRawLayout
2024-03-29 07:38:37 -07:00
Kavon Farvardin
abae144c92 SILCloner: allow builtin conformances
When cloning SIL, it's OK for conformances to Copyable or Escapable to
be carried-over as a builtin conformance, rather than an abstract
conformance.

This is a workaround for a bug introduced in
`6cd5468cceacc1d600c7dafdd4debc6740d1dfd6`.

resolves rdar://125460667
2024-03-28 15:45:11 -07:00
Anton Korobeynikov
d84847ac9d Reland Allow normal function results of @yield_once coroutines (#71645)
* Allow normal function results of @yield_once coroutines

* Address review comments

* Workaround LLVM coroutine codegen problem: it assumes that unwind path never returns.
This is not true to Swift coroutines as unwind path should end with error result.
2024-03-27 13:09:02 -07:00
Alejandro Alonso
f5e10e2c0b Get rid of sil instruction and use a builtin for addressOfRawLayout 2024-03-27 11:36:29 -07:00
Nate Chandler
52a1f4dbe7 [LifetimeCompletion] Handle endAsyncLetLifetime.
Handle it like an `end_borrow`.
2024-03-27 07:01:18 -07:00
nate-chandler
f81f7f9c54 Merge pull request #72595 from nate-chandler/lifetime-completion/20240325/2
[LifetimeCompletion] Handle owned project_box.
2024-03-27 07:00:17 -07:00
Michael Gottesman
8679b62884 Merge pull request #72583 from gottesmm/more-fixes
[region-isolation] A few improvements + If a value is dynamically actor isolated, do not consider it transferred if the transfer statically was to that same actor isolation.
2024-03-26 13:02:14 -07:00
Nate Chandler
06af948e7e [LifetimeCompletion] Handle owned project_box.
Akin to 57eb1db38c but for owned values.
2024-03-26 11:10:00 -07:00
Michael Gottesman
8243b5cb74 [region-isolation] If a value is dynamically actor isolated, do not consider it transferred if the transfer statically was to that same actor isolation.
This issue can come up when a value is initially statically disconnected, but
after we performed dataflow, we discovered that it was actually actor isolated
at the transfer point, implying that we are not actually transferring.

Example:

```swift
@MainActor func testGlobalAndGlobalIsolatedPartialApplyMatch2() {
  var ns = (NonSendableKlass(), NonSendableKlass())
  // Regions: (ns.0, ns.1), {(mainActorIsolatedGlobal), @MainActor}

  ns.0 = mainActorIsolatedGlobal
  // Regions: {(ns.0, ns.1, mainActorIsolatedGlobal), @MainActor}

  // This is not a transfer since ns is already main actor isolated.
  let _ = { @MainActor in
    print(ns)
  }

  useValue(ns)
}
```

To do this, I also added to SILFunction an actor isolation that SILGen puts on
the SILFunction during pre function visitation. We don't print it or serialize
it for now.

rdar://123474616
2024-03-25 22:58:17 -07:00
Nate Chandler
57eb1db38c [LifetimeCompletion] Handle project_box.
Port a0c85be52c to C++ InteriorLiveness to
treat `project_box` like an interior pointer use and fix lifetime
completion of a borrow that encloses one.
2024-03-25 08:57:16 -07:00
Andrew Trick
2f6c4ad90d Merge pull request #72513 from atrick/markdep_escape
SIL: Fix handling of mark_dependence [nonescaping] in several utilities
2024-03-23 09:33:28 -07:00
Konrad `ktoso` Malawski
6132386371 [Distributed] Complete handling of protocol calls and witnesses using adjusted mangling scheme (#72416) 2024-03-23 23:54:23 +09:00
Andrew Trick
d7b9149ee5 Fix visitNonEscapingLifetimeEnds to handle mark_dependence uses
Now it visits unknown uses separately rather than asserting.
2024-03-22 14:29:57 -07:00
Joe Groff
3b830bffb5 Merge pull request #72509 from jckarter/fspl-def-edge-generalization
FSPL: Generalize `try_apply` specific condition to handle other hypothetical def-on-edge cases.
2024-03-22 13:49:03 -07:00
Adrian Prantl
9b0c4104ef Merge pull request #72397 from Snowy1803/verifier-conflicting-debug-value-types
[SILVerifier] Add detection of conflicting debug variables
2024-03-22 11:31:05 -07:00
nate-chandler
4f6ed730a4 Merge pull request #72469 from nate-chandler/rdar125113258
[MoveOnlyAddressChecker] Fix enum representation.
2024-03-21 17:18:03 -07:00
Joe Groff
a717c35a2e FSPL: Generalize try_apply specific condition to handle other hypothetical def-on-edge cases. 2024-03-21 15:07:47 -07:00
eeckstein
83b2593fba Merge pull request #72485 from eeckstein/node-bits
Some improvements for inline bitfields in SILNode, SILBasicBlock and Operand
2024-03-21 22:45:22 +01:00
Nate Chandler
a0a1ff2a04 [MoveOnlyAddressChecker] Fix enum repr.
Change FieldSensitive's enum representation to allow distinguishing
among the elements with associated value.  Consider
`unchecked_take_enum_data_addr` to consume all other fields than that
taken.

rdar://125113258
2024-03-21 10:48:32 -07:00
Erik Eckstein
7afa419dd4 SIL: improve inline bitfields in SILNode, SILBasicBlock and Operand
* Let the customBits and lastInitializedBitfieldID share a single uint64_t. This increases the number of available bits in SILNode and Operand from 8 to 20. Also, it simplifies the Operand class because no PointerIntPairs are used anymore to store the operand pointer fields.
* Instead make the "deleted" flag a separate bool field in SILNode (instead of encoding it with the sign of lastInitializedBitfieldID). Another simplification
* Enable important invariant checks also in release builds by using `require` instead of `assert`. Not catching such errors in release builds would be a disaster.
* Let the Swift optimization passes use all the available bits and not only a fixed amount of 8 (SILNode) and 16 (SILBasicBlock).
2024-03-21 15:52:39 +01:00
Emil Pedersen
fed03ccc2b [SILVerifier] Add detection of conflicting debug variables 2024-03-20 15:55:52 -07:00
Emil Pedersen
3c1ef77b23 [DebugInfo] Fix specialization of debug variable types 2024-03-20 15:35:52 -07:00
Nate Chandler
4f6f8d9459 [NFC] MoveOnly: Map operand to list of ranges. 2024-03-20 12:52:57 -07:00
Nate Chandler
2ab2252233 [NFC] MoveOnly: Map inst to array of ranges. 2024-03-20 12:52:57 -07:00
Nate Chandler
76348df0cf [MoveOnlyAddressChecker] Fix repr for consumes.
An instruction can consume multiple (discontiguous) fields.  Use a
SmallBitVector to track the fields consumed by an instruction rather
than a TypeTreeLeafRange.

rdar://125103951
2024-03-20 12:08:48 -07:00
Nate Chandler
7feb7e2675 [NFC] FSPrunedLiveness: Move impl to cpp file.
The function is long and will get longer.
2024-03-20 08:20:16 -07:00
Nate Chandler
234e8bce1d [Gardening] FSPrunedLiveness: Delete dead decl. 2024-03-20 08:20:16 -07:00
Joe Groff
dc4c874c49 Merge pull request #72452 from jckarter/pruned-liveness-try-apply-conditional-def
FieldSensitivePrunedLiveness: Handle conditionality of `try_apply` defs.
2024-03-20 07:43:42 -07:00
Joe Groff
1166f2e0d8 FieldSensitivePrunedLiveness: Handle conditionality of try_apply defs.
A `try_apply` with indirect out arguments is only a def for those arguments on
the success path. Model this by sinking the def-ness of the instruction into the
success branch of the try_apply, and introducing a new `DeadToLiveEdge` mode for
block liveness which stops propagation of use-before-def conditions into the
block that introduced the def. Fixes rdar://118567869.
2024-03-19 22:46:26 -07:00
Andrew Trick
7da493498a Merge pull request #72407 from atrick/pointer-escape-bailout
Fix lifetime dependence in the presence of pointer escapes.
2024-03-19 11:40:38 -07:00
Erik Eckstein
6bb5ad6230 Swift SIL: complete APIs for CheckedCastAddrBranchInst 2024-03-19 09:02:06 +01:00
Andrew Trick
aa208bbf91 Add SILType::containsNoEscapeFunction()
Add PartialApplyInst.hasNoescapeCapture
Add PartialApplyInst.mayEscape

Refactor DiagnoseInvalidEscapingCaptures. This may change functionality because tuples containing a noescape closure are now correctly recognized. Although I'm not sure such tupes can ever be captured directly.
2024-03-18 17:38:12 -07:00
Ellie Shin
7c7a2de736 Merge pull request #72344 from apple/elsh/pkg-cmo-flag-false
Set EnableSerializePackage to false.
2024-03-15 17:15:49 -07:00
Ellie Shin
6fc909837f Set EnableSerializePackage to false and update call sites.
Update doc comments.

rdar://124651962
2024-03-15 14:11:36 -07:00
Meghana Gupta
237b70c7d4 Merge pull request #72314 from meg-gupta/fixnonestructonly
Fix ownership of move-only structs in SIL
2024-03-15 01:28:12 -07:00
Ben Barham
cbcfc85777 Merge pull request #72323 from bnbarham/rename-startswith
Rename startswith to starts_with
2024-03-14 09:06:54 -07:00
Ben Barham
9779c18da3 Rename startswith to starts_with
LLVM is presumably moving towards `std::string_view` -
`StringRef::startswith` is deprecated on tip. `SmallString::startswith`
was just renamed there (maybe with some small deprecation inbetween, but
if so, we've missed it).

The `SmallString::startswith` references were moved to
`.str().starts_with()`, rather than adding the `starts_with` on
`stable/20230725` as we only had a few of them. Open to switching that
over if anyone feels strongly though.
2024-03-13 22:25:47 -07:00
Michael Gottesman
e156289cea Merge pull request #72126 from gottesmm/async-let-fixes
[region-isolation] Make async let closures non-Sendable and require actor isolation crossing function into an async let use a transferring result.
2024-03-13 21:54:04 -07:00
Doug Gregor
685b493ac3 Merge pull request #72305 from DougGregor/silgen-thrown-error-closures
[SILGen] Correctly determine the thrown error type for closures
2024-03-13 18:28:29 -07:00