Commit Graph

1473 Commits

Author SHA1 Message Date
John McCall
ed0681004c Remove the almost-pointless Materialize type from SILGen,
and stop forcing optionals to memory in a bunch of places
where the callee is perfectly capable of handling a
non-address value.

Swift SVN r30107
2015-07-11 02:58:49 +00:00
Justin Bogner
086c2d49ea InstrProf: Handle IfExpr correctly for coverage maps
We were creating counters for IfExpr coverage, but weren't actually
mapping these when emitting coverage. Handle this.

rdar://problem/21720161

Swift SVN r29971
2015-07-08 07:17:08 +00:00
Slava Pestov
942b44d2e2 SILGen: Fix comment wording I found while reading code, NFC
Swift SVN r29911
2015-07-04 01:53:31 +00:00
Joe Groff
6e30d61f58 SILGen: Reabstract values when passing by pointer to C functions.
This allows the value to be cast to an UnsafePointer type and correctly loaded out in all cases. In particular, this lets you pass a Swift closure by pointer as the context parameter to a C function pointer, allowing callback-based C APIs to be more conveniently wrapped. Fixes rdar://problem/21505805.

Swift SVN r29904
2015-07-03 00:38:06 +00:00
Doug Gregor
b646af0ec2 Eliminate some unnecessary uses of getAllArchetypes(). NFC
Swift SVN r29843
2015-07-01 18:14:52 +00:00
Slava Pestov
a64d505a98 SILGen: Fix some problems when generating delegating init calls
- If delegating to an initializing constructor for a value type,
  the ApplyInst takes an @out parameter for Self, instead of
  returning Self like with references. Fix the def-use traversal
  to handle that instead of crashing.

- When calling an allocating constructor, the formal type is
  the instance type because Sema constructs the constructor call
  as if it were an initializing constructor. This causes us to
  fail to re-abstract a @thin metatype to @thick. Fix this to
  use the correct metatype type for allocating constructors.

Fixes <rdar://problem/20945954>.

Swift SVN r29555
2015-06-22 22:26:17 +00:00
Joe Groff
d84993108b SILGen: Emit Clang-imported witness tables by need too.
The other part of rdar://problem/21444126. This is a little trickier since SIL doesn't track uses of witness tables in a principled way. Track uses in SILGen by putting a "SILGenBuilder" wrapper in front of SILBuilder, which marks conformances from apply, existential erasure, and metatype lookup instructions as used, so we can avoid emitting shared Clang importer witnesses when they aren't needed.

Swift SVN r29544
2015-06-22 03:08:41 +00:00
Mark Lacey
75b5b1248e Small clean-up. Add createUncheckedBitCast to SILBuilder.
This new method eliminates repeated code sequences that all create an
unchecked_trivial_bit_cast if the result type is trivial or
unchecked_ref_bit_cast otherwise.

NFC.

Swift SVN r29486
2015-06-18 07:30:42 +00:00
Nadav Rotem
f345ca33fd Fix unused variable warnings in Release builds.
Swift SVN r29367
2015-06-12 18:27:26 +00:00
Joe Groff
29bacaf3ad typo
Swift SVN r29342
2015-06-08 04:11:06 +00:00
Joe Groff
0303d4ee51 SILGen: Project 'let' properties from address-only structs at the proper abstraction level.
Fixes rdar://problem/19297122.

Swift SVN r29333
2015-06-06 03:25:50 +00:00
Slava Pestov
7319a97ab4 Sema: Rewrite witness method calls as ApplyExpr + DeclRefExpr
Special-casing these as MemberRefExprs created an asymmetry
where unbound archetype instance methods (<T : P> T.f) could
not be represented. Treating class and protocol methods
uniformly also eliminates a handful of special cases around
MemberRefExpr.

SILGen's RValue and call emission peepholes now have to know
about DeclRefExprs that point to protocol methods.

Finally, generalize the diagnostic for partially applied
mutating methods to any partially applied function with an
inout parameter, since this is not supported.

Fixes <rdar://problem/20564672>.

Swift SVN r29298
2015-06-04 15:57:58 +00:00
John McCall
ccc6e55021 Zero out the 'self' box immediately before the delegating
call in order to make delegations to throwing initializers work.

Fixes <rdar://20861374>.

