Commit Graph

2768 Commits

Author SHA1 Message Date
swift-ci
184e83ed0c Merge pull request #61464 from nate-chandler/branch/rdar99618502/OnoneLifetimes
[CanonicalizeOSSALifetime] Extend Onone lifetimes.
2022-10-08 20:13:30 -07:00
Nate Chandler
03253dbf48 [CanonicalizeOSSALifetime] Extend Onone lifetimes.
To improve the debugging experience of values whose lifetimes are
canonicalized without compromising the semantics expressed in the source
language, when canonicalizing OSSA lifetimes at Onone, lengthen
lifetimes as much as possible without incurring copies that would be
eliminated at O.

rdar://99618502
2022-10-08 16:08:35 -07:00
Nate Chandler
0289a6b8ce [Gardening] Tweaked whitespace in comment. 2022-10-08 16:08:35 -07:00
Nate Chandler
701ff06976 [Gardening] Clarified comment. 2022-10-08 16:08:35 -07:00
Nate Chandler
c1bbfc1f8a [CanonicalizeOSSALifetime] Separated steps.
Rather than having finding the boundary be a single combined step,
separate finding the original boundary from extending that boundary.
This enables inserting an optional step between those steps, namely to
extend unconsumed liveness to its original extent at Onone.
2022-10-08 16:08:35 -07:00
Nate Chandler
8cf65c6c8a [CanonicalizeOSSALifetime] Handle live phis.
It is possible for phis to be marked live.  With guaranteed phis, they
will be the last uses and be non-consuming.  In this case, the
merge block will have multiple predecessors whose terminators are on the
boundary.  When inserting destroys, track whether a merge point has been
visited previously.

To facilitate this, restructure the boundary extension and destroy
insertion code.

Previously, the extender was building up a list of places at which to
insert destroys.  In particular it was using the "boundary edge"
collection for all blocks at the beginning of which a destroy should be
created.  In particular, it would add merge blocks. Such blocks are not
boundary blocks.

Here, the extender produces a PrunedLivenessBoundary which doesn't
violate that invariant.

This required some changes to the destroy insertion code to find where
to insert destroys.  It is now similar to
PrunedLivenessBoundary::visitInsertionPoints and could be used as a
template for a PrunedLivenessBoundary::visitBoundaryPoints through which
::visitInsertionPoints might be factored.
2022-10-08 15:56:23 -07:00
Holly Borla
38a2c8218b [Requirement] Rename RequirementKind::SameCount to SameShape. 2022-10-06 20:48:40 -07:00
Nate Chandler
4fc42a63a3 [CanonicalizeOSSALifetime] Renamed file.
Matched to the name of the utility.
2022-10-05 17:07:05 -07:00
Nate Chandler
8a3dc109ec [CanonicalizeOSSABoundary] Used ::computeBoundary.
Previously, CanonicalizeOSSALifetime had its own copy of a variation of
the code for computing the liveness boundary that PrunedLiveness has.
Here, it is switched over to using PrunedLiveness' version.

In order to do that without complicating the interface for PrunedLivness
by adding a visitor, the extra bookkeeping that was being done for
destroy_values and debug_values is dropped.  Instead, after getting an
original boundary from PrunedLiveness::computeBoundary, the boundary is
extended out to preexisting destroys which are not separated from the
original boundary by "interesting" instructions.
2022-10-05 17:07:05 -07:00
Nate Chandler
ea3d6e39a1 [CanonicalizeOSSALifetime] Swapped ignore meaning.
In various places, CanonicalizeOSSALifetime checks whether instructions
are "interesting enough to be worth hoisting over" for the purpose of
avoiding hoisting over instructions that would result in churning and
failing to find a fixed point when iterating in CopyPropagation.
Elsewhere, ::ignoredByDestroyHoisting is used.  Previously,
findDestroyOnCFGEdge used isIncidentalUse.  Replaced that useage with
::ignoredByDestroyHoisting.
2022-10-05 10:53:18 -07:00
Nate Chandler
fad35bb150 [NFC] Adopted InstructionSetVector.
Replaced a useage of SmallSetVector.
2022-10-05 10:53:18 -07:00
swift-ci
19c6894416 Merge pull request #61437 from atrick/ossa-fold-noescape
Fix lexical destroy folding to handle PointerEscape
2022-10-04 18:23:26 -07:00
Andrew Trick
c89d0d075e Fix lexical destroy folding to handle PointerEscape
We can't prevent using an unchecked_bitwise_cast in SIL without
protecting the base value's lifetime. So handle it gracefully.

