Commit Graph

11224 Commits

Author SHA1 Message Date
Xin Tong
b2b5247ba9 Merge pull request #1756 from trentxintong/FSO
Minor refactoring in epilogue release matcher
2016-03-21 07:59:46 -07:00
Xin Tong
a191ae72a7 Minor refactoring in epilogue release matcher. NFC 2016-03-20 23:13:50 -07:00
Xin Tong
570c19b9c6 Merge pull request #1754 from trentxintong/FSO
Remove function signature optimization module pass.
2016-03-20 15:55:50 -07:00
Xin Tong
53888e12b5 Remove FunctionSignatureOpts.cpp.
This optimization pass has been replaced by FunctionSigatureOptCloner.cpp
and FunctionSigatureOptRewriter.cpp in cff61d7fe7
2016-03-20 15:05:02 -07:00
Xin Tong
e3ec0703fd Merge pull request #1744 from trentxintong/FSO
Implement a function signature cloner and rewriter.
2016-03-20 11:44:54 -07:00
practicalswift
a0d494c143 [gardening] Fix recently introduced typos: "fucntion" → "function", "functio" → "function", "mergable" → "mergeable", "mistmatched" → "mismatched" 2016-03-20 10:34:32 +01:00
Xin Tong
cff61d7fe7 Implement a function signature cloner and rewriter.
This split the function signature module pass into 2 functin passes.

By doing so,  this allows us to rewrite to using the FSO-optimized
function prior to attempting inlining, but allow us to do a substantial
amount of optimization on the current function before attempting to do
FSO on that function.

And also helps us to move to a model which module pass is NOT used unless
necesary.

I do not see regression nor improvement for on the performance test suite.

functionsignopts.sil and functionsignopt_sroa.sil are modified because the
mangler now takes into account of information in the projection tree.
2016-03-19 23:57:37 -07:00
Andrew Trick
5bda28e1cb Revert "Merge pull request #1725 from atrick/specialize"
Temporarily reverting @_specialize because stdlib unit tests are
failing on an internal branch during deserialization.

This reverts commit e2c43cfe14, reversing
changes made to 9078011f93.
2016-03-18 22:31:29 -07:00
practicalswift
a942bb76d0 [gardening] Fix formatting of recently introduced headers. 2016-03-19 00:37:37 +01:00
Erik Eckstein
6d654aa3e8 Debugging on SIL level.
This change follows up on an idea from Michael (thanks!).
It enables debugging and profiling on SIL level, which is useful for compiler debugging.

There is a new frontend option -gsil which lets the compiler write a SIL file and generated debug info for it.
For details see docs/DebuggingTheCompiler.rst and the comments in SILDebugInfoGenerator.cpp.
2016-03-18 14:02:06 -07:00
Andrew Trick
e2c43cfe14 Merge pull request #1725 from atrick/specialize
@_specialize attribute
2016-03-18 13:24:31 -07:00
Andrew Trick
295dc96fb6 [SILOptimizer] Introduce an eager-specializer pass.
This pass finds generic functions with @_specialized attributes and
generates specialized code for the attribute's concrete types. It
inserts type checks and guarded dispatch at the beginning of the
generic function for each specialization. Since we don't currently
expose this attribute as API and don't specialize vtables and witness
tables yet, the only way to reach the specialized code is by calling
the generic function which performs the guarded dispatch.

In the future, we can build on this work in several ways:
- cross module dispatch directly to specialized code
- dynamic dispatch directly to specialized code
- automated specialization based on less specific hints
- partial specialization
- and so on...

I reorganized and refactored the optimizer's generic utilities to
support direct function specialization as opposed to apply
specialization.
2016-03-18 10:18:55 -07:00
Andrew Trick
f6a2e7c362 [comment] Clarify RC identity over casts. 2016-03-18 04:01:16 -07:00
Xin Tong
fd353df19e Remove some of unneeded functionality in CallerAnalysis
We really only need the analysis to tell whether a function has caller
inside the module or not. We do not need to know the callsites.

