Commit Graph

2053 Commits

Author SHA1 Message Date
Ravi Kandhadai
d074033e37 Merge pull request #27892 from ravikandhadai/valuelifetimeanalysis
[SIL Optimization] Fix a bug in isAliveAtBeginOfBlock function of ValueLifetimeAnalysis and generalize the utility
2019-10-26 11:10:02 -07:00
Ravi Kandhadai
d195ecc64a [SIL Optimization] Fix a bug in isAliveAtBeginOfBlock function
of ValueLifetimeAnalysis and generalize the utility so that it
can provide the critical edges as well, when it is invoked in
DoNotModifyCFG mode.
2019-10-25 18:19:40 -07:00
Erik Eckstein
d88edadb60 BasicCalleeAnalysis: fix computation of class method callees if an overridden function has a different ABI
In such a case the overridden function gets a new separate vtable entry.
With this change, the computation of class method callees only uses the information in sil_vtables (instead of ClassDecl members).

Fixes a compiler crash in various optimization passes.
rdar://problem/56146633
2019-10-22 11:27:21 +02:00
Erik Eckstein
baa94f21c2 BasicCalleeAnalysis: add dump() functions for debugging 2019-10-22 11:27:21 +02:00
Ravi Kandhadai
981dca5a65 [Constant Evaluator] Add support for thin_to_thick_function SIL instruction,
and fix bugs in the evaluator in the implementation of array.append, and in
loading/linking external function.
2019-10-15 19:09:14 -07:00
eeckstein
8fc1501081 Revert "EscapeAnalysis: make the use-point analysis more precise" 2019-10-15 19:21:26 +02:00
Erik Eckstein
d1072621ba EscapeAnalysis: make the use-point analysis more precise
In canEscapeToUsePoint only check the content node if it's a reference (see comment why this is needed).
For all other node types, especially addresses, handle defer edges by propagating use-point infomation backward in the graph.
This makes escape analysis more precise with address types, e.g. don't consider an inout address to escape to an apply if just the loaded value is passed to an apply argument.
2019-10-14 20:43:46 +02:00
swift-ci
0ef58de2c7 Merge remote-tracking branch 'origin/master' into master-next 2019-10-14 10:49:48 -07:00
Erik Eckstein
8e21379ffc SILOptimizer: always assume that inout arguments are not aliasing
We can do that now as we have exclusivity checking
2019-10-14 16:35:50 +02:00
swift-ci
da686f2aa7 Merge remote-tracking branch 'origin/master' into master-next 2019-10-09 17:09:31 -07:00
Jordan Rose
a1ea211f22 Add llvm::iterator_range to LLVM.h
If we're going to get rid of swift::IteratorRange, let's make
llvm::iterator_range easy to use.

No functionality change.
2019-10-08 15:24:06 -07:00
Jordan Rose
7b0d081965 Remove IteratorRange in favor of llvm::iterator_range
Now that llvm::iterator_range has 'empty', there's not enough reason to
keep our own version of it in the Swift repo.

No functionality change.
2019-10-08 11:23:28 -07:00
swift-ci
ded4197d59 Merge remote-tracking branch 'origin/master' into master-next 2019-10-02 13:29:41 -07:00
Andrew Trick
22500e7e6b Update the coding style for all code moved in the previous commit.
Requested by gottesmm during review.

Update the variable naming conventions to lower-camel.

Run clang-format.

I'm sure I missed some local variables somewhere--this was a best
effort.
2019-10-02 11:34:54 -07:00
Andrew Trick
bddc69c8a6 Organize SILOptimizer/Utils headers. Remove Local.h.
The XXOptUtils.h convention is already established and parallels
the SIL/XXUtils convention.

New:
- InstOptUtils.h
- CFGOptUtils.h
- BasicBlockOptUtils.h
- ValueLifetime.h

Removed:
- Local.h
- Two conflicting CFG.h files

This reorganization is helpful before I introduce more
utilities for block cloning similar to SinkAddressProjections.

Move the control flow utilies out of Local.h, which was an
unreadable, unprincipled mess. Rename it to InstOptUtils.h, and
confine it to small APIs for working with individual instructions.
These are the optimizer's additions to /SIL/InstUtils.h.

Rename CFG.h to CFGOptUtils.h and remove the one in /Analysis. Now
there is only SIL/CFG.h, resolving the naming conflict within the
swift project (this has always been a problem for source tools). Limit
this header to low-level APIs for working with branches and CFG edges.

