Commit Graph

1347 Commits

Author SHA1 Message Date
Hamish Knight
ce23252a3f [Basic] Improve some bridging APIs
Improve APIs for BridgedStringRef,
BridgedOwnedString, and BridgedSourceLoc.
2023-10-30 23:49:53 +00:00
Hamish Knight
3e3fb584c3 [SwiftCompilerSources] NFC: Workaround a compiler bug 2023-10-30 23:49:52 +00:00
Erik Eckstein
e718bfe8ed Optimizer: reimplement simplifications for copy_value and destroy_value in swift
So that they can run in the OnoneSimplification pass
2023-10-27 10:47:07 +02:00
Erik Eckstein
b6938475b9 Optimizer: add simplification for the convert_escape_to_noescape instruction
Including the required bridging stuff.

  %2 = thin_to_thick_function %1 to $() -> ()
  %3 = convert_escape_to_noescape %2 : $() -> () to $@noescape () -> ()
->
  %3 = thin_to_thick_function %1 to $@noescape () -> ()
2023-10-27 10:47:07 +02:00
Erik Eckstein
8b9f2a73d0 SimplifyApply: optimize thick calls where the callee is a thin_to_thick_function
```
   %2 = thin_to_thick_function %1
   %3 = apply %2(...) : @callee_guaranteed
 ->
   %2 = thin_to_thick_function %1
   %3 = apply %1(...): @convention(thin)
```
2023-10-27 10:47:07 +02:00
Erik Eckstein
bd022b4051 InitializeStaticGlobals: fix a SIL verifier crash
When merging stores in a global initializer, it's possible that the merged store is inserted at the wrong location, causing a SIL verifier error.
This is hard to reproduce, but can happen.
The merged store must be inserted _after_ all other stores. Instead it's inserted after the store of the last property. Now, if properties are _not_ initialized in the order they are declared, this problem can show up.

rdar://117189962
2023-10-19 20:29:30 +02:00
Andrew Trick
681a2b72e0 Merge pull request #69164 from atrick/nonescapable_attr
Add a temporary @_nonEscapable and @_hasUnsafeNonEscapableResult attribute
2023-10-17 21:39:10 -07:00
Andrew Trick
ca7253a25c Add the @_unsafeNonEscapableResult function
This will allow NonEscapable types to be returned from a function.
2023-10-17 12:44:31 -07:00
Andrew Trick
045253e614 Add SILType::isEscapable 2023-10-17 12:44:31 -07:00
Erik Eckstein
54d254f100 Optimizer: better handling of the complexity budget in redundant-load-elimination and dead-store-elimination.
Instead of having a budget for each optimized load or store, provide a budget for the whole function.
Fixes a build time problem.

rdar://116877696
2023-10-16 14:44:34 +02:00
Andrew Trick
972a69f17e SwiftCompilerSources bridging review feedback 2023-10-12 14:33:37 -07:00
Andrew Trick
d7c1c50d9b SwiftCompilerSources: VarDecl bridging for SIL. 2023-10-12 14:33:37 -07:00
Andrew Trick
e2333cdcfc SwiftCompilerSources: diagnostics bridging. 2023-10-12 14:33:37 -07:00
Andrew Trick
ae5ad5557d Add Swift BeginApplyInst::yieldedValues 2023-10-12 14:33:37 -07:00
swift-ci
bbd15fce69 Merge pull request #69152 from atrick/forwarding-utils
ForwardingUtils.swift improvements
2023-10-12 12:17:47 -07:00
Andrew Trick
13142e3957 ForwardingUtils.swift improvements
For diagnostics in the presence of dead values.
2023-10-12 09:39:34 -07:00
Erik Eckstein
04b1ab6941 Rename BridgedDiagnosticEngine -> BridgedDiagEngine
So that it does not collide with BridgedDiagnosticEngine in CASTBridging.h.
This hopefully fixes an asan crash.
rdar://116686158
2023-10-11 20:41:30 +02:00
Andrew Trick
bd157b3be4 ForwardingUtils.swift unit tests 2023-10-10 13:42:48 -07:00
Andrew Trick
75ea3821ed Fix initial ForwardingInstruction implementation and handle phis 2023-10-10 13:40:23 -07:00
Andrew Trick
7592b18627 SwiftCompilerSources: Add a standardError utility 2023-10-10 13:40:02 -07:00
Andrew Trick
12ea57919a Test.swift cleanup for usability 2023-10-10 13:39:59 -07:00
Nate Chandler
9ca6b9ac1f [Test] Print to stdout.
In the C++ sources it is slightly more convenient to dump to stderr than
to print to stdout, but it is rather more unsightly to print to stderr
from the Swift sources.  Switch to stdout.  Also allows the dump
functions to be marked debug only.
2023-10-10 08:19:44 -07:00
nate-chandler
0270d0fda2 Merge pull request #69069 from nate-chandler/nfc/20231009/1
[SwiftCompilerSources] NFC: Renamed two helper fns
2023-10-09 11:33:08 -07:00
swift-ci
44307996e3 Merge pull request #69071 from eeckstein/bridging-followup
Follow-up on the bridging rework
2023-10-09 10:52:40 -07:00
Andrew Trick
e04abee2e9 Merge pull request #69049 from apple/fix-select-enum
Fix ownership of select_enum instruction
2023-10-09 10:02:34 -07:00
Erik Eckstein
22979b9a7a fix an uninitialized pointer in BridgedSourceLoc
It's so easy to run into undefined behavior in C++
2023-10-09 17:32:51 +02:00
Nate Chandler
99576dc261 [SwiftCompilerSources] NFC: Renamed two helper fns 2023-10-09 07:40:18 -07:00
Erik Eckstein
2dbd6cc56b SwiftCompilerSources: rework bridging
Introduce two modes of bridging:
* inline mode: this is basically how it worked so far. Using full C++ interop which allows bridging functions to be inlined.
* pure mode: bridging functions are not inlined but compiled in a cpp file. This allows to reduce the C++ interop requirements to a minimum. No std/llvm/swift headers are imported.

