Commit Graph

575 Commits

Author SHA1 Message Date
Kavon Farvardin
73e176cfdb NCGenerics: fix createInitExistentialAddr call 2024-02-09 11:14:06 -08:00
Andrew Trick
da3f583492 Add mark_dependence [unresolved]
In preparation for inserting mark_dependence instructions for lifetime
dependencies early, immediately after SILGen. That will simplify the
implementation of borrowed arguments.

Marking them unresolved is needed to make OSSA verification
conservative until lifetime dependence diagnostics runs.
2024-02-08 22:53:16 -08:00
Pavel Yaskevich
2e9fffb524 [SILGen] Implement actor isolation erasure thunk
The thunk is a reabstraction thunk with a custom prolog that
has a runtime precondition check that makes sure that concurrent
environment where the thunk is run matches that of a global
actor associated with the thunked type.
2024-02-01 13:28:25 -08:00
Slava Pestov
af3ab14986 SILGen: Clean up substitution map construction to deal with Copyable 2024-01-31 21:55:52 -05:00
Pavel Yaskevich
65b07e91b7 [SILGen] Emit expected executor preconditions for synchronous isolated @preconcurrency witness thunks
For `@preconcurrency` conformance witness thunks replace hop to
executor with a precondition to make sure that the thunk is always
called in the expected context.
2024-01-16 11:51:49 -08:00
Kavon Farvardin
4eccbe136e [NFC] combine collectExistentialConformances
There are a bunch of static `collectExistentialConformances` copied
around Sema and SILGen that are almost the same, save for whether they
want to permit missing conformances and/or check conditional
conformances.

This commit requestifies and combines all but one of these functions
into a `ModuleDecl::collectExistentialConformances`. The motivation for
this clean-up is another place that will need this procedure.
2024-01-10 19:39:07 -08:00
Andrew Trick
264cbaea42 Add mark_dependence [nonescaping] flag.
The dependent 'value' may be marked 'nonescaping', which guarantees that the
lifetime dependence is statically enforceable. In this case, the compiler
must be able to follow all values forwarded from the dependent 'value', and
recognize all final (non-forwarded, non-escaping) use points. This implies
that `findPointerEscape` is false. A diagnostic pass checks that the
incoming SIL to verify that these use points are all initially within the
'base' lifetime. Regular 'mark_dependence' semantics ensure that
optimizations cannot violate the lifetime dependence after diagnostics.
2024-01-04 14:47:35 -08:00
John McCall
c66ccbcaa8 Handle variadic generic tuples (both concretely and in abstraction
patterns) in argument positions in reabstraction thunks.

Most of the difficulty in this work continues to center around
(1) trying to reuse as much code as possible between the parameter
and result paths and (2) propagating ownership information as
necessary throughout the code.  I did my best to assert the preconditions
and postconditions here, but undoubtedly I'm missing cases.  Some
simplicity here is still eluding me here.