Add BasicBlockOptUtils.h for block level transforms (it makes me sad
that I can't use BBOptUtils.h, but SIL already has
BasicBlockUtils.h). These are larger APIs for cloning or removing
whole blocks.
2019-10-02 11:34:54 -07:00
Mishal Shah
2f86d67500 Merge pull request #27396 from shahmishal/master-rebranch
Update master to support apple/stable/20190619 branch for LLVM projects
2019-10-01 10:50:49 -07:00
swift-ci
5e50242b5e Merge remote-tracking branch 'origin/master' into master-next 2019-09-30 16:09:53 -07:00
Robert Widmann
5a8d0744c3 [NFC] Adopt TypeBase-isms for GenericSignature
Structurally prevent a number of common anti-patterns involving generic
signatures by separating the interface into GenericSignature and the
implementation into GenericSignatureBase.  In particular, this allows
the comparison operators to be deleted which forces callers to
canonicalize the signature or ask to compare pointers explicitly.
2019-09-30 14:04:36 -07:00
swift-ci
7fd05165cd Merge remote-tracking branch 'origin/master' into master-next 2019-09-26 12:50:17 -07:00
swift-ci
349d6b073e Merge remote-tracking branch 'origin/master' into master-rebranch 2019-09-26 12:44:18 -07:00
Harlan Haskins
b904133c42 [Modules] Add flag to skip non-inlinable function bodies
This flag, currently staged in as `-experimental-skip-non-inlinable-function-bodies`, will cause the typechecker to skip typechecking bodies of functions that will not be serialized in the resulting `.swiftmodule`. This patch also includes a SIL verifier that ensures that we don’t accidentally include a body that we should have skipped.

There is still some work left to make sure the emitted .swiftmodule is exactly the same as what’s emitted without the flag, which is what’s causing the benchmark noise above. I’ll be committing follow-up patches to address those, but for now I’m going to land the implementation behind a flag.
2019-09-26 10:40:11 -07:00
swift-ci
6945d6192d Merge remote-tracking branch 'origin/master' into master-next 2019-09-26 09:29:43 -07:00
swift-ci
f809a8790c Merge remote-tracking branch 'origin/master' into master-rebranch 2019-09-26 09:25:07 -07:00
nate-chandler
b9b4196470 Merge pull request #27239 from nate-chandler/39957093-argument-explosion-heuristic
[SILOptimizer] Alter FSO arg explosion heuristic.
2019-09-26 09:19:15 -07:00
Nate Chandler
23a042207f [CallerAnalysis] foundAllCallers reqs nonexternal.
Previously, CallerAnalysis::FunctionInfo.foundAllCallers(), which is
documented to return true only when specialization of a function will
not require a thunk, returned true for functions which are possibly used
externally.  Now, that member function only returns false for functions
which may be used externally since dead code elimination will not be
able to remove them.
2019-09-24 15:59:28 -07:00
Nate Chandler
27fe8493aa [SILOptimizer] Epilogue matcher can find partial post dom argument releases.
Added getPartiallyPostDomReleaseSet to
ConsumedArgToEpilogueReleaseMatcher.  Given an argument, the new method
returns the array of releases of the argument if there is an array
thereof and if the releases therein do not jointly post-dominate the
argument.

Excerpted from @gottesm's https://github.com/apple/swift/pull/16756.
2019-09-20 09:40:36 -07:00
swift-ci
2021095c52 Merge remote-tracking branch 'origin/master' into master-next 2019-09-19 10:09:52 -07:00
swift-ci
c501814bf9 Merge remote-tracking branch 'origin/master' into master-rebranch 2019-09-19 10:03:10 -07:00
Andrew Trick
88cb02c04b Merge pull request #27246 from atrick/fix-address-phi
Add SIL SinkAddressProjections utility to avoid address phis.
2019-09-19 09:52:33 -07:00
swift-ci
c9703db769 Merge remote-tracking branch 'origin/master' into master-rebranch 2019-09-18 20:03:44 -07:00
swift-ci
b76e9ec111 Merge remote-tracking branch 'origin/master' into master-next 2019-09-18 19:49:09 -07:00
Andrew Trick
f22371bf0b Add SIL SinkAddressProjections utility to avoid address phis.
Enable this utility during jump-threading in SimplifyCFG.

Ultimately, the SIL verifier should prevent all address-phis and we'll
need to use this utility in a few more places.

Fixes <rdar://problem/55320867> SIL verification failed: Unknown
formal access pattern: storage
2019-09-18 18:02:59 -07:00
Ravi Kandhadai
22861ec0fd [Constant Evaluator] Pass assert configuartion option to the
evaluator to precisely evaluate Builtin.assert_configuration.