Swift SVN r28864
2015-05-21 00:45:08 +00:00
John McCall
f0f8787b0f Generalize the 'transparent' flag passed around to
various emitApply routines.  NFC.

Swift SVN r28720
2015-05-18 20:30:12 +00:00
Chris Lattner
e517ad9182 Fix unreachable code handling to properly diagnose things like:
throw x 
whatever()  

as being unreachable after the throw.



Swift SVN r28680
2015-05-17 15:13:35 +00:00
Dmitri Hrybenko
0a1f7c09df Revert "Fix unreachable code handling to properly diagnose things like:"
This reverts commit 28678.  It broke the IDE/complete_exception.swift
test.

Swift SVN r28679
2015-05-17 12:27:57 +00:00
Chris Lattner
5ead9764bd Fix unreachable code handling to properly diagnose things like:
throw x
  whatever()

as being unreachable after the throw.



Swift SVN r28678
2015-05-17 05:56:02 +00:00
Chris Lattner
c9e0657529 fix <rdar://problem/20941576> SILGen crash: Failable struct init cannot delegate to another failable initializer
in a trivial struct, the 'self' argument in an initializer won't have
a cleanup, so don't disable or reenable it when rebinding self due to delegation.


Swift SVN r28674
2015-05-17 02:51:30 +00:00
John McCall
312a9c1f6e Clean up correctly if a variadic argument throws.
rdar://20942603

Swift SVN r28622
2015-05-15 08:20:36 +00:00
Slava Pestov
cbbde4739e SILGen: remove dead diagnostics for error handling
Looks like Sema is checking all of this stuff now. NFC

Swift SVN r28571
2015-05-14 17:22:44 +00:00
Chris Lattner
8a7b3f414e Revise the parser and AST representation of #available to be part of StmtCondition
instead of being an expression.

To the user, this has a couple of behavior changes, stemming from its non-expression-likeness.
 - #available cannot be parenthesized anymore
 - #available is in its own clause, not used in a 'where' clause of if/let.

Also, the implementation in the compiler is simpler and fits the model better.  This
fixes:
<rdar://problem/20904820> Following a "let" condition with #available is incorrectly rejected



Swift SVN r28521
2015-05-13 19:00:40 +00:00
Joe Groff
0e3bb2dc57 SILGen: Implement ErrorType-to-Any erasure.
And take advantage of the guaranteed peephole when available to emit the base expression at +0 in general existential-to-existential erasures. Fixes rdar://problem/20890504.

Swift SVN r28447
2015-05-11 23:18:53 +00:00
Doug Gregor
2653a6569b Eliminate ModuleExpr; DeclRefExpr is good enough for anyone.
Swift SVN r28285
2015-05-07 21:10:53 +00:00
Michael Gottesman
8361ba44a9 Revert "Revert "[+0 self] Teach SILGen how to avoid emitting extra rr pairs when emitting RValues with Nominal Types and Tuples.""
This reapplies commit r27632 with additional fixes, tests.

I turned off the guaranteed struct optimization since we really don't have the
infrastructure to do it right and more importantly I don't have the time to do
so (and was not asked to do so).

We still have the class optimization though!

This means that there is one retain in ClassIntTreeMethod.find.

class ClassIntTreeNode {
  let value : Int
  let left, right : ClassIntTreeNode

  init() {}

  func find(v : Int) -> ClassIntTreeNode {
    if v == value { return self }
    if v < value { return left.find(v) }
    return right.find(v)
  }
}

Swift SVN r28264
2015-05-07 15:47:34 +00:00
John McCall
36c605f7dc Remove ScalarToTupleExpr in favor of a flag on TupleShuffleExpr.
Also, implement in-place initialization through tuple shuffles.

Swift SVN r28227
2015-05-06 23:44:26 +00:00
Chris Lattner
6a5009e0ce implement <rdar://problem/17013042> T! <-> T? conversions should not produce a diamond
Two pieces to this: 
 - Peephole OptionalEvaluationExpr(InjectOptionalExpr(BindOptionalExpr(X))) to  bitcast x to the result type. 
 - Enhance OptionalEvaluationExpr to delete the failure block if not needed.  

This is the same as r28150, but it includes a fix for the case when a non-address-only type
is initializing a contextally-provided-and-addressible buffer, tested by the new 
testContextualInitOfNonAddrOnlyType testcase.