This patch necessarily changes quite a bit of the code used in
non-variadic paths.  I tried to avoid doing things that I knew would
be risky, like optimizing copies.  I did fail in a few places: e.g.
we should now generate significantly better code when erasing to
Optional<Any>, just because the code was oddly poorly-factored before.
You can see the effect on the function_conversion test case.
2024-01-03 19:25:26 -05:00
John McCall
611776e108 [NFC] Extract the parts of TupleElementAddressGenerator that just deal
with walking the tuple so that they can be used without an address.
2024-01-03 16:30:36 -05:00
John McCall
444e770175 [NFC] Generalize createOpenedElementValueEnvironment to also be able
to map formal types into the new environment.
2024-01-03 16:25:16 -05:00
John McCall
b11af8854a [NFC] Abstract over the inner slot type 2024-01-03 16:09:22 -05:00
Doug Gregor
504329545f [SILGen] Handle indirect error results in allocating class initializers 2023-11-12 03:20:39 -08:00
Doug Gregor
76a89500d6 [SILGen] Handle indirect errors in other thunk kinds 2023-11-10 15:30:17 -08:00
Doug Gregor
fc19b8e1f4 [Typed throws] Handle error conversions in witness thunks 2023-11-10 15:30:17 -08:00
Doug Gregor
0ba605a4b9 [Typed throws] Implement reabstraction thunks that change the error
Introduce SILGen support for reabstractions thunks that change the
error, between indirect and direct errors as well as conversions
amongst error types (e.g., from concrete to `any Error`).
2023-11-07 11:39:56 -08:00
Slava Pestov
d2f1dedd35 Merge pull request #68220 from slavapestov/remove-get-protocol-self-type
Remove DeclContext::getSelfProtocolType()
2023-08-31 11:39:17 -04:00
Slava Pestov
361d49a843 AST: Remove DeclContext::getSelfProtocolType() 2023-08-30 15:15:08 -04:00
John McCall
acece4c35f [NFC] Push cleanup management through a few reabstraction utilities 2023-08-29 18:11:08 -04:00
John McCall
60d2a93209 [NFC] result -> inner, for consistency 2023-08-28 12:27:36 -04:00
John McCall
c1f110c8e8 Generalize the handling of pack cleanups in reabstraction thunks
The result-reabstraction code doesn't need to handle cleanups properly
during the planning phase because of course we don't have any values
yet.  That is not true of argument reabstraction, so we need to make
sure that the recursive emitters can produce values with cleanups
so that we can collect and forward those cleanups correctly when
emitting the call.

As part of this, I've changed the code so that it should forward
outer addresses to inner address more consistently; it wouldn't
have done this before if we were breaking apart or assembling
a pack.  I'm not sure I can directly test this without figuring
out a way to get SILGen to reabstract both sides of a function,
though.

I'm not sure this is really doing borrowed vs owned arguments
correctly, if e.g. we need to rebstract one component of a tuple
that's otherwise borrowed.
2023-08-28 12:27:36 -04:00
John McCall
6dc298a80f [NFC] Split the inner/outer vanishing tuple handling
I'm going to change the type signature for inner tuples,
so this isn't going to work.
2023-08-28 12:25:17 -04:00
John McCall
8a5bfd5701 [NFC] Be more precise in some parameter types 2023-08-28 12:25:17 -04:00
John McCall
fb6a811fe9 [NFC] Allow the pack input value to be "written back" to the generator
This will be necessary in order to adopt this in TranslateArguments.
2023-08-28 12:25:17 -04:00
Michael Gottesman
543063ef0e [silgen] Make ManagedValue::forUnmanaged private and change users to use other more specific APIs.
I have been doing this over the past couple of days in preparation for changing
ManagedValue to specify the type of scope its cleanup is connected to.
2023-08-19 14:11:44 -07:00
Michael Gottesman
104379adab [silgen] Rename SILGenFunction::emitManagedRetain -> emitManagedCopy.
This is an old API that should have been renamed a long time ago. It just kept
its early name due to inertia.
2023-08-19 14:11:44 -07:00
John McCall
66ea1f1ddd [NFC] Fix an oversight in my previous NFC patches
This is starting to feel a little spaghetti-ish.  This kind of
existential stuff is hard to do in C++.
2023-08-14 22:29:27 -04:00
John McCall
127acfa686 [NFC] Share argument order and names between the arguments and results code
This was an annoying change, but mostly mechanical.  The goal here is
to create parallel structure between the two paths so that it isn't
utterly confusing to share common CRTP paths between them.  The renaming
of translate->process is just to make sure that all of the call sites
get correctly rewritten.
2023-08-14 21:48:13 -04:00
John McCall
bcb6230302 [NFC] Extract a lot of common expansion logic out of ResultPlanner 2023-08-14 19:06:49 -04:00
John McCall
939270c573 [NFC] More prep work for sharing code between param and result reabstraction 2023-08-14 19:06:49 -04:00
John McCall
c2207c6608 [NFC] Fold PlanData into the main ResultBuilder in SILGenPoly
I'm trying to create more parallel structure between the param
and result reabstraction code so that, hopefully, some of the
basic explosion reasoning can be shared.
2023-08-14 19:06:49 -04:00
Michael Gottesman
85e38afbac Merge pull request #67780 from gottesmm/pr-d9b586775f6ea84fe9868857eb8dd2eeaeb39f6f
[silgen] Rename forTrivialObjectRValue -> forObjectRValueWithoutOwnership and change a bunch of forUnmanaged to use this API
2023-08-08 09:58:33 -07:00
Michael Gottesman
2208caac32 [silgen] Convert a bunch of forUnmanaged -> forObjectRValueWithoutOwnership.
NFCI.
2023-08-07 13:36:02 -07:00
Michael Gottesman
7dbcdfb126 [silgen] Rename forTrivialObjectRValue -> forObjectRValueWithoutOwnership.
The reason to do this rename is that this is also used for objects that while
non-trivial have .none ownership. Example: enum instance without a case.
2023-08-07 13:36:02 -07:00
Allan Shortlidge
ca8bf981a4 NFC: Hoist queries for unavailable decl optimizations into the AST library.
Moving the query implementation up to the AST library from SIL will allow
conveniences to be written on specific AST element classes. For instance, this
will allow `EnumDecl` to expose a convenience that enumerates element decls
that are available during lowering.

