Erik Eckstein
6b8c6a3c3b
SIL: rename updateBorrowedFrom to updateBorrowArguments
...
NFC
2024-11-12 09:26:58 +01:00
Erik Eckstein
1c5e185e89
Simplification: don't delete trivially dead borrowed-from instruction
...
A dead borrowed-from can only be removed if the argument (= operand) is also removed.
Fixes a compiler crash.
2024-11-11 14:06:16 +01:00
Arnold Schwaighofer
9093e1b0d2
Add comments to SwiftCompilerSources for shouldExpand()
2024-11-05 09:05:24 -08:00
Erik Eckstein
7786596a48
RedundantLoadElimination: support redundant loads of array elements with non-constant index
...
For example:
```
func test3(_ arr: Array<Int>, index: Int) -> Int {
return arr[index] + arr[index]
}
```
rdar://138519664
2024-11-04 19:26:45 +01:00
Erik Eckstein
f0633d5638
AccessUtils: support computing "constant" access paths
...
Add `Value.constantAccessPath`. It is like `accessPath`, but ensures that the projectionPath only contains "constant" elements.
This means: if the access contains an `index_addr` projection with a non-constant index, the `projectionPath` does _not_ contain the `index_addr`.
Instead, the `base` is an `AccessBase.index` which refers to the `index_addr`.
2024-11-04 19:26:44 +01:00
Konrad `ktoso` Malawski
43839ac5fd
Merge pull request #76995 from nickolas-pohilets/mpokhylets/disable-stack-promotion
...
Disable stack promotion for classes with isolated deinit
2024-11-04 18:07:11 +09:00
Arnold Schwaighofer
787c996394
LargeTypesReg2Mem: Add a new heuristic that trys harder to keep large
...
values on the stack
This heuristic can be enabled by passing -Xfrontend
-enable-aggressive-reg2mem.
rdar://123916109
2024-10-31 13:22:06 -07:00
Mykola Pokhylets
cb7a8d5cfc
Disable stack promotion for classes with isolated deinit
2024-10-31 20:43:11 +01:00
Erik Eckstein
b8a91c95aa
embedded: make sure to de-serialize vtable/wtable methods before trying to specialize them
...
Fixes a compiler crash.
rdar://138341211
2024-10-24 10:29:50 +02:00
Erik Eckstein
b8026d74e6
Revert "Revert "Optimizer: improve the load-copy-to-borrow optimization and implement it in swift""
...
This reverts commit 0666c446ec .
2024-10-22 08:40:18 +02:00
Erik Eckstein
44a9919308
Revert "Revert "SIL Verifier: implement load-borrow-immutability checkin in the swift verifier""
...
This reverts commit d7810450fe .
2024-10-22 08:40:18 +02:00
Erik Eckstein
d7810450fe
Revert "SIL Verifier: implement load-borrow-immutability checkin in the swift verifier"
...
This reverts commit b01e703ff3 .
2024-10-18 11:13:33 +02:00
Erik Eckstein
0666c446ec
Revert "Optimizer: improve the load-copy-to-borrow optimization and implement it in swift"
...
This reverts commit eed8645610 .
2024-10-18 10:36:06 +02:00
Erik Eckstein
709dfc2d21
MandatoryPerformanceOptimization: don't let not-inlinable functions to be inlined
...
Also refactor canInline.
Fixes a compiler crash.
rdar://137544788
2024-10-15 12:19:50 +02:00
Erik Eckstein
5c8fe55449
embedded: fix several issues with vtable specialization
...
* fix a false error if a derived class has different generic parameters than its base class
* fix a similar problem if a non-generic class derives from a generic class
* fix a compiler crash for calling a class method on a class metatype
rdar://137692055
2024-10-14 14:43:11 +02:00
Erik Eckstein
e0533e6125
SIL: add an API to replace all entries of a VTable
...
* add `ModulePassContext.replaceVTableEntries()`
* add `ModulePassContext.notifyFunctionTablesChanged()`
2024-10-14 14:43:11 +02:00
Erik Eckstein
eed8645610
Optimizer: improve the load-copy-to-borrow optimization and implement it in swift
...
The optimization replaces a `load [copy]` with a `load_borrow` if possible.
```
%1 = load [copy] %0
// no writes to %0
destroy_value %1
```
->
```
%1 = load_borrow %0
// no writes to %0
end_borrow %1
```
The new implementation uses alias-analysis (instead of a simple def-use walk), which is much more powerful.
rdar://115315849
2024-10-11 09:41:37 +02:00
Erik Eckstein
f249fa7289
OwnershipLiveness: add a flag visitInnerUses to enable constructing incomplete liveranges
...
If `visitInnerUses ` is true, it's not assumed that inner scopes are linear.
It forces to visit all interior uses if inner scopes.
2024-10-11 09:41:37 +02:00
Erik Eckstein
52deb58251
Optimizer: add the FunctionPassContext.completeLifetime(of: Value) utility
...
Implemented by bridging the OSSALifetimeCompletion utility
2024-10-11 09:41:37 +02:00
Erik Eckstein
b01e703ff3
SIL Verifier: implement load-borrow-immutability checkin in the swift verifier
2024-10-11 09:41:37 +02:00
Erik Eckstein
c8473da3a9
Swift Optimizer: add SpecificInstructionSet and SpecificInstructionWorklist
...
To be used for specific instruction types
2024-10-11 09:41:36 +02:00
Erik Eckstein
6ecb85a863
Swift SIL: add Operand.changeOwnership
2024-10-11 09:41:36 +02:00
Erik Eckstein
c97502374b
Optimizer: add constant folding of classify_bridge_object
...
Constant fold `classify_bridge_object` to `(false, false)` if the operand is known to be a swift class.
2024-10-08 16:24:46 +02:00
Erik Eckstein
a3e6e86383
Embedded: support existentials with inherited conformances
...
That means: derived classes where the base conforms to a protocol
2024-10-07 12:25:18 +02:00
Erik Eckstein
f7aaf7e5a5
MandatoryPerformanceOptimizations: handle all kind of witness-table entries when specializing witness-tables
...
Support associated-type and associated-conformance entries.
This enable existentials with associated types.
2024-10-07 09:00:32 +02:00
Erik Eckstein
c05234e677
MandatoryPerformanceOptimizations: specialize witness_method instructions
...
In Embedded Swift, witness method lookup is done from specialized witness tables.
For this to work, the type of witness_method must be specialized as well.
Otherwise the method call would be done with wrong parameter conventions (indirect instead of direct).
2024-10-07 09:00:31 +02:00
Erik Eckstein
a67d9c5bed
embedded: Support class existentials with inherited protocols
...
For example:
```
protocol Base: AnyObject {}
protocol Derived: Base {}
class C: Derived {}
let e: Derived = C()
```
2024-10-07 08:49:56 +02:00
Erik Eckstein
25728853b8
GenericSpecialization: change how new specialized witness tables are added to MandatoryPerformanceOptimization's worklist
...
Do it by passing a closure instead of returning the new witness table.
This allows to add more than one new witness table to the worklist
2024-10-07 08:49:56 +02:00
Erik Eckstein
f7aaf5874e
SwiftCompilerSources: add Context.getSpecializedConformance
2024-10-07 08:49:56 +02:00
Erik Eckstein
6fdb713e94
SwiftCompilerSources: implement WitnessTable.Entry as enum
2024-10-02 07:10:30 +02:00
Erik Eckstein
10782cf42b
SwiftCompilerSources: introduce the AST module
...
As the optimizer uses more and more AST stuff, it's now time to create an "AST" module.
Initially it defines following AST datastructures:
* declarations: `Decl` + derived classes
* `Conformance`
* `SubstitutionMap`
* `Type` and `CanonicalType`
Some of those were already defined in the SIL module and are now moved to the AST module.
This change also cleans up a few things:
* proper definition of `NominalTypeDecl`-related APIs in `SIL.Type`
* rename `ProtocolConformance` to `Conformance`
* use `AST.Type`/`AST.CanonicalType` instead of `BridgedASTType` in SIL and the Optimizer
2024-10-02 07:10:29 +02:00
Erik Eckstein
95c2c50018
DiagnosticEngine: support StringRef as diagnostic argument
2024-10-02 07:10:29 +02:00
Erik Eckstein
701a7f7275
SwiftCompilerSources: don't make anything public in the Optimizer module
...
The Optimizer module is a leave module. No other modules depend on it. Therefore nothing must be public in this module.
2024-10-02 07:10:28 +02:00
Erik Eckstein
ec44600869
SwiftCompilerSources: workaround a host-compiler crash on Windows
...
Workaround for https://github.com/swiftlang/swift/issues/73253
2024-09-25 19:32:15 +02:00
Erik Eckstein
4a1d6925e9
MandatoryPerformanceOptimizations: specialize witness tables to support class existentials with generic classes
2024-09-25 19:32:14 +02:00
Erik Eckstein
7ffd270008
embedded: move the VTableSpecializer pass into MandatoryPerformanceOptimizations
...
MandatoryPerformanceOptimizations already did most of the vtable specialization work.
So it makes sense to remove the VTableSpecializerPass completely and do everything in MandatoryPerformanceOptimizations.
2024-09-25 19:32:14 +02:00
Erik Eckstein
3775a3548e
ModulePassContext: add some utility functions
...
* `specialize(function:)`
* `deserializeCallees(of:)`
* `createWitnessTable()`
* `createSpecializedVTable`
* `Function.set(isSerialized:)`
2024-09-25 19:32:08 +02:00
Erik Eckstein
46d3909471
SIL: improve VTable and WitnessTable
...
* add missing APIs
* bridge the entries as values and not as pointers
* add lookup functions in `Context`
* make WitnessTable.Entry.Kind enum cases lower case
2024-09-25 19:32:07 +02:00
Erik Eckstein
351d42b3b3
SIL: add some Type APIs and make Type a DiagnosticArgument
2024-09-25 19:31:40 +02:00
Erik Eckstein
7ecb407226
SwiftCompilerSources: bridge SILDeclRef
...
And move NominalTypeDecl and DeclRef from Type.swift into a new file Declarations.swift.
Also add some APIs to NominalTypeDecl
2024-09-25 19:31:40 +02:00
Erik Eckstein
f3a9b08e7a
SwiftCompilerSources: bridged ProtocolConformance
...
And use that in some Builder APIs
2024-09-25 19:31:40 +02:00
Erik Eckstein
897ef2c5d4
SIL: add label to SubstitutionMap.init's bridged argument
2024-09-25 19:31:39 +02:00
Kuba (Brecka) Mracek
d3c5149714
Merge pull request #76658 from kubamracek/embedded-managed-buffer
...
[embedded] Add support for ManagedBuffer to Embedded Swift
2024-09-25 02:54:55 -07:00
Kuba Mracek
0b50c2155e
Don't emit upcast to the same type in SimplifyAllocRefDynamic, add test, add comment
2024-09-24 08:48:51 -07:00
Kuba Mracek
df38313572
The metatype operand on AllocRefDynamicInst is not always at index 1, use getNumTailTypes()
2024-09-23 15:42:38 -07:00
Kuba Mracek
c7a5569c4f
[embedded] Add support for ManagedBuffer to Embedded Swift
...
This makes ManagedBuffer available and usable in Embedded Swift, by:
- Removing an internal consistency check from ManagedBuffer that relies on metatypes.
- Making the .create() API transparent (to hoist the metatype to the callee).
- Adding a AllocRefDynamicInst simplification to convert `alloc_ref_dynamic` to `alloc_ref`, which removes a metatype use.
- Adding tests for the above.
2024-09-23 13:32:50 -07:00
Kuba (Brecka) Mracek
ecce6ac3a9
Merge pull request #76046 from kubamracek/fix-optimize-assert-config
...
Fix flipped 0/1 values in SimplifyBuiltin.optimizeAssertConfig
2024-09-18 14:18:19 -07:00
Kuba Mracek
4b164798ab
Avoid return-less switch expression (doesn't compile on old Swift compilers)
2024-09-17 09:35:06 -07:00
Erik Eckstein
0ee51e4d90
StaticInitCloner: skip begin_access instructions when cloning the initial value of a global
...
Fixes a crash when simplifying a load of an UnsafePointer-global which points to another global.
rdar://135223354
2024-09-14 14:12:36 +02:00
Alejandro Alonso
b35ac50d3c
Optimize TypeValueInst in Swift
2024-09-04 15:13:48 -07:00