Swift SVN r28153
2015-05-05 05:39:17 +00:00
Chris Lattner
9eb115fadf revert r28150, the perftestsuite isn't happy.
Swift SVN r28151
2015-05-05 05:16:23 +00:00
Chris Lattner
1ffe86b327 implement <rdar://problem/17013042> T! <-> T? conversions should not produce a diamond
Two pieces to this:
 - Peephole OptionalEvaluationExpr(InjectOptionalExpr(BindOptionalExpr(X))) to 
   bitcast x to the result type.
 - Enhance OptionalEvaluationExpr to delete the failure block if not needed.

This is the same as r28111, except that we finalize the initialization in the
address-only case.  A reduced testcase for the specific issue is added to
optional-casts.swift.



Swift SVN r28150
2015-05-05 05:01:22 +00:00
Erik Eckstein
40c1160713 Revert r28111 "rework the peephole for optional-to-optional casts to be more specific"
and r28105: "implement <rdar://problem/17013042> T! <-> T? conversions should not produce a diamond"

r28111 broke the stdlib build. I also reverted r28105, because r28111 fixes regressions introduced in r2805.



Swift SVN r28114
2015-05-04 07:24:13 +00:00
Joe Groff
e2962ed213 SILGen: Implement recursive local function references.
Instead of immediately creating closures for local function declarations and treating them directly as capturable values, break function captures down and transitively capture the storage necessary to invoke the captured functions. Change the way SILGen emits calls to closures and local functions so that it treats the capture list as the first curry level of an invocation, so that full applications of closure literals or nested functions don't require a partial apply at all. This allows references among local functions with captures to work within the existing confines of partial_apply, and also has the nice benefit that circular references would work without creating reference cycles (though Sema unfortunately rejects them; something we arguably ought to fix.)

This fixes rdar://problem/11266246 and improves codegen of local functions. Full applications of functions, or immediate applications of closure literals like { }(), now never need to allocate a closure.

Swift SVN r28112
2015-05-04 05:33:55 +00:00
Chris Lattner
92ec219998 rework the peephole for optional-to-optional casts to be more specific. Peepholing
on inject_into_optional/bind_optional_expr isn't safe because we don't know what 
optional_evaluation_expr is actually being bound, or if it is bound to the result of the
injection.