Observed by Nate Chandler
2022-10-04 16:04:36 -07:00
Andrew Trick
619a638e34 ScopedAddressUtils - clarify the API used for transitive liveness.
Begin to distnguish logic that relies on complete OSSA lifetimes from
the logic that computes transitive uses.
2022-10-04 13:27:47 -07:00
Andrew Trick
da4f1b9a70 Add InnerBorrowKind and AddressUseKind to PrunedLiveness API
The API for computing simple liveness now returns a
SimpleLiveRangeSummary. Callers need to decide how to handle reborrows
and pointer escapes. If either condition exists then the resulting
liveness does not necessarily encapsulate the definition's ownership.

Fixes some number of latent bugs w.r.t. liveness clients.
2022-10-04 13:27:47 -07:00
Andrew Trick
464e353028 Fix ScopedAddressValue::computeLiveness.
Return the AddressUseKind.

Fixes a bug in extendStoreBorrow where it was looking at an
uninitialized liveness result whenever a pointer escape was present.
2022-10-04 13:27:47 -07:00
Andrew Trick
40e03ef782 Update passes to use SSAPrunedLiveness or MultiDefPrunedLiveness 2022-10-04 13:27:47 -07:00
Andrew Trick
ca503b54b7 Redesign PrunedLiveness APIs, introducing live ranges
First restore the basic PrunedLiveness abstraction to its original
intention. Move code outside of the basic abstraction that polutes the
abstraction and is fundamentally wrong from the perspective of the
liveness abstraction.

Most clients need to reason about live ranges, including the def
points, not just liveness based on use points. Add a PrunedLiveRange
layer of types that understand where the live range is
defined. Knowing where the live range is defined (the kill set) helps
reliably check that arbitrary points are within the boundary. This
way, the client doesn't need to be manage this on its own. We can also
support holes in the live range for non-SSA liveness. This makes it
safe and correct for the way liveness is now being used. This layer
safety handles:

- multiple defs
- instructions that are both uses and defs
- dead values
- unreachable code
- self-loops

So it's no longer the client's responsibility to check these things!

Add SSAPrunedLiveness and MultiDefPrunedLiveness to safely handle each
situation.