Remove them for now to make the analysis more memory efficient.

Add a note to indicate it can be extended.
2016-03-17 21:16:24 -07:00
Xin Tong
eab029d795 Add CallerAnalysis Printer.
This provides some basic testing on CallerAnalysis before hooking it
up to function signature opts.
2016-03-17 10:51:16 -07:00
Xin Tong
1603b0f153 Handle dead functions in CallerAnalysis.
Add an invalidateAnalysisForDeadFunction API. This API calls the invalidateAnalysis
by default unless overriden by analysis pass themselves. This API passes the extra
information that this function is dead and going to be removed from the module.

CallerAnalysis overrides this API and only invalidate caller/callee relations but
does not push this into the recompute list.

We also considered the possibility of keeping a computed list, instead of recompute
list but that would introduce a O(n^2) complexity as every time we try to complete
the computed list, we need to walk over all the functions that currently exist in the
module to make sure the computed list is complete.

I feel eventually we can do a handleDeleteNotification for function deletion and we
wont need the API added in this change.
2016-03-17 09:55:12 -07:00
Xin Tong
6b9cde8ffd Fix typo 2016-03-16 18:00:07 -07:00
Xin Tong
cca9c2521a Improve CallerAnalysis.
Address the comments from 0acc0a8464

I still have not made up my mind how to handle deleted functions.

CallerAnalysis is not hooked up to anything yet.
2016-03-16 17:49:34 -07:00
practicalswift
6f53d02f6b [gardening] Fix recently introduced typo: "optimzer" → "optimizer" 2016-03-16 23:17:26 +01:00
practicalswift
a934702d51 [gardening] Fix recently introduced typo: "fucntion" → "function" 2016-03-16 23:17:13 +01:00
practicalswift
1147753a94 [gardening] Fix formatting of recently introduced header files 2016-03-16 22:51:11 +01:00
Xin Tong
0b930234ed Fix use-after-free in DFE 2016-03-16 14:20:45 -07:00
Xin Tong
0acc0a8464 Implement a Caller Analysis.
The analysis can tell all the callsites which calls a function in the module.

The analysis is computed and kept up-to-date lazily.

At the core of it, it keeps a list of functions that need to be recomputed for
the Caller/Callee relation to be precise and on every query, the analysis makes
sure to recompute them and clear the list before any query.

This is NFC right now. I am going to wire it up to function signature analysis
eventually.
2016-03-16 09:33:22 -07:00
Xin Tong
a5b0270ab9 Remove unused variable 2016-03-16 07:38:31 -07:00
Xin Tong
5f7f05da9b Reinstate "Moves SignatureAnalyzer and ArgumentDescriptor/ResultDescriptor into
a separate analysis pass.

This pass is run on every function and the optimized signature is return'ed through the
getArgDescList and getResultDescList.

Next step is to split to cloning and callsite rewriting into their own function passes.

rdar://24730896
"
2016-03-16 07:00:57 -07:00
Doug Gregor
a31edf53d0 Simplify the interface to Module::lookupConformance.
Rather than returning a weird PointerIntPair, return an
Optional<ProtocolConformanceRef>. NFC
2016-03-15 22:08:24 -07:00
eeckstein
32d16276f8 Merge pull request #1696 from eeckstein/fix_release_devirtualizer
Fix release devirtualizer
2016-03-15 14:57:38 -07:00
Erik Eckstein
bf87de3bc3 Fix a memory leak caused by the ReleaseDevirtualizer.
This occured if a stack-promoted object with a devirtualized final release is not actually allocated on the stack.
Now the ReleaseDevirtualizer models the procedure of a final release more accurately.
It inserts a set_deallocating instruction and calles the deallocator (instead of just the deinit).