Unify UnknownReason::Trap and UnknownReason::AssertionFailure error
values in the constant evaluator, now that we have 'condfail_message'
SIL instruction, which provides an error message for the traps.
2019-09-18 17:35:46 -07:00
swift-ci
1fdda8eaa8 Merge remote-tracking branch 'origin/master' into master-next 2019-09-17 19:09:48 -07:00
swift-ci
1fe9aa60dd Merge remote-tracking branch 'origin/master' into master-rebranch 2019-09-17 19:03:56 -07:00
Ravi Kandhadai
032442da93 [Constant Evaluator] Add a new sil-opt pass to check constant evaluability
of Swift code snippets. Add a new test: constant_evaluable_subset_test.swift
that tests Swift code snippets that are expected to be constant evaluable and
those that are not.
2019-09-16 18:49:19 -07:00
Ravi Kandhadai
b59cc7ad6a [Constant Evaluator] Add support to the constant evaluator for:
1. builtin "int_expect", which makes the evaluator work on more
integer operations such as left/right shift (with traps) and
integer conversions.

2. builtin "_assertConfiguration", which enables the evaluator
to work with debug stdlib.

3. builtin "ptrtoint", which enables the evaluator to track
StaticString

4. _assertionFailure API, which enables the evaluator to report
stdlib assertion failures encountered during constant evaluation.

Also, enable attaching auxiliary data with the enum "UnknownReason"
and use it to improve diagnostics for UnknownSymbolicValues,
which represent failures during constant evaluation.
2019-09-16 15:12:22 -07:00
swift-ci
0ef2397dab Merge remote-tracking branch 'origin/master' into master-next 2019-09-12 07:50:20 -07:00
swift-ci
bf2a8dc767 Merge remote-tracking branch 'origin/master' into master-rebranch 2019-09-12 07:44:17 -07:00
Erik Eckstein
8cdeb45284 StackNesting: fix a corner case crash related to unreachable blocks
When deallocs are inserted at block boundaries, it's necessary to recompute the data flow.

rdar://problem/55249524
2019-09-12 13:08:31 +02:00
Mike Ash
f5e7ab866c Merge branch 'master' into master-next 2019-09-09 12:11:25 -04:00
swift-ci
aa7fa85a37 Merge remote-tracking branch 'origin/master' into master-rebranch 2019-09-06 21:43:32 -07:00
Nate Chandler
211e6562d8 [SILOptimizer] Added MandatoryCombiner.
Minimal commit to get the mandatory combiner rolling.  The intent of the
mandatory combiner is to do basic transformations after the diagnostics
passes have run at the beginning of both the Onone and the performance
pipelines.  For now, it simply visits reachable instructions and does
no work.  In a subsequent commit, apply instructions will be processed
and replaced if they are calls to partial applies defined in the same
function.  At that point an attempt will be made to eliminate the
partial apply altogether.

For now, the pass does no work and is not part of any pipeline.
2019-09-06 15:44:57 -07:00
swift-ci
8b82982f5f Merge remote-tracking branch 'origin/master' into master-next 2019-09-06 11:29:41 -07:00
swift-ci
b9d1078bf6 Merge remote-tracking branch 'origin/master' into master-rebranch 2019-09-06 11:23:41 -07:00
Nate Chandler
d2270b9e85 [SIL] Updated instruction worklist.
- Replaced usage of raw map and vector with the type that wraps the
  combination (BlotSetVector); that provided a significant deduplication
  since a sizeable portion of the worklist's implementation was in
  vector and map management now provided by the BlotSetVector.
- Templated over the type of map and vector used by the blot set vector.
- Added SmallSILInstructionWorklist where the map and vector are
  specified to be SmallDenseMap and SmallVector respectively.
- Replaced usages of bare ValueBase with usages of SILValue.
- Renamed zap to resetChecked.

Added a bit of functionality to BlotSetVector, specifically to support
SILInstructionWorklist:

- Made insert return not just the index that the potentially-inserted
  item is at on return but additionally whether an insertion occurred,
  matching the behavior of llvm::DenseMap::insert.
- Added a method to reserve capacity in the backing vector and map:
  BlotSetVector::reserve.
- Added a method to free extra storage used by the backing vector and
  map: BlotSetVector::clear.
- Modified SmallBlotSetVector's template parameters so that only a value
  and size can be specified--that type will always use SmallVector and
  SmallDenseMap for its superclass' VectorT and MapT template
  parameters.
- Updated variable names.
2019-09-06 09:10:26 -07:00
swift-ci
90c4af8130 Merge remote-tracking branch 'origin/master' into master-next 2019-08-30 03:49:39 -07:00
swift-ci
a073fd7621 Merge remote-tracking branch 'origin/master' into master-rebranch 2019-08-30 03:43:39 -07:00
eeckstein
fd86e850b7 Revert "[SILOptimizer] Added MandatoryCombiner." 2019-08-30 11:45:25 +02:00
swift-ci
1f5005ebf7 Merge remote-tracking branch 'origin/master' into master-next 2019-08-29 15:10:25 -07:00