Split code that I can't figure out into
DiagnosticPrunedLiveness. Hopefully it will be deleted soon.
2022-10-04 13:27:44 -07:00
Josh Soref
730b16c569 Spelling siloptimizer
* access
* accessed
* accesses
* accessor
* acquiring
* across
* activated
* additive
* address
* addresses'
* aggregated
* analysis
* and
* appropriately
* archetype
* argument
* associated
* availability
* barriers
* because
* been
* beginning
* belongs
* beneficial
* blocks
* borrow
* builtin
* cannot
* canonical
* canonicalize
* clazz
* cleanup
* coalesceable
* coalesced
* comparisons
* completely
* component
* computed
* concrete
* conjunction
* conservatively
* constituent
* construct
* consuming
* containing
* covered
* creates
* critical
* dataflow
* declaration
* defined
* defining
* definition
* deinitialization
* deliberately
* dependencies
* dependent
* deserialized
* destroy
* deterministic
* deterministically
* devirtualizes
* diagnostic
* diagnostics
* differentiation
* disable
* discipline
* dominate
* dominates
* don't
* element
* eliminate
* eliminating
* elimination
* embedded
* encounter
* epilogue
* epsilon
* escape
* escaping
* essential
* evaluating
* evaluation
* evaluator
* executing
* existential
* existentials
* explicit
* expression
* extended
* extension
* extract
* for
* from
* function
* generic
* guarantee
* guaranteed
* happened
* heuristic
* however
* identifiable
* immediately
* implementation
* improper
* include
* infinite
* initialize
* initialized
* initializer
* inside
* instruction
* interference
* interferes
* interleaved
* internal
* intersection
* intractable
* intrinsic
* invalidates
* irreducible
* irrelevant
* language
* lifetime
* literal
* looks
* materialize
* meaning
* mergeable
* might
* mimics
* modification
* modifies
* multiple
* mutating
* necessarily
* necessary
* needsmultiplecopies
* nonetheless
* nothing
* occurred
* occurs
* optimization
* optimizing
* original
* outside
* overflow
* overlapping
* overridden
* owned
* ownership
* parallel
* parameter
* paths
* patterns
* pipeline
* plottable
* possible
* potentially
* practically
* preamble
* precede
* preceding
* predecessor
* preferable
* preparation
* probably
* projection
* properties
* property
* protocol
* reabstraction
* reachable
* recognized
* recursive
* recursively
* redundant
* reentrancy
* referenced
* registry
* reinitialization
* reload
* represent
* requires
* response
* responsible
* retrieving
* returned
* returning
* returns
* rewriting
* rewritten
* sample
* scenarios
* scope
* should
* sideeffects
* similar
* simplify
* simplifycfg
* somewhat
* spaghetti
* specialization
* specializations
* specialized
* specially
* statistically
* substitute
* substitution
* succeeds
* successful
* successfully
* successor
* superfluous
* surprisingly
* suspension
* swift
* targeted
* that
* that our
* the
* therefore
* this
* those
* threshold
* through
* transform
* transformation
* truncated
* ultimate
* unchecked
* uninitialized
* unlikely
* unmanaged
* unoptimized key
* updataflow
* usefulness
* utilities
* villain
* whenever
* writes

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2022-10-03 18:31:33 -04:00
nate-chandler
4dec19388b Merge pull request #61344 from nate-chandler/copy-propagation/remove-poison
[CopyPropagation] Removed poison mode.
2022-09-29 10:15:07 -07:00
Nate Chandler
129dadbe70 [CopyPropagation] Removed poison mode.
The Onone strategy will be to shorten lifetimes as little as possible
while eliminating as many copies as are eliminated at -O.
2022-09-28 17:13:24 -07: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
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
Meghana Gupta
7f63b4b0d2 Merge pull request #61273 from meg-gupta/fixsbicloner
Fix an edge case in GenericCloner which was not generating end_borrows for store_borrow
2022-09-23 16:53:18 -07:00
Dario Rexin
b44ee77b96 [SILOptimizer] Properly report unexpected protocol requirements in type erasure (#61271) 2022-09-23 14:50:55 -07:00
Meghana Gupta
7c4d4b0671 Fix an edge case in GenericCloner which was not generating end_borrows for store_borrow
Generic Cloner creates store_borrow for in_guaranteed args in OSSA. We use PrunedLiveness
to compute the boundary of store_borrow for inserting end_borrows. However, if there is an escape
boundary cannot be found, and we insert end_borrows at function exits. FunctionExists are populated while cloning.
There is an edgecase, where the Generic Cloner is explicitly creating return instructions, these were not inserted
in FunctionExits, thereby missing an end_borrow on that path. This PR fixes it.

rdar://99874076
2022-09-23 11:38:07 -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
Hamish Knight
b12015c343 [SIL] Introduce the increment_profiler_counter instruction
This is a dedicated instruction for incrementing a
profiler counter, which lowers to the
`llvm.instrprof.increment` intrinsic. This
replaces the builtin instruction that was
previously used, and ensures that its arguments
are statically known. This ensures that SIL
optimization passes do not invalidate the
instruction, fixing some code coverage cases in
`-O`.

rdar://39146527
2022-09-07 17:55:13 +01:00
Michael Gottesman
4dc6e6ecc4 [move-keyword] Remove old implementation.
By using the keyword instead of the function, we actually get a much simpler
implementation since we avoid all of the machinery of SILGenApply. Given that we
are going down that path, I am removing the old builtin implementation since it
is dead code.

The reason why I am removing this now is that in a subsequent commit, I want to
move all of the ownership checking passes to run /before/ mandatory inlining. I
originally placed the passes after mandatory inlining since the function version
of the move keyword was transparent and needing to be inlined before we could
process it. Since we use the keyword now, that is no longer an issue.
2022-09-04 01:19:01 -07:00
nate-chandler
cd04e9eb3b Merge pull request #60792 from nate-chandler/canonicalize_ossa_lifetime/access_scope_ends
[CopyProp] Don't extend lifetime over end_access.
2022-08-26 15:59:16 -07:00
Nate Chandler
477461b89d [CopyProp] Don't extend lifetime over end_access.
If there is a consuming use of the value inside an access scope, the
lifetime should not be extended over the end_access instruction.
2022-08-26 11:13:37 -07:00
Meghana Gupta
9a4a21d7eb Merge pull request #59541 from meg-gupta/mem2regstoreborrowpr
Handle store_borrow in SILMem2Reg and some other fixes
2022-08-26 09:36:34 -07:00
nate-chandler
1fdbbbbf8c Merge pull request #60756 from nate-chandler/rdar99087653
[SILInliner] Handled null access storage base.
2022-08-24 19:20:18 -07:00
Nate Chandler
70213f0630 [SILInliner] Handled null access storage base.
During inlining, lexical-ness of arguments is preserved.  In the case of
address arguments that come from alloc_stacks, the alloc_stacks are
marked lexical.  The base of the storage which is passed to the address
is obtained via AccessStorageWithBase.  In some circumstances, a base is
not found.  Handled that case by changing a dyn_cast of the base to a
dyn_cast_or_null.

rdar://99087653
2022-08-24 14:52:14 -07:00
Slava Pestov
5c32f2136e AST: Introduce RequirementKind::SameCount 2022-08-23 11:12:00 -04:00
Meghana Gupta
13223f6edf Remove fake use of lexical copy 2022-08-22 15:27:52 -07:00
Nate Chandler
0383415d5a [SILInliner] Respect explicit argument lifetimes. 2022-08-21 21:44:53 -07:00
Meghana Gupta
b7c23edfe6 Fix SILCombine of partial_apply to correctly extend store_borrow when needed 2022-08-16 15:08:23 -07:00
Meghana Gupta
46bdf131d7 Fix store_borrow generation in GenericCloner 2022-08-16 15:08:23 -07:00
Meghana Gupta
9ce2681af2 Update utility which checks if scope ending instructions in OSSA can be trivially deleted 2022-08-16 15:08:22 -07:00
swift-ci
ec645e3146 Merge pull request #60540 from adrian-prantl/97617367
SILInliner: Fix scope & source location of terminator instructions.
2022-08-15 13:26:59 -07:00
nate-chandler
feecc515d2 Merge pull request #60478 from nate-chandler/lexical_lifetimes/optimize_more_alloc_stack_destroys
[SILOpt] Hoist destroys for non-lexical alloc_stacks more aggressively.
2022-08-15 10:36:24 -07:00
Adrian Prantl
742328dbc4 SILInliner: Fix scope & source location of terminator instructions.
Instead of cloning existing instructions (and correctly remapping
their scopes) SILCloner just creates a fresh instruction for the
terminator and forgets to set the scope accordingly. This bug flew
under the radar because the SIL verifier for continiuous scopes
doesn't look at terminator instructions.

rdar://97617367
2022-08-15 09:37:41 -07:00
Nate Chandler
904266cbf2 [SILInliner] Mark alloc_stacks lexical.
When inlining a function to which an alloc_stack is passed (via any
convention that's not all of mutating, exclusive, and inout), mark the
alloc_stack as lexical.  Otherwise, destroy_addrs could be hoisted
through the inlined function in a way inconsistent with how they were
hoisted through the callee prior to inlining.
2022-08-12 11:37:19 -07:00
Slava Pestov
7d8f3e6b63 AST: Change return type of Requirement::subst() to Requirement
Instead of returning None, let callers check hasError() if they need to.

Fixes rdar://problem/98565072.
2022-08-12 14:03:57 -04:00
Michael Gottesman
accc2820f8 Merge pull request #60511 from gottesmm/pr-0796eed23b86f5812f817b15b928dbe11485c361
[move-only-addresses] Slicing some patches off of the larger patch.
2022-08-11 16:25:10 -07:00
Michael Gottesman
5baf2af88a [sil] Add a new instruction called explicit_copy_addr.
This is exactly like copy_addr except that it is not viewed from the verifiers
perspective as an "invalid" copy of a move only value. It is intended to be used
in two contexts:

1. When the move checker emits a diagnostic since it could not eliminate a copy,
we still need to produce valid SIL without copy_addr on move only types since we
will hit canonical SIL eventually even if we don't actually codegen the SIL. The
pass can just convert said copy_addr to explicit_copy_addr and everyone is
happy.

2. To implement the explicit copy function for address only types.
2022-08-11 11:40:53 -07:00
Slava Pestov
87871d7347 AST: Rename getOpenedArchetypeSignature() to getOpenedExistentialSignature() 2022-08-10 23:44:36 -04:00
Slava Pestov
9d96ed940f AST: Rename 'canonical wrt. generic signature' to 'reduced'
We had two notions of canonical types, one is the structural property
where it doesn't contain sugared types, the other one where it does
not contain reducible type parameters with respect to a generic
signature.

Rename the second one to a 'reduced type'.
2022-08-09 12:46:31 -04:00
Erik Eckstein
e8e61a9565 SIL: create cond_fail 1 instead of builtin "int_trap" for unconditional failures
`int_trap` doesn't provide a failure message, which makes crash reports hard to understand.
This is mostly the case for optimized casts which fail.

rdar://97681511
2022-07-28 16:05:07 +02:00