Also, improve naming and documentation for these queries.
2023-08-04 17:39:26 -07:00
Nate Chandler
cc3038dcf6 [OpaqueValues] Transforms emit addr-only loads.
In opaque values mode, when transforming, load address even when their
type is address-only.
2023-08-02 20:16:58 -07:00
nate-chandler
d13348c074 Merge pull request #62494 from nate-chandler/opaque-values/2/20221209
[OpaqueValues] Initial support for AD.
2023-07-19 07:12:37 -07:00
Nate Chandler
c8bce4ac04 [OpaqueValues] Initial support for AD.
Just enough to build _Differentiation.
2023-07-18 14:09:36 -07:00
John McCall
1a7d44a11d Diagnose attempts to reabstract variadic function types in unimplementable ways. 2023-07-18 13:22:35 -04:00
Anton Korobeynikov
eb82df6bc6 [AutoDiff] Support differentiable functions with multiple semantic results (#66873)
Add support for differentiable functions having multiple semantic results

Co-authored-by: Brad Larson <larson@sunsetlakesoftware.com>
2023-07-06 16:31:39 -07:00
John McCall
c0777e611d Handle vanishing and variadic tuple results in reabstraction thunks.
Fixes rdar://110391963
2023-06-30 02:08:57 -04: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
Allan Shortlidge
235922d5ae SILGen: Stub unavailable protocol witness thunks.
Part of rdar://107388493
2023-05-03 15:19:31 -07:00
John McCall
0c3c62bd73 [NFC] Rename isPackExpansion -> isOrigPackExpansion for clarity 2023-03-22 15:40:02 -04:00
John McCall
5cf05f501b Implement arity reabstraction for closures 2023-03-21 22:23:45 -04:00
John McCall
0b3b0d84d7 [NFC] Use the generators library in SILGenPoly 2023-03-20 20:06:08 -04:00
John McCall
a05fef5122 Implement parameter arity reabstraction.
This is largely a matter of changing the main loop over subst
params in TranslateArguments to use the generators I added,
then plugging back into the general reabstraction infrastructure.

Because we don't have pack coroutines, we're kind of stuck in
the code generation for pack reabstraction: we have to write
+1 r-values into a temporary tuple and then write those tuple
element addresses into the output pack.  It's not great.  We
also have lifetime problems with things like non-escaping
closures --- we have that problem outside of reabstraction
thunks, too.

Other than that glaring problem, I'm feeling relatively good
about the code here.  It's missing some peepholes, but it should
work.  But that that's not to say that arity reabstraction works
in general; my attempts to test it have been exposing some
problems elsewhere, and in particular the closure case crashes,
which is really bad.  But this gets a few more things working,
and this PR is quite large already.
2023-03-20 20:06:08 -04:00
John McCall
a37146c731 [NFC] Return a result from all the single-result translators
We'll be using these results with packs.
2023-03-20 13:36:40 -04:00
John McCall
23ccbfde99 [NFC] Factor out the tuple-to-scalar path into a method 2023-03-19 23:31:27 -04:00
John McCall
7190ac4a50 [NFC] Add a detailed explanatory comment 2023-03-19 23:31:27 -04:00