Commit Graph

2401 Commits

Author SHA1 Message Date
Slava Pestov
7fdada8ee5 SIL: Add SILFunction::mapTypeOutOfContext(), NFC 2016-02-19 18:53:28 -08:00
Adrian Prantl
8e1d6c013b Make SILDebugLocation a value member of SILInstruction again.
The overhead of uniquing the locations in a Densemap isn't worth any of
the potential memory savings: While this adds an extra pointer and
unsigned to each SILInstruction, any extra memory is completely lost in
the noise (measured on a release -emit-ir build of the x86_64 stdlib).
This is not too surpising as the ratio between SILInstructions and unique
SILLocations is not very high and the DenseMap also needs space.

<rdar://problem/22706994>
2016-02-19 13:41:54 -08:00
Adrian Prantl
40c7a1abee Separate underlying storage and location kind in SILLocation and
remove the mixed concept that was SILFileLocation.
Also add support for a third type of underlying storage that will be used
for deserialized debug lcoations from textual SIL.

NFC

<rdar://problem/22706994>
2016-02-19 11:16:48 -08:00
Dmitri Gribenko
0f36bec31f Merge remote-tracking branch 'origin/master' into swift-3-api-guidelines 2016-02-18 16:41:35 -08:00
John McCall
e249fd680e Destructure result types in SIL function types.
Similarly to how we've always handled parameter types, we
now recursively expand tuples in result types and separately
determine a result convention for each result.

The most important code-generation change here is that
indirect results are now returned separately from each
other and from any direct results.  It is generally far
better, when receiving an indirect result, to receive it
as an independent result; the caller is much more likely
to be able to directly receive the result in the address
they want to initialize, rather than having to receive it
in temporary memory and then copy parts of it into the
target.

The most important conceptual change here that clients and
producers of SIL must be aware of is the new distinction
between a SILFunctionType's *parameters* and its *argument
list*.  The former is just the formal parameters, derived
purely from the parameter types of the original function;
indirect results are no longer in this list.  The latter
includes the indirect result arguments; as always, all
the indirect results strictly precede the parameters.
Apply instructions and entry block arguments follow the
argument list, not the parameter list.

A relatively minor change is that there can now be multiple
direct results, each with its own result convention.
This is a minor change because I've chosen to leave
return instructions as taking a single operand and
apply instructions as producing a single result; when
the type describes multiple results, they are implicitly
bound up in a tuple.  It might make sense to split these
up and allow e.g. return instructions to take a list
of operands; however, it's not clear what to do on the
caller side, and this would be a major change that can
be separated out from this already over-large patch.

Unsurprisingly, the most invasive changes here are in
SILGen; this requires substantial reworking of both call
emission and reabstraction.  It also proved important
to switch several SILGen operations over to work with
RValue instead of ManagedValue, since otherwise they
would be forced to spuriously "implode" buffers.
2016-02-18 01:26:28 -08:00
Xin Tong
b69706734d Implement @owned to @unowned retain value conversion.
If a value is returned as @owned, we can move the epilogue retain
to the caller and convert the return value to @unowned. This gives
ARC optimizer more freedom to optimize the retain out on the caller's
side.

It appears that epilgue retains are harder to find than epilogue
releases. Most of the time they are not in the return block.

(1) Sometimes, they are in predecessors
(2) Sometimes they come from a call which returns an @owned return value.
This should be improved if we fix (1) and go bottom up.
(3) We do not handle exploded retain_value.

Currently, this catches a small number of opportunities.

We probably need to improve epilogue retain matcher if we are to handle
more cases.

This is part of rdar://24022375.

We also need some refactoring in the pass. e.g. break functions into smaller
functions. I will do with subsequent commit.
2016-02-17 21:59:55 -08:00
Dmitri Gribenko
dd75aed67a Merge remote-tracking branch 'origin/master' into swift-3-api-guidelines 2016-02-17 14:40:05 -08:00
Slava Pestov
cb3ddc2200 SIL: Fix type lowering to correctly handle concrete same-type constraints
When a dependent type is mapped into context, the result will either be
an archetype or a concrete type. The latter occurs if a same-type
constraint exists between the dependent type and the concrete type.

The logic to decide if a type should be passed directly or indirectly
was not handling this case if an interface type was passed down -- we
would just check if there was a class constraint present.

This resulted in mismatching conventions between an interface type and
its corresponding contextual type, which would trigger assertions.

Note that same-type constraints between generic parameters and concrete
types are still not supported for other reasons; the subject of the
constraint must still be an associated type of a generic parameter.

Fixes <rdar://problem/24687460>.
2016-02-17 00:22:03 -08:00
Xin Tong
99ca08e4af Check whether epilogue releases cover all non-trivial fields.
When we have all the epilogue releases. Make sure they cover all the non-trivial
parts of the base. Otherwise, treat as if we've found no releases for the base.

Currently. this is a NFC other than epilogue dumper. I will wire it up with
function signature with next commit.

