Commit Graph

2441 Commits

Author SHA1 Message Date
Holly Borla
54f42b5833 Merge pull request #61445 from hborla/pack-shape-requirements
[RequirementMachine] Implement inference and minimization of same-shape requirements.
2022-10-07 14:49:14 -07:00
Hamish Knight
51946b16d5 [Profiler] Use proper SILDeclRef for top-level code
Use a main entry-point instead of a null
SILDeclRef. Eventually we'll want to unify the
emission here such that we visit all the
TopLevelDecls in one shot (and just use a single
profiler), but for now we can just hand the
SILProfiler the expected SILDeclRef.
2022-10-07 13:54:52 +01:00
Holly Borla
38a2c8218b [Requirement] Rename RequirementKind::SameCount to SameShape. 2022-10-06 20:48:40 -07:00
Hamish Knight
072cdb5e87 [Profiler] Clean up CounterExpr allocation
Use a BumpPtrAllocator instead of a linked list,
and allocate internally within the CounterExpr so
we can just pass about values instead of pointers
and references. This allows us to eliminate
`CounterExpr::Ref`.

Unfortunately this means we can no longer store
CounterExprs in the SourceMappingRegions for
nodes, as we were previously using pointers to
propagate updates the counters made after the
region was popped. Instead we now have to query
the `CounterMap`. But IMO this is a worthwhile
tradeoff for code that's easier to reason about.
2022-10-06 19:25:09 +01:00
Erik Eckstein
66f07fe3da Swift SIL: rework function effects and add function side-effects
So far, function effects only included escape effects.
This change adds side-effects (but they are not computed, yet).
It also involves refactoring of the existing escape effects.
Also the SIL effect syntax changed a bit. Details are in docs/SIL.rst
2022-10-05 07:38:11 +02:00
Andrew Trick
30c0c795df Comment grammar in OperandOwnership 2022-10-04 16:04:36 -07:00
swift-ci
b6ececbada Merge pull request #61395 from atrick/rename-bitcast
Rename SILBuilder::createUncheckedBitCast
2022-10-03 13:24:24 -07:00
Pavel Yaskevich
dbb5a48ed5 Merge pull request #60941 from xedin/type-wrapper-user-defined-inits-with-inst-reuse
[Sema/SIL] Implement type wrapper support in user-defined initializers
2022-10-03 11:39:38 -07:00
Andrew Trick
5f7f6e464f Rename SILBuilder::createUncheckedBitCast
to SILBuilder::createUncheckedForwardingCast

It would be disastrous to confuse this utility with a bit cast. A bit
cast always produces an Unowned value which must immediately be copied
to be used. This utility always forwards ownership. It cannot be used
to truncate values.

Also, be careful not to convert "reinterpret cast"
(e.g. Builtin.reinterpretCast) into a "value cast" since ownership
will be incorrect and the reinterpreted types might not have
equivalent layout.
2022-10-03 10:09:07 -07:00
Andrew Trick
18143e2797 Merge pull request #61393 from atrick/fix-closure-release
Fix unchecked_bitwise_cast to "escape" its operand's ownership
2022-09-30 19:38:50 -07:00
Andrew Trick
17e3cf07b8 Fix unchecked_bitwise_cast to "escape" its operand's ownership
This makes it impossible for OSSA utilities to reason about the
lifetime of the value being cast. This fixes bugs in which SILGen
generates bitwise casts without protecting that lifetime.

Fixes rdar://100527903 (Overrelease of optional closure when using
shorthand syntax)

The previous OSSA strategy was to gradually eliminate all "pointer
escape" SIL patterns. That would define away a class of bugs in the
OSSA utilities themselves. This was not friendly to developers working
on SILGen, and we still don't have verification that can catch these
bugs.

The new strategy is to make all OSSA utilities aware of pointer
escapes. This acknowledges reality that SIL is imperfect. Instead,
optimizer support for transforming SIL always needs to recognize
potentially dangerous patterns.