This changes also includes two peephole optimizations in IRGen and LLVMStackPromotion which get rid of
unused runtime calls in case the stack promoted object is really allocated on the stack.

This fixes rdar://problem/25068118
2016-03-15 12:56:54 -07:00
Erik Eckstein
c1bcb0b69d SIL: add new instruction set_deallocating
It will be used by the ReleaseDevirtualizer before calling the deallocator.
So far, this is NFC.
2016-03-15 12:56:54 -07:00
practicalswift
854e82d4dc [SILOptimizer] Remove unused "SuccFilterFnTy" 2016-03-15 13:57:38 +01:00
Michael Gottesman
406a7c9962 [loop-region] Track the backedges of all loop regions.
We already computed this information so this is just storing information
we were already computing.

One thing to note is that in code with canonicalized loops, we will
always only have one backedge. But we would like loop region to be
correct even in the case of non-canonicalized code so we support having
multiple back edges. But since the common case is 1 backedge, we
optimize for that case.

This commit contains updated tests and also updates to the loop region graph
viewer so that it draws backedges as green arrows from the loop to its backedge
subregions. The test updates were done by examining each test case by hand.
2016-03-14 22:37:06 -07:00
Michael Gottesman
3fd5e80b39 [loop-region] Change LoopRegion::getParentID() to return the optional ParentID instead of attempting to use the value and asserting. 2016-03-14 22:37:06 -07:00
Slava Pestov
ceac05e374 SILOptimizer: It appears that the thin_func -> ptr -> thin_func peephole is dead code now
We don't generate this sequence anymore.
2016-03-14 20:58:32 -07:00
Mark Lacey
a7eb7b10d9 Fix typo in comment. 2016-03-14 16:18:00 -07:00
Michael Gottesman
8298df2a30 [arc] A value loaded from an @in_guaranteed parameter is @guaranteed. 2016-03-12 17:23:28 -08:00
Ben Langmuir
cf4498e6cf Mark a couple of local sil-optimizer functions as static NFC 2016-03-11 13:34:23 -08:00
Mark Lacey
eba2e378d6 Merge pull request #1635 from rudkx/debugtrap
Add two helpful command-line options for debugging function passes.
2016-03-11 07:57:59 -08:00
Michael Gottesman
0c5d457fd1 [arc] guaranteed parameters are always known safe BU.
The reason why this is true is that we know that a guaranteed parameter must out
live the current function. That means that no releases on that guaranteed
parameter can be "last" releases.

rdar://25091228
2016-03-10 23:27:03 -08:00
Mark Lacey
572fe662d5 Add two helpful command-line options for debugging function passes.
This commit adds -sil-break-on-function and -sil-break-on-pass, both
-Xllvm options.

-sil-break-on-function stops function pass execution in the debugger
 just prior to running each function pass on a particular function.

-sil-break-on-pass stops function pass execution in the debugger just
 prior to running a particular pass on each function.

Used together, you can break just prior running a particular pass on a
particular function.