This is part of rdar://22380547
2016-02-15 16:00:02 -08:00
Max Moiseev
3a3984877a Merge remote-tracking branch 'origin/master' into swift-3-api-guidelines 2016-02-15 15:43:34 -08:00
Arnold Schwaighofer
525f8ecbe1 Update the zombie function list if we create new functions
Dead function elimination deletes functions making them zombies. A zombie is a
function whose name only exists because debug info might still refer to it.

However, later passes of specialization might create a new function by the same
name again. We now have a zombie function (which is just an alias to a deleted
method stub) and a function definition.

No test case since I could not reduce this to a small test case.

rdar://24659988
2016-02-15 12:58:19 -08:00
Xin Tong
4f66bc88b4 Move ProjectionTree::isRedundantRelease to ConsumedArgToEpilogueReleaseMatcher::isRedundantRelease.
NFC.
2016-02-15 10:22:47 -08:00
Xin Tong
715b818a70 Modify computeSubSeqRelation to return true when both paths are empty.
Note: this is not the same as one path does not have value. A path can have no
value when we can not find a projection path between Base and Derived.

If we've found paths for both projections, and they turn'ed out to be both empty.
Its safe to say that they are accessing the same fields in the object.

I failed to create a test case as the changed code is currently not reached with
the current way we use it.

But it will be used as i use projection to do more analysis on epilogue release
matcher.
2016-02-15 09:44:28 -08:00
Erik Eckstein
c3321f4d35 SIL: verify that only loadable types are loaded and stored. 2016-02-15 08:36:55 -08:00
Xin Tong
40ff0895d6 Improve epilogue release matcher to handle exploded release_value.
So instead of only being able to match %1 and release %1 in (1). we
can also match %1 with (release %2, and release%3, i.e. exploded release_value)
in (2).

(1)
foo(%1)
  strong_release %1

(2)
foo(%1)
  %2 = struct_extract %1, field_a
  %3 = struct_extract %1, field_b
  strong_release %2
  strong_release %3

This will allow function signature to better move the release instructions to
the callers.

Currently, this is a NFC other than testing using the epilogue match dumper.
2016-02-12 15:22:13 -08:00
Daniel Duan
efe230774b [AST] rename some isXXX methods to getAsXXX
There's a group of methods in `DeclContext` with names that start with *is*,
such as `isClassOrClassExtensionContext()`. These names suggests a boolean
return value, while the methods actually return a type declaration. This
patch replaces the *is* prefix with *getAs* to better reflect their interface.
2016-02-11 16:23:40 -08:00
Xin Tong
81c69fee4d Rename LeafIndices to LiveLeafIndices in ProjectionTree. NFC 2016-02-11 09:56:06 -08:00
Daniel Duan
ea5227acbd use proper compilation marker in typelowering 2016-02-10 19:31:28 -08:00
Slava Pestov
5c97b21598 Merge pull request #1253 from dduan/delete_typelowering_dead_code
early exit in TypeLowering for address-only type
2016-02-10 19:20:12 -08:00
Daniel Duan
9203f204bd early exit in TypeLowering for address-only type
The logic that detects type circularity in TypeLowering has been replaced in
Sema. By exiting as soon as an address-only type is detected, we can avoid
walking the rest and gain some speedup.
2016-02-10 15:48:28 -08:00
Xin Tong
d59d567a77 Clean up the newly created Projection. NFC.
- Update comments.
- Correct 80 col violations mostly due to renaming NewProjection to Projection.
- Remove dead functions
2016-02-10 14:46:08 -08:00
Xin Tong
84a6ff1d98 And lastly rename NewProjection to Projection. This is a NFC. rdar://24520269 2016-02-09 22:20:10 -08:00
Xin Tong
042c6e033d And finally get rid of old projection. This is a NFC. rdar://24520269 2016-02-09 22:20:10 -08:00
Xin Tong
d9671f5b0e Migrate SILCombiner to new projection. This should be a NFC 2016-02-09 22:20:09 -08:00
Xin Tong
da393a098f Eliminate 1 more projection use that i missed. This should be a NFC 2016-02-09 22:20:09 -08:00
Xin Tong
111af0322f Using ProjectionTree to create NewProjectionTree and wire NewProjectionTree up
with function signature optimizations to make sure it passes some basic testing.

We are one step closer to get rid of the old projection.
2016-02-09 22:20:09 -08:00
Xin Tong
51e89de905 [function-signature-opt] Explode argument level by level and lazily.
Previously, we exploded argument to the most-derived fields, i.e. the field that
can no longer be exploded further. And in the spliced (newly created) function,
we form aggregates if necessary.

Changing this to explode only to the deepest level accessed, this enables us to
create the projection tree nodes for fields of which its level is accessed, instead of
all fields on all levels.

Note: this also changes the definition of a leaf node. Leaf node now means the node
which does not have children based on current explosion (it however could have children
if exploded further).

I am refining the old projection tree first before (mostly copying) it to create the
new projection tree.
2016-02-09 14:52:10 -08:00
Slava Pestov
073df63502 SIL: Remove some macros that were dead since the interface type transition, NFC 2016-02-09 13:30:14 -08:00
Adrian Prantl
5dd6e6f5f4 Move the functionality to extract the debug location from a SILLocation
into SILLocation, since this will become useful for serialization.