The downside of this new strategy is that it hides performance
problems because SIL optimizations can give up whenever they happen to
see a "pointer escape". We need to keep working on this problem
without being motivated by miscompiling code.
2022-09-30 15:20:45 -07:00
Anthony Latsis
18156d1177 Merge pull request #61347 from AnthonyLatsis/migrate-compiler-to-gh-issues
Gardening: Migrate compiler sources to GitHub issues
2022-09-30 10:48:52 +03:00
Pavel Yaskevich
df87a494c2 [SIL] Add originator to assign_by_wrapper instruction
Originator of this temporary instruction could be either
type or property wrapper.
2022-09-29 20:50:36 -07:00
Anthony Latsis
2843e0c871 Gardening: Migrate compiler sources to GitHub issues 2022-09-29 23:58:55 +03:00
Hamish Knight
0b25742b9e [SIL] Remove SILDeclRef::isAnyThunk
This perfectly duplicates the logic in
`SILDeclRef::isThunk`.
2022-09-29 10:08:19 +01:00
Hamish Knight
c9d96bcd01 [Profiler] Assert that we always have function bodies
It seems like this defensive logic was written
back when we could create SILProfilers for
declarations in addition to definitions. Now we
should only ever create SILProfilers for
definitions, so we can assert that we always have
a function body available.
2022-09-29 10:08:18 +01:00
Hamish Knight
0eba486442 [SILGen] Remove setUpForProfiling
Instead, setup the profilers when emitting
function definitions. This is consistent with
what we do for all the other kinds of SILDeclRef.
2022-09-29 10:08:17 +01:00
Hamish Knight
5b1ca3f0e0 [SILGen] Avoid forcing function bodies for profiling
This is no longer necessary now that we ensure we
always SILGen functions that contain user code.
2022-09-29 10:08:17 +01:00
Hamish Knight
bd18c37b82 [Profiler] Adopt SILDeclRef::hasUserWrittenCode
This replaces some of the existing checks, and
ensures that we don't emit coverage maps for
property wrapper backing initializers that don't
contain user code.

rdar://99931619
2022-09-29 10:08:15 +01:00
Hamish Knight
8bc80c146a [SILGen] Avoid delaying functions with user-written code
Previously we would delay the emission of
lazy variable getters and stored property
initializers for property wrapper backing storage.
This could lead to their definitions being dropped
if unused, meaning that we wouldn't run the
mandatory diagnostics passes over them.

Fix the logic such that we consider such cases as
having user-written code, and account for a couple
of cases where we can delay emission where we
didn't previously. There are more cases we can
handle here, but I'm leaving that as future work
for now, as `emitOrDelayFunction` is currently
only used for a handful of SILDeclRef kinds.

This is a source breaking change, but only for
invalid (albeit unused) code.

rdar://99962285
2022-09-28 16:11:12 +01:00
Hamish Knight
0dc768aa35 Merge pull request #61295 from hamishknight/linked-in 2022-09-28 15:11:45 +01:00
Hamish Knight
bca941b152 [AST] NFC: Rename IfExpr -> TernaryExpr
This matches what we call it in SwiftSyntax, and
is just generally clearer.
2022-09-28 10:33:31 +01:00
nate-chandler
5cf1cb368d Merge pull request #61304 from nate-chandler/transfer-sil-function-argument-attrs
[SILOptimizer] Preserve arg attrs at cloning.
2022-09-27 08:05:19 -07:00
Hamish Knight
28aec55bb8 [SIL] Fix linkage of external property wrapper backing initializers
This should be based on the access level of the
function they're attached to.

rdar://100240367
2022-09-27 11:13:20 +01:00
Hamish Knight
b51d82d04f [SIL] Refactor linkage computation
- Factor out the adding of 'external' for non-definitions
- Factor out computation of the linkage limit