For example:
  xcrun lldb -- $(/path/to/my/swiftc -c -O problem.swift -###) -Xllvm -sil-break-on-function=_TF7problem7problemFT_T_ -Xllvm -sil-break-on-pass='Simplify CFG'

Now when running under the debugger, we'll stop execution just prior
to each run of Simplify CFG on the function problem() in
problem.swift.
2016-03-10 21:42:43 -08:00
Mark Lacey
79ea412b0b Merge pull request #1627 from rudkx/combine-phases
Run more function passes in a single run of the pass manager.
2016-03-10 20:53:22 -08:00
Michael Gottesman
0e2dc7a930 [arc] Once we have finished an iteration of ARC, clear the ImmutablePointerSetFactory.
Previously due to the way that ARC works, it was impossible to trigger any
memory safety issues. That being said the fact that the memory safety here is
non-obvious suggests that the right thing to do is just bite the bullet and
clear the ImmutablePointerSetFactory.
2016-03-10 18:48:03 -08:00
Mark Lacey
75cdaa327f Run more function passes in a single run of the pass manager.
This commit moves the SILLinker pass out of AddSSAPasses, so that we run
more function passes on each function before moving up to it's callers.

Now the only remaining module passes in AddSSAPasses are GlobalOpt and
LetPropertiesOpt, which run only when we call AddSSAPasses for the
MidLevel optimizations.

This commit also adds the high level loop opt passes onto the same pass
run. As a result of this and moving SILLinker out of AddSSAPasses, we
now run far more passes together on a given function before moving up
the call graph to the callers.

The net result is that I am now seeing approximately a 2% reduction in
stdlib compile times, with only a single significant performance
regression (there are some other minor improvements and regressions, and
some major improvements with -Ounchecked).

The 2% reduction appears to come largely from the mechanism in the pass
manager that skips running passes if we've not made any changes to a
function since the last time the pass was run.
2016-03-10 13:07:38 -08:00
Arnold Schwaighofer
7405512dcb Fix the cast optimizer to remove instructions after inserting unreachable
Also insert the store and dealloc_stack instructions before the trap the cast
optimizer inserts.

rdar://24761530
2016-03-09 20:05:59 -08:00
Max Moiseev
02006f20bc Merge remote-tracking branch 'origin/master' into swift-3-api-guidelines 2016-03-09 16:05:03 -08:00
Xin Tong
43fcb6c20c More refactoring in FSO. NFC 2016-03-09 16:33:23 -05:00
Xin Tong
ae745ccaed Split SignatureOptimzer::analyze(). NFC.
Do some preparations to split function signature into 3 function passes.

analyze() has become a dumping ground for code to analyze parameters and result.

Split it into 2 functions.
2016-03-09 15:22:45 -05:00
Joe Groff
77dd9b2992 Split exact-subclass and bindable-to-subclass queries.
In many places, we're interested in whether a type with archetypes *might be* a superclass of another type with the right bindings, particularly in the optimizer. Provide a separate Type::isBindableToSuperclassOf method that performs this check. Use it in the devirtualizer to fix rdar://problem/24993618. Using it might unblock other places where the optimizer is conservative, but we can fix those separately.
2016-03-09 11:14:45 -08:00
Xin Tong
8eedb43c4c Implement partially dead argument elimination.
This change includes an option on how IsLive is defined/computed. the ProjectionTree
can now choose to ignore epilogue releases and mark a node as dead if its only non-debug
user is epilogue release.

It can also mark a node as alive even its only user is epilogue release as before.

Imagine a case where one passes in an array and not access its owner
besides to release it. In such a case, we *do* want to be able to eliminate
that argument even though there is a release in the function epilogue.

This will help to get rid of the retain and release pair at the callsite. i.e.
the guaranteed paramter is elimininated.

rdar://21114206
2016-03-08 23:12:38 -05:00
Arnold Schwaighofer
3676671b7f Merge pull request #1587 from aschwaighofer/stack_promote_with_unsafe_mutable_buffer_pointer
Mark Array.withUnsafeMutableBuffer as not escaping the array storage.
2016-03-08 19:39:28 -08:00
Arnold Schwaighofer
b5f018a4b1 Mark Array.withUnsafeMutableBuffer as not escaping the array storage.
This is safe because the closure is not allowed to capture the array according
to the documentation of 'withUnsafeMutableBuffer' and the current implementation
makes sure that any such capture would observe an empty array by swapping self
with an empty array.

Users will get "almost guaranteed" stack promotion for small arrays by writing
something like:

  func testStackAllocation(p: Proto) {
    var a = [p, p, p]
    a.withUnsafeMutableBufferPointer {
      let array = $0
      work(array)
    }
  }

It is "almost guaranteed" because we need to statically be able to tell the size
required for the array (no unspecialized generics) and the total buffer size
must not exceed 1K.
2016-03-08 19:37:47 -08:00