Commit Graph

9332 Commits

Author SHA1 Message Date
Michael Gottesman
5c9d7299b3 Put all of SILFunction verification into the SILVerifier.
This centralizes the code and also puts all of the verification code behind a
pretty stack trace.

Swift SVN r25984
2015-03-11 19:40:20 +00:00
Mark Lacey
fbc7b76614 Be more conservative about stripping upcasts in devirtualization.
This fixes two issues that I ran into with the devirtualizer and also
paves the path to more simplification of the devirtualizer code.

Both issues are due to having a very liberal definition of what can be
considered an upcast.

In one case, we tunnel through an unchecked_ref_cast and then fail to
devirtualize because the source type is not a class
type (rdar://problem/20115523). We would be better off sticking to the
class type we started with.

In the other case, we tunnel through an unchecked_ref_bit_cast and this
results in an attempt to insert a checked_cast_br between unrelated
types (rdar://problem/20117782).

Swift SVN r25976
2015-03-11 08:25:51 +00:00
Mark Lacey
92a85f00f9 Move isClassOrClassMetatype into SILType.h.
This will be useful for further devirtualizer clean-up.

Swift SVN r25974
2015-03-11 08:25:48 +00:00
Joe Groff
962a87f444 SIL: Rename address-only existential instructions to '{init,deinit,open}_existential_addr'.
For better consistency with other address-only instruction variants, and to open the door to new exciting existential representations (such as a refcounted boxed representation for ErrorType).

Swift SVN r25902
2015-03-09 23:55:31 +00:00
Erik Eckstein
8795202be3 Removed a wrong check for init_existential in the SIL verifier.
Fixes rdar://problem/20062883



Swift SVN r25878
2015-03-09 08:28:38 +00:00
Ted Kremenek
9e7471d68b Revert "Revert "Rework processing of @noescape closures a bit to fix rdar://19981118:""
Turns out llvm::DataLayoutPass is used in other places, so the bots are still unhappy.
Re-applying the original change so we can fix the problem holistically.

Swift SVN r25761
2015-03-04 20:15:45 +00:00
Ted Kremenek
6781ac7bec Revert "Rework processing of @noescape closures a bit to fix rdar://19981118:"
This is breaking the testing bot because DataLayoutPass was just removed from LLVM trunk.
Chris is the best one to fix this change, but we need to get the bots green.

Swift SVN r25760
2015-03-04 20:03:33 +00:00
Chris Lattner
ab43e444d6 Rework processing of @noescape closures a bit to fix rdar://19981118:
- Have Sema, not SILGen decide if a vardecl can be captured by address
  instead of by-box.  This is a non-local property that is best computed
  during capture set formation.  Sema captures this as a bit on the new
  CapturedValue entry.
- Rework some diagnostic emission to centralize a class of noescape 
  diagnostics in capture set calculation.  Previously, funcdecl closures
  produced their diagnostics there, but ClosureExprs produced them in
  MiscDiagnostics (NFC for this part).

This fixes <rdar://problem/19981118> Swift 1.2 beta 2: Closures nested in @noescape closures copy, rather than reference, captured vars.



Swift SVN r25759
2015-03-04 19:30:36 +00:00
Chris Lattner
feb350f201 rename CaptureKind::NoEscape -> CaptureKind::StorageAddress,
since the CaptureKind enum names describe "what happens", not
"why they are formed".  NFC.



Swift SVN r25750
2015-03-04 06:27:02 +00:00
Chris Lattner
83009065f8 - Rework computation of "direct" closure capture formation to be based on whether
the DeclRefExpr's access semantics is "direct to storage" instead of basing it
  on the weird special case we were using before.
- Change AST dumper to print the "direct" flag.

NFC.



Swift SVN r25749
2015-03-04 06:17:40 +00:00
Arnold Schwaighofer
951dc2875a Nuke isSideEffectFree
We can now compute the same result with Inst.mayHaveSideEffects(). NFC.

Swift SVN r25742
2015-03-04 05:03:44 +00:00
Chris Lattner
3489840b8d rework our representation of capture lists to compute the "isDirect" bit up front
when computing the list.  This simplifies getLocalCaptures to *just* filter out
global captures, and paves the way for other enhancements.  NFC.


Swift SVN r25739
2015-03-04 01:56:48 +00:00
Arnold Schwaighofer
5113456d40 Verifier: The alloc_stack stack does not need to be consistent on purely unreachable paths.
When we clone loops with exit blocks that are unreachable the verifier
complained before this patch.

loop:
  = alloc_stack
  cond_br %overflow_cond, loop_latch, unreachable_only_exit

loop_latch:
  cond_br  loop, exit

unreachable_only_exit:
  ..
  unreachable

We don't care about stack deallocation on paths that must lead to
unreachable.

The alternative to weaken the verifier for cases like this would be to clone
loop exits that are guaranteed to lead to unreachable which would be a waste of
space.

Swift SVN r25732
2015-03-04 01:06:25 +00:00
Mark Lacey
a9181b08ce Make witness/vtable look-up helper naming more consistent.
Swift SVN r25713
2015-03-03 09:14:18 +00:00
Roman Levenstein
6047ec5547 Handle types conforming to _BridgedToObjectiveC protocol in a special way during cast folding.
This fixes the broken build of validation suite.

Swift SVN r25710
2015-03-03 06:03:54 +00:00
Arnold Schwaighofer
cf090c2795 Handle memory behavior of BuiltinInst and FunctionRefInst in SILInstruction
Extend SILInstruction::getMemoryBehavior to check BuiltinInfo, llvm::Attribute,
and EffectsKind.

Swift SVN r25696
2015-03-03 00:45:55 +00:00
Roman Levenstein
a4055afc15 Third part of the cast folding and type-casts re-factoring. Addressing JoeG's comments.
This patch does the following:
- Improvements and correctness fixes for conversions of existential metatypes. They may succeed if you have a concrete or existential metatype that conforms to the protocol. Based on Joe's review of my previous patch.
- Removes special-cases for AnyObject. AnyObject is handled as any other class existential.
- Improves folding of conversions from class existential metatypes to concrete non-class metatypes
- Improves comments.
- Adds more tests to cover new test-cases.
- Adjusts a few existing tests.

Swift SVN r25690
2015-03-02 22:28:21 +00:00
Roman Levenstein
62cc75f4f1 Fix a small bug in getAnyMetatypeDepth.
getAnyMetatypeDepth was looping over the chain of metatypes, but it was not actually counting the depth.

Swift SVN r25689
2015-03-02 22:28:19 +00:00
Joe Groff
e78b82e666 SIL: Use block ownership conventions for C function pointer parameters.
Swift SVN r25660
2015-03-01 19:40:12 +00:00
Joe Groff
283cf06065 SIL: Don't try to bridge C function pointer types.
Since they have no context parameter, we can't freely convert them to or from native function types like we can blocks.

Swift SVN r25659
2015-03-01 19:40:10 +00:00
Joe Groff
5fa20867e9 SILGen: Implement thunking for C function pointer conversions.
If we have a C function pointer conversion, generate a thunk using the same logic we use for ObjC method thunks, and emit a pointer to that thunk as the C function pointer value. (This works for nongeneric, nonmember functions; generics will additionally need to apply generic parameters within the thunks. Static functions would need to gather the metatype as well.)

Swift SVN r25653
2015-03-01 06:18:58 +00:00
Arnold Schwaighofer
a95eefb934 Add a utility function to Operand to hoist projections rooted in an operand to
an earlier point.

Swift SVN r25618
2015-02-27 22:07:38 +00:00
Roman Levenstein
c199905a2f Second part of the cast folding and type-casts re-factoring.
This patch does the following:
- Moves the logic for handling special-case of converting to/from AnyObject.Protocol (and existential.Protocol in general) into DynamicCasts, where all other cases are handled already.
- Moves the peephole which was folding checked_cast_br into an unchecked cast and branch from sil-combine into sil-simplify-cfg, because it is a better place for it, since this peephole affects the CFG. The corresponding test is also moved from sil_combine.sil into simplify_cfg.sil.
- Adds a few checked_cast_br peepholes to sil-combine.   They try to simplify checked_cond_br instructions using existential metatypes by propagating a concrete type whenever it can be determined statically.
- Adds a new test with a lot of test-cases that make sure we are really folding many type-checks at compile-time now.

Swift SVN r25504
2015-02-24 17:31:08 +00:00
Roman Levenstein
c97f748fb9 Move the logic for folding type casts using statically known protocol conformances into DynamicCasts.cpp.
The logic for different special cases of type casting is spread over multiple places currently. This patch simply re-factors some of that  code (folding of of type casts using statically known protocol conformances) and moves it into one central place, which makes it easier to maintain. Plus, it allows other clients of DynamicCasts benefit from it as well, e.g. the inliner can use this now. NFC.

Swift SVN r25486
2015-02-23 21:30:48 +00:00
Joe Groff
4c67543508 SIL: Type lowering for C function pointer types.
Lower them to @thin @cc(cdecl) function values.

Swift SVN r25477
2015-02-22 19:53:07 +00:00
Joe Groff
5559baf507 Tweak the SIL verifier to dump the whole function on verifier failures.
And use requireSameType in some places where it makes sense.

Swift SVN r25451
2015-02-21 01:33:41 +00:00
Justin Bogner
322005d027 InstrProf: Track the filename in coverage maps
If multiple swift files are compiled together, then guessing as to the
file when we emit IR obviously doesn't work. Find the filename when we
generate a function's coverage map and propagate it through SIL.

Swift SVN r25436
2015-02-20 21:26:20 +00:00
Justin Bogner
3dbd6ea9bd InstrProf: SILFunction doesn't live long enough for SILCoverageMap
Keeping a reference to the function here is dangerous. We only
actually care about the name, so save ourselves a copy of that
instead.

This fixes a crash that seems to happen only when the coverage data is
very large.

Swift SVN r25433
2015-02-20 19:36:33 +00:00
Joe Groff
041d7f57a1 PredictableMemOpt: Don't touch structs with unreferenceable storage.
We can't safely decompose them into elements because we don't have access to them all. Fixes rdar://problem/19870485.

Swift SVN r25368
2015-02-18 03:29:51 +00:00
Joe Groff
372936efb1 SIL: Verify that "struct" instructions aren't used to build structs with unreferenceable storage.
We don't have enough structural information about these structs to build a value from elements. Part of rdar://problem/19807099.

Swift SVN r25367
2015-02-18 02:40:16 +00:00
Michael Gottesman
6f8b468cb6 Change switches and selects to use NullablePtr<EnumElementDecl> instead of EnumElementDecl * when their API explicitly requires the user to check for nullptr. NFC.
This is just good to do and hopefully will help prevent people from forgetting
to check in the future by annotating the API explicitly as returning a
potentially nullptr.

Swift SVN r25364
2015-02-18 02:11:57 +00:00
Adrian Prantl
45544727ac Mark reabstraction thunk helpers as auto-generated.
Fixes <rdar://problem/18670152> Stack trace is a lie.

Swift SVN r25362
2015-02-18 00:46:25 +00:00
Michael Gottesman
77b2e21eb5 Move buildForwardingSubstitutions onto GenericParamList::getForwardingSubstitutions(). NFC.
Swift SVN r25358
2015-02-17 23:01:02 +00:00
Michael Gottesman
617ea48e8b Refactor getForwardingSubstitutions onto SILFunction. NFC.
This is also useful in general SIL passes when generating thunks. I am going to
use this in function signature optimization and closure specialization.

Swift SVN r25356
2015-02-17 21:03:24 +00:00
Michael Gottesman
4cb9eb72f4 [rc-id] Ensure that the reforming enum analysis properly handles no-payload incoming values.
One common problem in swift code is the "reforming enum problem". What
happens here is that we have some enum %0 : $Optional<T> and we break it
apart and reform it as a new enum as in the following:

   bb9:
     ...
     switch_enum %0 : $Optional<T>, #Optional.None: bb10,
                                    #Optional.Some: bb11

   bb10:
     %1 = enum $Optional<U>, #Optional.None
     br bb12(%1 : $Optional<U>)

   bb11:
     %2 = some_cast_to_u %0 : ...
     %3 = enum $Optional<U>, #Optional.Some, %2 : $U
     br bb12(%3 : $Optional<U>)

   bb12(%4 : $Optional<U>):
     retain_value %0 : $Optional<T> // id %5
     release_value %4 : $Optional<U> // id %6

We really would like to know that a retain on %4 is equivalent to a
retain on %0 so we can eliminate the retain, release pair. To be able to
do that safely, we need to know that along all paths %0 and %4 either:

1. Both refer to the same RCIdentity directly. An example of this is the
edge from bb11 -> bb12).
2. Both refer to the "null" RCIdentity (i.e. do not have a payload). An
example of this is the edge from bb10 -> bb12.

Only in such cases is it safe to match up %5, %6 and eliminate them. If
this is not true along all paths like in the following:

   bb9:
     ...
     cond_br %foo, bb10, bb11

   bb10:
     %1 = enum $Optional<U>, #Optional.None
     br bb12(%1 : $Optional<U>)

   bb11:
     %2 = some_cast_to_u %0 : ...
     %3 = enum $Optional<U>, #Optional.Some, %2 : $U
     br bb12(%3 : $Optional<U>)

   bb12(%4 : $Optional<U>):
     retain_value %0 : $Optional<T> // id %5
     release_value %4 : $Optional<U> // id %6

then we may have that %0 is always non-payloaded coming into bb12. Then
by matching up %0 and %4, if we go from bb9 -> bb11, we will lose a
retain.

Perf Changes:

TITLE..................OLD...........NEW...........NEW/OLD
LevenshteinDistance....1398195.00....1177397.00....0.84
Memset.................26541.00......23701.00......0.89
CaptureProp............5603.00.......5031.00.......0.90
ImageProc..............1281.00.......1196.00.......0.93
InsertionSort..........109828.00.....104129.00.....0.95
StringWalk.............6813.00.......7456.00.......1.09
Chars..................27182.00......30443.00......1.12

The StringWalk, Chars are both reproducible for me. When I turn back on parts of
the recursion (I took the recursion out to make this change more conservative),
the Chars regression goes away, but the StringWalk stays. I have not had a
chance to look at what is going on with StringWalk.

rdar://19724405

Swift SVN r25339
2015-02-17 01:30:19 +00:00
Dmitri Hrybenko
61286f0260 Fix warnings produced by a newer version of Clang
Swift SVN r25257
2015-02-12 23:50:47 +00:00
Justin Bogner
59bb06b0fb InstrProf: SIL-level coverage mapping and lowering to LLVM
The adds the sil_coveragemap construct to SIL and the needed IRGen to
turn these into LLVM's coverage maps.

Swift SVN r25210
2015-02-12 00:28:39 +00:00
Joe Groff
c88f945c8c Revert "SIL: Don't descend into nominal types' parents to determine linkage."
This reverts commit r25191. Jordan notes that it is not correct for this function to disregard generic parameters.

Swift SVN r25192
2015-02-11 20:48:19 +00:00
Joe Groff
8c9f7a664d SIL: Don't descend into nominal types' parents to determine linkage.
A type in an extension doesn't inherit linkage from its parent. In particular, if an extension adds a nested type to an imported class, we don't want that nested type to have unique linkage. Fixes rdar://problem/19792174.

Swift SVN r25191
2015-02-11 20:16:45 +00:00
Doug Gregor
20bc247494 Use unified logic for determining whether a subscript index is bridged to an object type.
Fixes rdar://problem/19772357.

Swift SVN r25145
2015-02-10 23:56:07 +00:00
Joe Groff
6e59195933 SILGen: Don't emit vtable entries for willSet/didSet.
Observers shouldn't ever be ABI. Fixes rdar://problem/19777115.

Swift SVN r25119
2015-02-10 05:12:51 +00:00
Joe Groff
c250055546 SIL: Print willSet and didSet SILDeclRefs.
These should never happen, but they are happening (rdar://problem/19777115), and not being able to print them when they do occur makes debugging onerous.

Swift SVN r25118
2015-02-10 04:30:40 +00:00
Joe Groff
96303f4c7f SIL: Factor the vtable override logic from SILGen into a method on SILDeclRef.
rdar://problem/19514920 is caused by a disagreement between IRGen and SILGen about which SILDeclRefs override vtable slots. Factor out the somewhat-hairy code in SILGen to a place IRGen will be able to share it. NFC yet.

Swift SVN r25063
2015-02-07 02:01:37 +00:00
Arnold Schwaighofer
fe885cff6f Fix isSelf() function in SILArgument
Check that we are the last argument in the list.

Swift SVN r25029
2015-02-06 01:23:41 +00:00
Michael Gottesman
7acd7def16 [verifier] Make sure that applies of no-return functions have an unreachable as the next instruction.
This makes it easy to find no-return functions since one must iterate
through all BB with unreachable terminators and check the previous
instruction.

Swift SVN r25004
2015-02-05 19:11:33 +00:00
Erik Eckstein
9dfd349faf Add a new Thunk-flag in SILFunction which specifies that a function is a thunk.
This will have an effect on inlining into thunks.
Currently this flag is set for witness thunks and thunks from function signature optimization.
No change in code generation, yet.



Swift SVN r24998
2015-02-05 16:45:05 +00:00
Joe Groff
d523ad07e6 SIL: Don't lower the @noescape attribute from the AST to SILFunctionType.
@noescape may be interesting to passes in the future, but it currently has no effect except to cause symbol collisions in reabstraction thunks and other places. Since it has no effect, just remove it from SIL for now.

Swift SVN r24925
2015-02-03 20:35:05 +00:00
Jordan Rose
2969aab1c1 Stop giving local types private linkage; the debugger may still access them.
Instead, just fall through to the normal public/internal/private switch
added in the previous commit. Local declarations are always private.

Make sure we emit all local declarations by using the list in the SourceFile,
rather than walking the AST (which missed a few cases and was less efficient
anyway).

As an exception, declarations without accessibility at all still get private
linkage. These are things like local variables that don't get accessed by
symbol, even when using the debugger.

rdar://problem/19623016

Swift SVN r24839
2015-01-30 03:54:07 +00:00
Jordan Rose
014fd87928 Treat private type declarations as "hidden" in SIL (rather than public).
Easy cut down on exported symbols. Unless a private type is referenced in
an inlineable function, there's no way to generate a reference to it
outside of the current file, except in the debugger. (That last bit is why
we can't use fully private linkage, which would keep the symbol out of the
symbol table completely.)

We should be doing this for "internal" declarations as well, but the
standard library /does/ have references to internal types in inlineable
functions, and also has tests that directly access these types.

Swift SVN r24838
2015-01-30 03:54:04 +00:00
Joe Groff
3fa9f6e1de Fill in unreachable case of printFullContext.
rdar://problem/19641563

Swift SVN r24811
2015-01-29 02:02:18 +00:00