NFC

<rdar://problem/22706994>
2016-02-09 11:58:15 -08:00
Jordan Rose
83360d85c3 Merge pull request #1204 from jrose-apple/TrailingObjects
Adopt llvm::TrailingObjects where relevant/useful.
2016-02-09 11:37:43 -08:00
Adrian Prantl
2e8f8c540a Remove commented-out code. 2016-02-09 09:50:07 -08:00
Jordan Rose
3b226cd287 [SIL] Adopt llvm::TrailingObjects where it makes sense for SIL instructions.
SIL already has a pretty good infrastructure for tail-allocated operands, although
it's not enforced in any way. SwitchEnumInstBase would also benefit from this if
we were willing to make it a template, or if we had a way to override the 'final'
requirement on llvm::TrailingObjects.
2016-02-09 08:57:19 -08:00
Erik Eckstein
719bf32f3d SILPrinter: in verbose SIL output print the original functions or inlined instructions. 2016-02-09 08:51:47 -08:00
Erik Eckstein
c0cdbc4510 SILPrinter: only print simplified demangled names in comments.
For long names this is easier to read and in most cases the omitted information can be seen in the actual SIL code.
With the option -Xllvm -sil-full-demangle the old behavior can be restored.
2016-02-09 08:51:47 -08:00
Xin Tong
335dcdaf8c This moves back the Linker.h to lib/SIL/. As per LLVM coding standard,
Headers in include/ are meant to be used across libraries, headers in lib/
are only used within that library.

Thanks @jrose-apple for pointing this out.
2016-02-09 06:29:58 -08:00
Slava Pestov
6f7701481c Merge pull request #1075 from dduan/sema_circularity_pr
[Sema] implement better type circularity check
2016-02-08 11:04:28 -08:00
Xin Tong
06ff2e60f5 Reorder headers. NFC 2016-02-07 23:21:48 -08:00
Daniel Duan
5242b67476 [Sema] implement better type circularity check
Certain type circularities weren't being checked until this point. Such as

```
struct X<T> { let a: X<X> }
struct Y<T> { let a: (Int, Y<Y>) }
enum Z<T> { case A(Optional<Z<Z>>) }
```

We introduce a more comprehensive approach to detect these in type checker.
After name lookup, exam each value field in declared structs and enums for
self-reference types that creates inifinite sizes.
2016-02-07 22:10:42 -08:00
Xin Tong
b97ff7fb6b Move Linker.h to include/swift/SIL/. NFC. 2016-02-07 22:09:47 -08:00
Xin Tong
17e3f35758 Migrate to use new projection for PerformanceInliner. This should be a NFC.
This is part of rdar://24520269
2016-02-07 13:56:12 -08:00
Xin Tong
0258e8e816 Migrate to use new projection for SimplifyCFG. This should be a NFC.
This is part of rdar://24520269
2016-02-06 08:27:05 -08:00
Chris Lattner
526d4f3311 Merge pull request #1221 from practicalswift/typo-fixes-20160206
[gardening] Fix recently introduced typos: "gnerates" → "generates", "overrideable" → "overridable"
2016-02-06 08:20:33 -08:00
practicalswift
b4996d3e0f [gardening] Fix recently introduced typo: "gnerates" → "generates" 2016-02-06 10:41:30 +01:00
practicalswift
5695545c7d [gardening] Use standard file header format in recently added file. 2016-02-06 10:23:56 +01:00
Slava Pestov
96a2bff5d4 SIL: Correctly set IsDeclaration in SILDefaultWitnessTables
This was triggered in Evolution/test_struct_resilient_add_conformance.swift.
2016-02-05 22:34:49 -08:00
Slava Pestov
bbbe307980 SIL: Introduce SILDefaultWitnessTable and start plumbing
This will be used to help IRGen record protocol requirements
with resilient default implementations in protocol metadata.

To enable testing before all the Sema support is in place, this
patch adds SIL parser, printer and verifier support for default
witness tables.

For now, SILGen emits empty default witness tables for protocol
declarations in resilient modules, and IRGen ignores them when
emitting protocol metadata.
2016-02-05 20:57:11 -08:00
Adrian Prantl
b6a7d6906a Debug Info: Fix the lowering of the SILDebugScope tree to the LLVM
inlined-at chain.

The previous implementation was only correct for cases where the inliner
inlined bottom-up in the call graph, which happened to cover the majority
of all cases.

rdar://problem/24462475
2016-02-05 13:53:34 -08:00
Slava Pestov
b9951ade1b SIL: Rename some identifiers, NFC
"VTableLookupTable" just doesn't look right to me.
2016-02-04 17:34:55 -08:00
Max Moiseev
61c837209b Merge remote-tracking branch 'origin/master' into swift-3-api-guidelines 2016-02-04 16:13:39 -08:00
Xin Tong
ae86ef2b72 Implement more conservative debugging value support on function arguments in
function signature opt.

Instead of replacing %1 with UNDEF in debugvalueinst %1, we form an aggregate,
taking the alive part of %1 and fill the dead part with undef.

rdar://23727705
2016-02-04 10:50:26 -08:00