This change requires a major refactoring of bridging sources. The implementation of bridging functions go to two separate files: SILBridgingImpl.h and OptimizerBridgingImpl.h.
Depending on the mode, those files are either included in the corresponding header files (inline mode), or included in the c++ file (pure mode).

The mode can be selected with the BRIDGING_MODE cmake variable. By default it is set to the inline mode (= existing behavior). The pure mode is only selected in certain configurations to work around C++ interop issues:
* In debug builds, to workaround a problem with LLDB's `po` command (rdar://115770255).
* On windows to workaround a build problem.
2023-10-09 09:52:52 +02:00
Nate Chandler
e65e6678e5 [Gardening] Updated comment.
Mention that running FunctionTests written in swift requires
swift-in-compiler and fixed the name of the register function.
2023-10-08 09:42:24 -07:00
Andrew Trick
69a884565a Fix ownership of select_enum instruction
This instruction was given forwarding ownership in the original OSSA
implementation. That will obviously lead to memory leaks. Remove
ownership from this instruction and verify that it is never used for
non-trivial types.
2023-10-08 01:34:48 -07:00
Nate Chandler
ae1f950315 [SwiftCompilerSources] Moved Test into Optimizer.
And changed the type of the context argument to FunctionPassContext.
2023-10-07 21:23:13 -07:00
nate-chandler
18ce3ab465 Merge pull request #69007 from nate-chandler/swiftcompilersources/test-bridging-registration-cleanup
[SwiftCompilerSources] Simplified test registration.
2023-10-07 21:22:04 -07:00
Kuba Mracek
5d8c55eacb [embedded] Initial Swift Concurrency for embedded Swift 2023-10-06 20:04:03 -07:00
Nate Chandler
ce4ba6ce2a [Test] Simplified registration.
At the cost of adding an unsafe bitcast implementation detail,
simplified the code involved to register a new FunctionTest when adding
one.

Also simplifies how Swift native `FunctionTest`s are registered with the
C++ registry.

Now, the to-be-executed thin closure for native Swift `FunctionTest`s is
stored under within the swift::test::FunctionTest instance corresponding
to it.  Because its type isn't representable in C++, `void *` is used
instead.  When the FunctionTest is invoked, a thunk is called which
takes the actual test function and bridged versions of the arguments.
That thunk unwraps the arguments, casts the stored function to the
appropriate type, and invokes it.