Instead, make this more careful to look for the evaluation_expr as well, matching
the specific pattern:
 (optional_evaluation_expr type='T?'
   (inject_into_optional type='T?'
     (bind_optional_expr type='T'
       (whatever type='T?' ...)

This fixes the two interpreter testcases that regressed in r28105.



Swift SVN r28111
2015-05-04 05:32:37 +00:00
Chris Lattner
add4909d35 implement <rdar://problem/17013042> T! <-> T? conversions should not produce a diamond
Two pieces to this:
 - Peephole InjectOptionalExpr(BindOptionalExpr(X)) to bitcast x to the result type.
 - Enhance OptionalEvaluationExpr to delete the failure block if not needed.



Swift SVN r28105
2015-05-04 01:12:23 +00:00
Chris Lattner
b6ad8d5efc Teach emitBindOptional() to disable the cleanup for the optional it is testing on the
nil path.  This avoids emitting a "release" operation on an optional temporary that is
always guaranteed to be dynamically nil.  This cleans up the generated code for x?.foo().



Swift SVN r28103
2015-05-04 00:13:18 +00:00
Chris Lattner
fec2f22459 Enhance SILGen of InjectIntoOptionalExpr/BindOptionalExpr/OptionalEvaluationExpr
to not drop optionals in memory all the time.  We now generate a lot better code
for them in many cases.  This makes generated SIL more readable and should help
-O0 perf.

This is progress towards <rdar://problem/20642198> SILGen shouldn't be dropping optionals into memory all the time




Swift SVN r28102
2015-05-03 23:27:28 +00:00
John McCall
5c171fd448 Parsing, type-checking, SILGen, and IRGen for try!.
Swift SVN r28085
2015-05-02 08:03:15 +00:00
Nadav Rotem
3f675c5f06 Emit calls to swift_willThrow only in throw sites (not in re-throw sites).
rdar://20356658

Swift SVN r27891
2015-04-28 23:21:11 +00:00
Michael Gottesman
a3aa89d4c4 Remove Callback from SILBuilder and instead rename
emit{StrongRelease,ReleaseValue} => emit{StrongRelease,ReleaseValue}AndFold.
Then introduce a new method emit{StrongRelease,ReleaseValue} that returns a
PointerUnion containing the increment to be deleted if it exists. This obviates
the need for the callback.

Swift SVN r27804
2015-04-27 07:29:13 +00:00
Chris Lattner
2d227db594 remove the dead CallerDefaultInitialize case from visitTupleShuffleExpr.
Swift SVN r27801
2015-04-27 04:57:31 +00:00
Chris Lattner
caeca69466 fix <rdar://problem/19086357> SILGen crashes reabstracting default argument closure in members
When emitting default arguments for a parameter, emitApplyOfDefaultArgGenerator
was trying to reconstruct the original type by looking at the decl that it came
from.  However, it doesn't know the number of curry levels already applied, so it
was wrong in the case of default arguments on methods and initializers (which already
have self applied).

Fix this by having the caller pass this information in, since it knows the original
type.

While we're at it, remove the code for handling default arguments from the general 
SILGenExpr logic.  Default arguments in tuples are no longer a general thing, they 
are only valid in argument lists.



Swift SVN r27800
2015-04-27 04:29:32 +00:00
John McCall
d84a95f325 Handle foreign error conventions in foreign-to-native thunks.
Swift SVN r27737
2015-04-26 00:12:52 +00:00
Michael Gottesman
9c35c5eafd Revert "[+0 self] Teach SILGen how to avoid emitting extra rr pairs when emitting RValues with Nominal Types and Tuples."
This reverts commit r27632. I broke a test. I am going to look at it later.

Swift SVN r27634
2015-04-23 10:42:46 +00:00
Michael Gottesman
b80c96a2e7 [+0 self] Teach SILGen how to avoid emitting extra rr pairs when emitting RValues with Nominal Types and Tuples.
Specifically this patch makes the following changes:

1. We properly propagate down the SGFContext of a tuple to its elements
when extracting from a tuple. There was a typo that caused us to use
data from the newly created default initialized copy instead of from the
actual SGFContext of the parent tuple.

2. If we are accessing a member ref of self in a guaranteed context:

  a. If self is a struct, regardless of whether or not the field is a
     var or a let we no longer emit a retain. This is b/c self in a
     guaranteed context is immutable. This implies even a var in the
     struct can not be reassigned to.

  b. If self is a class, if the field is a let, we no longer emit an
     extra retain.

This makes it so that the only rr traffic in IntTreeNode::find is in the
block of code where we return self.

class IntTreeNode {
 let value : Int
 let left, right : IntTreeNode

 init() {} // not needed for -emit-silgen

 func find(v : Int) -> IntTreeNode {
   if v == value { return self }
   if v < value { return left.find(v) }
   return right.find(v)
 }
}

One gets the same effect using a struct for IntTreeNode and a generic
box class, i.e.:

class Box<T> {
  let value: T
  init(newValue: T) { value = newValue }
}

class Kraken {}
struct IntTreeNode {
  let k : Kraken // Just to make IntTreeNode non-trivial for rr purposes.
  let left, right : Box<IntTreeNode>

  init() {} // not needed for -emit-silgen

  func find(v : Int) -> IntTreeNode {
    if v == value { return self }
    if v < value { return left.value.find(v) }
    return right.value.find(v)
  }
}

There is more work that can be done here by applying similar logic to
enums, i.e. switching on self in an enum should not generate any rr
traffic over the switch. Also it seems that there are some places in SILGen
where isGuaranteedValid is not being propagated to SILGenFunction::emitLoad. But
that is for another day.

I am going to gather data over night and send an email to the list.

rdar://15729033

Swift SVN r27632
2015-04-23 10:10:43 +00:00
Chris Lattner
d9083d2e50 rework SGF::emitOptionalToOptional to keep loadable SILValue's as
registers instead of eagerly dumping them in memory and operating on
them by-address.  This avoids a lot of temporaries and traffic to 
manipulate them.

As part of this, add some new SGF::getOptionalNoneValue/getOptionalSomeValue
helper methods for forming loading optional values.

Many thanks to JoeG for helping with the abstraction difference change in
getOptionalSomeValue.



Swift SVN r27537
2015-04-21 22:54:08 +00:00
Chris Lattner
fd69300bdf rework lowering of 'self' in class init methods to use normal cleanups and variable
emission instead of hand coded magic.  Eliminating special cases allows simplifying
other parts of the compiler, and this probably helps the error handling initiative 
as well.

This uses the (horrible) new null_class instruction to properly model rebinding of
self.  The code that SILGen was producing before was wildly incorrect and we only
got lucky that it seemed to work in most cases before.

NFC except that SILGen tests see the new null_class instructions, and we get better
location info for 'return nil' for obscure reasons that don't really matter.



Swift SVN r27530
2015-04-21 16:43:46 +00:00
Chris Lattner
9aa4620879 remove extraneous line that somehow didn't go away with my previous patch.
Swift SVN r27518
2015-04-21 04:13:21 +00:00
Chris Lattner
39a959d9bf Remove some (ultimately) no-op code from SILGen of RebindSelfInConstructorExpr:
it would drop in a dealloc_box or strong_release after rebinding, which is incorrect
(the box is used for any loads of self after the rebind!) but also pointless:
the AllocBoxToStack pass saved the day by promoting the box to a stack address and
zapping these instructions.

Interestingly, AllocBoxToStack *always* succeeds in class initializers, because the
self value is treated as a let value (even though in a box) and captured by value,
therefore there is no way to block the stack promotion that I can find.

In any case, this code is in my way and not doing anything, buhbye.




Swift SVN r27517
2015-04-21 04:04:32 +00:00
Chris Willmore
4330f2a8a9 Instead of replacing ObjectLiteralExpr in CSApply, set its semantic expression (a la InterpolatedStringLiteralExpr).
Swift SVN r27488
2015-04-20 19:41:10 +00:00
Chris Lattner
2fd563616e improve SILGen of RebindSelfInConstructorExpr in several ways:
- In the normal optional-to-optional init case, use
   "emitUncheckedGetOptionalValueFrom" instead of
   "emitCheckedGetOptionalValueFrom" since we have already
   checked to see if the optional is present.  This avoids a
   function call (that is mandatory inlined away) along with a ton
   of SIL that gets mandatory inlined in that shows an assertion 
   failure that can never fail.

 - Teach SGF::emitDoesOptionalHaveValue and
   SILGenFunction::emitUncheckedGetOptionalValueFrom to work with
   optionals in memory and optional values.

 - Based on this, stop dropping the optional self into a materialized
   temporary all the time.  Just use whatever we have (a value or the
   address of an address-only thing) and operate on it directly.

 - Use Cleanups.emitBlockForCleanups instead of emitting a block and
   using emitBranchAndCleanups.  This leads to cleaner code in SILGen
   and avoids emitting a dead block in the common case where there are
   no cleanups to perform.

Overall, these changes lead to better super.init calls in failable
inits, and more importantly enable understanding the output of -emit-sil 
on them :-)



Swift SVN r27477
2015-04-20 05:15:06 +00:00
Chris Lattner
7beb6d52de Extend SILGen's emitEpilog() to work with epilog blocks that are
already set up, allowing clients to generate code before the top-level
cleanup stack is emitted.

Use this to switch value constructors onto emitEpilog() and, more importantly,
to start managing the self box as a normal local variable tracked with cleanups
instead of being tracked with ad-hoc code spread through SILGen.

Among other things, once classes are switched over to the same model, we can
remove SGF.FailSelfDecl and the code to support it.  NFC.



Swift SVN r27472
2015-04-20 00:30:30 +00:00
Chris Lattner
fa6f078d0a Continue tidying up Initialization, NFC:
- Privatize "kind" in the base Initialization class.
 - Simplify canForwardInBranch() to just isSingleBuffer().
   There is only one client of it (which avoids emitting the
   formation of an optional temporary) and the only cases we're
   dropping is for "_" patterns and single element tuple patterns,
   which are not worth optimizing for.
 - Change getSubInitializationsForTuple() into a virtual method
   since it has wildly different behavior based on the subclass and
   requires otherwise private implementation details of those subclasses
   to implement it.
 - Simplify subclasses based on these changes.



Swift SVN r27463
2015-04-19 04:47:02 +00:00