Intended to be NFC.
2022-09-27 11:13:19 +01:00
Nate Chandler
5d14610043 [SILOptimizer] Preserve arg attrs at cloning.
Arguments are copied into new cloned functions in a number of places.
Wherever that happens, be sure to transfer the attributes as well.
2022-09-26 16:55:50 -07:00
Andrew Trick
ea3947ac44 Merge pull request #61291 from atrick/debug-trace
Add debug_value [trace] attribute.
2022-09-26 14:52:14 -07:00
Andrew Trick
c52e3b9b51 Merge pull request #61288 from atrick/inline-sil-getters
Define critical SILInstruction and SILBasicBlock getters inline.
2022-09-26 12:02:42 -07:00
Anton Korobeynikov
2f5492f572 Implement several peephole optimizations to unblock further optimizations of autodiff code (#60520)
* Implement several peephole optimizations to unblock further optimizations of autodiff code

1. Simplify differentiable_function_extract of differentiable_function.
Before:
%x = differentiable_function(%orig, %jvp, %vjp)
%y = differentiable_function_extract [original] %x
After:
%y = %orig

2. Push conversion instructions inside of differentiable_function.
This unblocks inlining and specialization.
Before:
%x = differentiable_function(%orig, %jvp, %vjp)
%y = convert_escape_to_noescape %x
After:
%orig' = convert_escape_to_noescape %orig
%jvp' = convert_escape_to_noescape %jvp
%vjp' = convert_escape_to_noescape %vjp
%y = differentiable_function(%orig', %jvp', %vjp')

3. Another peephole is needed for reordering function conversion instructions to enable full inlining:
(convert_escape_to_noescape (convert_function (thin_to_thick_function x)))
=>
(convert_escape_to_noescape (thin_to_thick_function (convert_function x)))

* Remove broken disabled folding transform:
  - It is disabled
  - It is broken
  - It is certainly not something mandatory

Co-authored-by: Dan Zheng <danielzheng@google.com>
2022-09-26 09:44:04 -07:00
Andrew Trick
87d7237181 Add debug_value [trace] attribute.
This lets us write optimizer unit tests and selectively debug the
optimizer in general. We'll be able trace analyses and control
optimization selectively for certain values.

Adding a trace flag to debug_value is the easiest way to start using
it experimentally and develop the rest of the infrastructure. If this
takes off, then we can consider a new `trace_value`
instruction. For now, reusing debug_value is the least intrusive way to
start writing liveness unit tests.
2022-09-25 22:44:15 -07:00
Andrew Trick
ecc4474095 Define critical SILInstruction and SILBasicBlock getters inline.
It makes no sense to operate on the block's instruction list without
also including SILBasicBlock.h anyway. Similarly, it doesn't make
sense to query the entry block without including SILFunction.h.

Now we can call these simple getters in critical-path loops assuming
they are as cheap as a load. I was avoiding calling these in critical
path code, which resulted in less readability and consistency across
the code base.
2022-09-25 20:31:26 -07:00
Dario Rexin
210c68d8aa [SILOptimizer] Add prespecialization for arbitray reference types (#58846)
* [SILOptimizer] Add prespecialization for arbitray reference types

* Fix benchmark Package.swift

* Move SimpleArray to utils

* Fix multiple indirect result case

* Remove leftover code from previous attempt

* Fix test after rebase

* Move code to compute type replacements to SpecializedFunction

* Fix ownership when OSSA is enabled

* Fixes after rebase

* Changes after rebasing

* Add feature flag for layout pre-specialization

* Fix pre_specialize-macos.swift

* Add compiler flag to benchmark build

* Fix benchmark SwiftPM flags
2022-09-22 16:29:01 -07:00
Michael Gottesman
c16eadb31b Merge pull request #61193 from gottesmm/moveonly-deinits
[move-only] Implement support for move only deinits
2022-09-22 05:22:19 -07:00
Adrian Prantl
1f8a5d6045 Merge pull request #61168 from adrian-prantl/99874371
Disable SROA debug info for variables with expressions
2022-09-21 08:43:38 -07:00
Michael Gottesman
c54acc83e2 [move-only] Add the ability to specify a deinit at the SIL level for a move only type.
Specifically, we get an additional table like thing called sil_moveonlydeinit. It looks as follows:

sil_moveonlydeinit TYPE {
  @FUNC_NAME
}

It always has a single entry.
2022-09-20 15:19:31 -07:00
Michael Gottesman
182df6e80d [move-only] Add helper method SILType::isMoveOnlyType().
This allows one to know that the type is for a first class move only type and
not a move only wrapped type.

Previously, I did this by checking type.isMoveOnly() &&
!type.isMoveOnlyWrapped(). Better to just have a helper that semantically does
this rather than using a code pattern that doesn't semantically say what it
actually does unless one knows the intent.
2022-09-20 15:19:31 -07:00
Adrian Prantl
90bbe517f9 Disable SROA debug info for variables with expressions.
Currently the SROA just overwrites already-existing expressions on
variables. When SROA is recursively run on a data structure this leads to
nonsensical expressions such as

  type $*Outer, expr op_fragment:#Inner.x

instead of

  type $*Outer, expr op_fragment:#Outer.inner op_fragment:#Inner.x

The (nonsensical) LLVM IR generated from this violates some assumptions in LLVM
for example, if a struct has multiple members of the same type, you can end up
with multiple dbg.declare intrinsics claiming to describe the same variable). As
a quick fix, this patch detects this situation and drops the debug info. A
proper fix shouldn't be too difficult to implement though.

rdar://99874371
2022-09-19 16:10:18 -07:00
Slava Pestov
e584195f44 SIL: Use the right generic signature for computing SIL function type for coroutine accessors
The function type's generic signature will have already been dropped
at this point if all generic parameters were fully concrete, so use
the original generic signature to compute the reduced type of the
yield type.

Fixes https://github.com/apple/swift/issues/61040.
2022-09-19 18:11:32 -04:00
Hamish Knight
20830cc2fb [Profiler] Avoid profiling unavailable decls
Such decls don't provide useful coverage info.

rdar://83253091
2022-09-19 10:06:36 +01:00
Allan Shortlidge
6b61e37364 SILGen: Function availability for linkage should use @_backDeploy OS version if present.
When computing the availability of a `SILFunction` for linkage the OS version specified in the `@_backDeploy` attribute should be preferred over the version in the `@available` attribute. This ensures that the corresponding symbol is weakly linked when deploying to older OSes than the back deploy "before" version.

Resolves rdar://99962885
2022-09-16 17:05:35 -07:00
Michael Gottesman
070f00458e Merge pull request #61115 from gottesmm/pr-de2fdb0e80ff1b131cdb7ab55bb70873f50c1726
[move-only] Add support for trivial move only lets/args.
2022-09-15 13:46:06 -07:00
Hamish Knight
50367ecfa6 [Profiler] Don't walk into property initializer closures
These don't have a parent, but still shouldn't be
walked into. Be sure to check that the SILDeclRef
is for a closure.

rdar://99963912
2022-09-15 17:01:44 +01:00
Hamish Knight
9bb87a5f50 [Profiler] NFC: Invert isUnmapped
IMO it's clearer this way.
2022-09-15 17:01:43 +01:00
Hamish Knight
b7d3f502fe [Profiler] Limit decl walking behavior
Unify the mapped behavior with the unmapped
behavior and only ever walk into a pattern binding
decls, top-level code decls, and non-nested
functions. This avoids walking into e.g nested
types, leading to duplicate coverage.

We don't need to handle the unmapped behavior
separately, as top-level code decls are always
explicit, and non-nested functions are always
checked when we create the profiler.

rdar://99963912
2022-09-15 17:01:43 +01:00
Hamish Knight
30568a60a8 [Profiler] Don't run PGO on unmapped decls
This avoids an unnecessary walk, as we don't have
any interesting profile data for such decls.
2022-09-15 17:01:42 +01:00
Michael Gottesman
31d29be8a6 [move-only] Add support for trivial move only lets/args.
This also enables address support for trivial types, but I need to do some
additional fixes until that is ready. But makes sense to get things in one step
at a time.
2022-09-14 17:03:41 -07:00
Hamish Knight
bf9b4b92fc [Profiler] Only map implicit getters for lazy vars
This is the only implicit getter case we care
about, the rest do not contain user-written code.
This means that we now otherwise only ever map
explicit decls, which we need to SILGen anyway. As
such I believe this should fix rdar://39332957.

We do still potentially map implicit expressions,
but should only do so for explicit property
initializers. There is one remaining bug where we
can map an implicit property wrapper backing
initalizer, which I'm tracking in rdar://99931619.
2022-09-14 20:51:52 +01:00
Hamish Knight
5039c1c3f1 [Profiler] NFC: Remove unnecessary parameter
`SILProfiler::create` is only ever called when
emitting a definition, so this check is redundant.
2022-09-14 20:51:51 +01:00
Puyan Lotfi
789e6950c6 Merge pull request #61000 from plotfi/const-ref-in_guaranteed
[C++-Interop] Import `const &T` function parameters as @in_guaranteed
2022-09-13 22:56:05 -04:00
Hamish Knight
b582dbfa26 [Profiler] Clean up walking code a little
Use the new explicit ASTWalker actions to factor
out the skipping logic, ensuring to apply it in
post-visitation too, which fixes a PCMacro crash
(though I don't believe this is a configuration
that ever actually comes up). Also tighten up
invariants such that an `IfExpr` must appear
within an existing region.
2022-09-13 15:41:36 +01:00