Thanks to Andrew Trick for the idea.
2023-10-05 18:02:35 -07:00
Andrew Trick
eccf94d57b Merge pull request #68885 from atrick/bridge-forwarding
SwiftCompilerSources: added OwnershipUtils for ForwardingInstruction.
2023-10-05 10:22:30 -07:00
Nate Chandler
149412a62a [Test] NFC: Link out to SIL.rst.
Help readers find out what the specify_test instruction allows right
away as they peruse the documentation.
2023-10-04 11:10:46 -07:00
Andrew Trick
e27b308781 SwiftCompilerSources: added OwnershipUtils for ForwardingInstruction.
This could be combined with ValueUseDefWalker if the latter is
refactored to classsify instructions by projections and aggegation
(which always forward) vs. other arbitrary hard-coded instruction
types. It would also need to limit the walk to real operands (which
are always forwarded). Then this walker can call into the default walk
for projections and track the projection path. The current
implementation is however simpler and more efficient.
2023-10-03 23:54:57 -07:00
Andrew Trick
bce9817162 SwiftCompilerSources: add ForwardingInstruction 2023-10-03 23:54:57 -07:00
Ikko Eltociear Ashimine
680c6f3ae2 Fix typo in ComputeSideEffects.swift
mutliple -> multiple
2023-10-03 17:39:39 +09:00
swift-ci
26d65b5e8e Merge pull request #68924 from nate-chandler/gardening/20231002/1
[Gardening] Fixed comment.
2023-10-02 21:36:56 -07:00
Nate Chandler
68ca2dc418 [Gardening] Fixed comment.
Refer to a source file in the relevant language.
2023-10-02 16:57:47 -07:00
Kuba (Brecka) Mracek
f4a0397407 Merge pull request #68883 from kubamracek/embedded-release-devirt
[embedded] Re-enable ReleaseDevirtualizer and teach it to look for specialized destructors
2023-10-02 13:15:03 -07:00
Andrew Trick
139c573920 SwiftCompilerSources: add OperandOwnership enum. 2023-10-02 09:41:12 -07:00
Andrew Trick
1f7bfd8f12 SwiftCompilerSources: expose Swift Operand.endsLifetime 2023-10-02 09:41:12 -07:00
Kuba Mracek
28a3d583c8 [embedded] Re-enable ReleaseDevirtualizer and teach it to look for specialized destructors 2023-09-29 16:28:59 -07:00
Andrew Trick
2a604e2ab0 Merge pull request #68814 from atrick/blockarg
SwiftCompilerSources: Replace BlockArgument with Phi and TermResult.
2023-09-29 15:51:00 -07:00
Nate Chandler
36805c8a41 [Test] Moved test-spec parsing test to Swift.
To prove out that the bridging works.
2023-09-28 15:15:29 -07:00
Nate Chandler
dab8c146a6 [SwiftCompilerSources] Bridged in-IR testing.
Added the bridging types involved and the basic functionality.
2023-09-28 11:33:50 -07:00
Andrew Trick
a5d8aafb23 SwiftCompilerSources: Replace BlockArgument with Phi and TermResult.
All SILArgument types are "block arguments". There are three kinds:
1. Function arguments
2. Phis
3. Terminator results

In every situation where the source of the block argument matters, we
need to distinguish between these three. Accidentally failing to
handle one of the cases is an perpetual source of compiler
bugs. Attempting to handle both phis and terminator results uniformly
is *always* a bug, especially once OSSA has phi flags. Even when all
cases are handled correctly, the code that deals with data flow across
blocks is incomprehensible without giving each case a type. This
continues to be a massive waste of time literally every time I review
code that involves cross-block control flow.

Unfortunately, we don't have these C++ types yet (nothing big is
blocking that, it just wasn't done). That's manageable because we can
use wrapper types on the Swift side for now. Wrapper types don't
create any more complexity than protocols, but they do sacrifice some
usability in switch cases.

There is no reason for a BlockArgument type. First, a function
argument is a block argument just as much as any other. BlockArgument
provides no useful information beyond Argument. And it is nearly
always a mistake to care about whether a value is a function argument
and not care whether it is a phi or terminator result.
2023-09-27 18:47:46 -07:00
Kavon Farvardin
b688a1f4a1 [SILOpt] experimental async demotion pass
For chains of async functions where suspensions can be statically
proven to never be required, this pass removes all suspensions and
turns the functions into synchronous functions.

For example, this function does not actually require any suspensions,
once the correct executor is acquired upon initial entry:

```
func fib(_ n: Int) async -> Int {
  if n <= 1 { return n }
  return await fib(n-1) + fib(n-2)
}
```

So we can turn the above into this for better performance:

```
func fib() async -> Int {
  return fib_sync()
}

func fib_sync(_ n: Int) -> Int {
  if n <= 1 { return n }
  return fib(n-1) + fib(n-2)
}
```

while rewriting callers of `fib` to use the `sync` entry-point
when we can prove that it will be invoked on a compatible executor.

This pass is currently experimental and under development. Thus, it
is disabled by default and you must use
`-enable-experimental-async-demotion` to try it.
2023-09-21 12:21:02 -07:00