Commit Graph

2441 Commits

Author SHA1 Message Date
Michael Gottesman
5e36ae1c7c [sil] Add a forwarding cast called unchecked_value_cast.
Today unchecked_bitwise_cast returns a value with ObjCUnowned ownership. This is
important to do since the instruction can truncate memory meaning we want to
treat it as a new object that must be copied before use.

This means that in OSSA we do not have a purely ossa forwarding unchecked
layout-compatible assuming cast. This role is filled by unchecked_value_cast.
2020-07-09 21:14:32 -07:00
David Zarzycki
03411af15a [SIL] Convert computeLoweredRValueType to CanTypeVisitor
In practice, LLVM can only optimize trivial `if` chains into a `switch`.
2020-07-09 08:24:12 -04:00
Hamish Knight
241c5d95e3 Merge pull request #32461 from hamishknight/its-all-linked 2020-07-08 11:07:17 -07:00
David Zarzycki
8a5ae9d32b Merge pull request #32678 from davezarzycki/pr32678
[SIL] NFC: Move #include of CanTypeVisitor.h
2020-07-03 05:23:36 -04:00
Michael Forster
26358c4588 Import member operator functions as static members (#32293)
This adds support to `ClangImporter` to import C++ member function operators as static methods into Swift, which is part of SR-12748.

The left-hand-side operand, which gets passed as the `this` pointer to the C++ function is represented as an additional first parameter in the Swift method. It gets mapped back in SILGen.

Two of the tests are disabled on Windows because we can't yet call member functions correctly on Windows (SR-13129).
2020-07-03 11:06:22 +02:00
David Zarzycki
3952715bed [SIL] NFC: Move #include of CanTypeVisitor.h
This improves incremental rebuild performance.
2020-07-02 11:04:25 -04:00
Hamish Knight
5792a72b95 Always link SIL for partial modules in SILGen
Previously we would only link `.sib` partial
modules in SILGen, with other kinds of serialized
ASTs being linked just before the SILOptimizer if
`-sil-merge-partial-modules` was specified.
However linking them always seems to be the desired
behaviour, so adjust SILGen to link SIL for all
serialized AST inputs.
2020-07-01 23:14:01 -07:00
Erik Eckstein
67605553df SIL: a new instruction 'base_addr_for_offset' for field offset calculations.
The ``base_addr_for_offset`` instruction creates a base address for offset calculations.
The result can be used by address projections, like ``struct_element_addr``, which themselves return the offset of the projected fields.
IR generation simply creates a null pointer for ``base_addr_for_offset``.
2020-07-01 15:10:08 +02:00
Dan Zheng
1bc9159e4f [AutoDiff] Support differentiation of functions with multiple results in SIL. (#32629)
Reverse-mode differentiation now supports `apply` instructions with multiple
active "semantic results" (formal results or `inout` parameters).

The "cannot differentiate through multiple results" non-differentiability error
is lifted.

Resolves TF-983.
2020-06-30 17:33:25 -07:00
Erik Eckstein
4aa99a2dd0 SILPrinter: print linkage for external globals.
Unlike SIL functions, there is no way to distinguish a global declaration from a global definition - other than the linkage.
2020-06-22 16:49:26 +02:00
Meghana Gupta
4d705abc87 Merge pull request #32319 from meg-gupta/onfastpath
Ignore onFastPath builtin while looking for valid static initializer of a global variable
2020-06-15 10:23:09 -07:00
Joe Groff
04c8f0df42 IRGen: Don't reify internal vtable entries that are marked overridden.
Private and internal classes shouldn't have ABI constraints on their concrete vtable layout, so if methods
don't have overrides in practice, we can elide their vtable entries.
2020-06-12 11:59:24 -07:00
David Zarzycki
23c7fc5d35 Merge pull request #32296 from davezarzycki/pr32296
[SIL] NFC: Make SILVTable follow C++ and LLVM best practices
2020-06-12 07:46:48 -04:00
David Zarzycki
d9073c83fa Merge pull request #32135 from davezarzycki/pr32135
[SIL] NFC: Shrink SILGlobalVariable by 16 bytes
2020-06-11 14:51:05 -04:00
Meghana Gupta
632b5ce0c8 Ignore OnFastPath builtin while looking for valid static initializer of a global variable 2020-06-11 10:06:10 -07:00
David Zarzycki
e077b6ffd9 [SIL] NFC: Make SILVTable follow C++ and LLVM best practices
1) Convert the `Entry` type to a class with getters/setters
2) Use llvm::TrailingObjects
3) Use llvm::PointerIntPair
2020-06-11 07:51:42 -04:00
Vedant Kumar
60ec3f1b90 Fix debug description for cases with multiple items (#32282)
* [SILGenFunction] Don't create redundant nested debug scopes

Instead of emitting:

```
sil_scope 4 { loc "main.swift":6:19 parent 3 }
sil_scope 5 { loc "main.swift":7:3 parent 4 }
sil_scope 6 { loc "main.swift":7:3 parent 5 }
sil_scope 7 { loc "main.swift":7:3 parent 5 }
sil_scope 8 { loc "main.swift":9:5 parent 4 }
```

Emit:

```
sil_scope 4 { loc "main.swift":6:19 parent 3 }
sil_scope 5 { loc "main.swift":7:3 parent 4 }
sil_scope 6 { loc "main.swift":9:5 parent 5 }
```

* [IRGenSIL] Diagnose conflicting shadow copies

If we attempt to store a value with the wrong type into a slot reserved
for a shadow copy, diagnose what went wrong.

* [SILGenPattern] Defer debug description of case variables

Create unique nested debug scopes for a switch, each of its case labels,
and each of its case bodies. This looks like:

```
  switch ... { // Enter scope 1.
    case ... : // Enter scope 2, nested within scope 1.
      <body-1> // Enter scope 3, nested within scope 2.

    case ... : // Enter scope 4, nested within scope 1.
      <body-2> // Enter scope 5, nested within scope 4.
  }
```

Use the new scope structure to defer emitting debug descriptions of case
bindings. Specifically, defer the work until we can nest the scope for a
case body under the scope for a pattern match.

This fixes SR-7973, a problem where it was impossible to inspect a case
binding in lldb when stopped at a case with multiple items.

Previously, we would emit the debug descriptions too early (in the
pattern match), leading to duplicate/conflicting descriptions. The only
reason that the ambiguous description was allowed to compile was because
the debug scopes were nested incorrectly.

rdar://41048339

* Update tests
2020-06-10 13:31:10 -07:00
Arnold Schwaighofer
28fba4f5e6 Merge pull request #32195 from aschwaighofer/dyn_repl_objc_method_generic_class
Mark non-foreign entry points of `@objc dynamic` methods in generic c…
2020-06-10 10:31:18 -07:00
David Zarzycki
9a3d863c71 Merge pull request #32238 from davezarzycki/pr32238
[SIL] NFC: Simplify SILVTable and save 8 bytes per SILVTable
2020-06-10 10:35:03 -04:00
David Zarzycki
dfe82be136 Merge pull request #32263 from davezarzycki/stop-being-a-sop
[SIL] NFC: "Stop being a sop"
2020-06-10 08:50:48 -04:00
David Zarzycki
017ee7bf04 [SIL] NFC: Simplify SILVTable and save 8 bytes per SILVTable
We were not using the primary benefits of an intrusive list, namely the
ability to insert or remove from the middle of the list, so let's switch
to a plain vector. This also avoids linked-list pointer chasing.
2020-06-10 07:54:23 -04:00
Arnold Schwaighofer
825a2a259b Mark non-foreign entry points of @objc dynamic methods in generic classes dynamically_replaceable
```
class Generic<T> {
  @objc dynamic func method() {}
}

extension Generic {
  @_dynamicReplacement(for:method())
  func replacement() {}
}
```

The standard mechanism of using Objective-C categories for dynamically
replacing @objc methods in generic classes does not work.

Instead we mark the native entry point as replaceable.

Because this affects all @objc methods in generic classes (whether there
is a replacement or not) by making the native entry point
`[dynamically_replaceable]` (regardless of optimization mode) we guard this by
the -enable-implicit-dynamic flag because we are late in the release cycle.

* Replace isNativeDynamic and isObjcDynamic by calls to shouldUse*Dispatch and
  shouldUse*Replacement
  This disambiguates between which dispatch method we should use at call
  sites and how these methods should  implement dynamic function
  replacement.

* Don't emit the method entry for @_dynamicReplacement(for:) of generic class
  methods
  There is not way to call this entry point since we can't generate an
  objective-c category for generic classes.

rdar://63679357
2020-06-09 09:23:29 -07:00
David Zarzycki
6c46118cfd [SIL] NFC: "Stop being a sop" 2020-06-09 10:51:03 -04:00
Erik Eckstein
1559fe333f SIL: a new library intrinsic to "finalize" array literals
For COW support in SIL it's required to "finalize" array literals.
_finalizeUninitializedArray is a compiler known stdlib function which is called after all elements of an array literal are stored.
This runtime function marks the array literal as finished.

  %uninitialized_result_tuple = apply %_allocateUninitializedArray(%count)
  %mutable_array = tuple_extract %uninitialized_result_tuple, 0
  %elem_base_address = tuple_extract %uninitialized_result_tuple, 1
  ...
  store %elem_0 to %elem_addr_0
  store %elem_1 to %elem_addr_1
  ...
  %final_array = apply %_finalizeUninitializedArray(%mutable_array)

In this commit _finalizeUninitializedArray is still a no-op because the COW support is not used in the Array implementation yet.
2020-06-08 10:24:29 +02:00
Dan Zheng
d3b6b89de6 [AutoDiff] Support multiple differentiability result indices in SIL. (#32206)
`DifferentiableFunctionInst` now stores result indices.
`SILAutoDiffIndices` now stores result indices instead of a source index.

`@differentiable` SIL function types may now have multiple differentiability
result indices and `@noDerivative` resutls.

`@differentiable` AST function types do not have `@noDerivative` results (yet),
so this functionality is not exposed to users.

Resolves TF-689 and TF-1256.

Infrastructural support for TF-983: supporting differentiation of `apply`
instructions with multiple active semantic results.
2020-06-05 16:25:17 -07:00
David Zarzycki
5f162eb1fa [SIL] NFC: Shrink SILGlobalVariable by 16 bytes 2020-06-05 07:24:25 -04:00
Joe Groff
9a61985d73 Merge pull request #32171 from jckarter/vtable-kind-validation
SIL: Verify kinds of vtable entries.
2020-06-04 09:18:54 -07:00
Michael Gottesman
0bed967ce7 [semantic-arc-opts] Create an explicit composition type for "ownership phi operands".
This is letting me refactor the implementation of every place that I work with
branches as "ownership phi operands" to instead work with
OwnershipPhiOperand. In a future commit, I am going to use this to add support
for optimizing structs and tuples that have multiple owned incoming values.

<rdar://problem/63950481>
2020-06-03 16:32:56 -07:00
Joe Groff
8538a2afcc SIL: Verify kinds of vtable entries.
Validate that inherited entries are not left at "normal" state, and that non-overridden entries do not in fact have
overrides.
2020-06-03 16:29:44 -07:00
Joe Groff
fb8bfce791 Merge pull request #32126 from jckarter/silvtable-nonoverridden-entries
Add a [nonoverridden] kind for SILVTable entries.
2020-06-02 10:57:00 -07:00
Joe Groff
564c1a5eec Add a [nonoverridden] kind for SILVTable entries.
This will let us track class methods that must exist for pass ordering, interface, or ABI reasons, but which can
be given more efficient runtime representation because they have no overrides.
2020-06-01 12:24:18 -07:00
Anthony Latsis
9fd1aa5d59 [NFC] Pre- increment and decrement where possible 2020-06-01 15:39:29 +03:00
Owen Voorhees
8b4d9ef3eb [Profiler] Don't use presumed line numbers for profiling 2020-05-26 11:19:30 -07:00
Owen Voorhees
45bc578ae5 [SourceManager] Rename line and column APIs for clarity 2020-05-21 12:54:07 -05:00
Slava Pestov
df954858f2 Merge pull request #31826 from theblixguy/fix/SR-12821
[TBDGen] Fix symbol mismatch for enum case constructors
2020-05-19 14:50:33 -04:00
Suyash Srijan
14a2d265ea [SIL] Use Limit::OnDemand for an enum element in SILDeclRef::getLinkage 2020-05-19 00:37:28 +01:00
Saleem Abdulrasool
cebe79d482 SIL: use object libraries instead of globbing
This simplifies the handling of the subdirectories in the SIL and
SILOptimizer paths.  Create individual libraries as object libraries
which allows the analysis of the source changes to be limited in scope.
Because these are object libraries, this has 0 overhead compared to the
previous implementation.  However, string operations over the filenames
are avoided.  The cost for this is that any new sub-library needs to be
added into the list rather than added with the special local function.
2020-05-18 18:56:34 +00:00
Marcel Hlopko
e293330563 [CxxInterop] Import C++ references. (#31784) 2020-05-15 10:42:37 +02:00
Erik Eckstein
7859ff8bf4 SIL: fix a use-list iteration problem in replacePhiArgumentAndReplaceAllUses() 2020-05-14 14:38:44 +02:00
Erik Eckstein
031ed87e20 SILPrinter: be more tolerant if an instruction is not contained in a parent block. 2020-05-14 14:38:44 +02:00
swift-ci
ec0b560209 Merge pull request #31728 from eeckstein/cow-instructions 2020-05-14 02:10:52 -07:00
Saleem Abdulrasool
6bf7593fd5 Revert "[CxxInterop] Import C++ references." (#31777) 2020-05-14 10:43:22 +02:00
Erik Eckstein
8f2632939a Builtins to support copy-on-write SIL instructions
* Builtin.COWBufferForReading -> ref_element_addr [immutable] / ref_tail_addr [immutable]
* Builtin.beginCOWmutation -> begin_cow_mutation
* Builtin.endCOWmutation -> end_cow_mutation
2020-05-14 08:39:54 +02:00
Erik Eckstein
f5a8f600ea SIL: new instructions for copy-on-write support
* a new [immutable] attribute on ref_element_addr and ref_tail_addr
* new instructions: begin_cow_mutation and end_cow_mutation

These new instructions are intended to be used for the stdlib's COW containers, e.g. Array.
They allow more aggressive optimizations, especially for Array.
2020-05-14 08:39:54 +02:00
swift-ci
f90e0306bf Merge pull request #31690 from hamishknight/guilt-by-association 2020-05-13 13:26:58 -07:00
Michael Forster
e69abeba53 Classify C++ structs as loadable or address-only (#31707)
* Classify C++ structs as loadable or address-only

C++ structs are only loadable if they are trivially copyable.

Resolves SR-12472.
2020-05-13 17:16:47 +02:00
Marcel Hlopko
30b5fd52e8 [CxxInterop] Import C++ references. (#31702) 2020-05-13 13:34:28 +02:00
David Zarzycki
58d163b4a9 Merge pull request #31528 from davezarzycki/pr31528
[SILOpt] Add ZeroInitializer to isValidStaticInitializerInst
2020-05-12 05:48:57 -04:00
David Zarzycki
9bd6b02f5c [SILOpt] Add ZeroInitializer to isValidStaticInitializerInst 2020-05-11 15:56:52 -04:00
Hamish Knight
574dd2bbf9 Use correct associated context for SIL parsing
Adjust `SILModule::createEmptyModule` to accept a
FileUnit or ModuleDecl, and pass the corresponding
context for SIL generation and parsing. This
change means that SIL parsing will now correctly
use a SourceFile associated context when in
single-file mode.
2020-05-10 20:36:07 -07:00