Commit Graph

6583 Commits

Author SHA1 Message Date
Michael Gottesman
ac7e28a57e [alloc-stack-hoisting] Handle alloc_stack [move] correctly.
This is just a quick fix to stop us from dropping live values such as m in the
following example:

```
public func addressOnlyVarTest<T : P>(_ x: T) {
    var k = x
    k.doSomething()
    let m = _move(k)
    m.doSomething()
    k = x
    k.doSomething()
}
```

Before this change, we would just drop m and one wouldn't even see it in the
debugger.

I am only doing this currently for cases where when we merge at least one
alloc_stack was moved. The reason why is that to implement this correctly, I
need to use llvm.dbg.addr and changing the debug info from using
llvm.dbg.declare -> llvm.dbg.addr requires statistics and needs to be done a
little later in the swift development process. If one of these alloc_stack had
the [moved] marker attached to it, we know the user /did/ use move so they have
in a sense opted into having a move function effect its program so we are only
changing how new code appears in the debugger.
2022-02-22 20:36:19 -08:00
Konrad `ktoso` Malawski
c47d685a0b [SIL] SIL block names available in NOT-NOT-DEBUG builds.
The proper way to guard this code is `#ifndef NDEBUG`

Also fixed the formatting of the macros.
2022-02-22 11:49:30 +09:00
Rintaro Ishizaki
7486cd1c21 [SwiftCompiler] Move common bridging facilities to 'Basic'
A preparation for AST/DiagnosticEngine bridging
2022-02-20 22:06:39 -08:00
Nate Chandler
d227cef874 [MemAccessUtils] Visit access as unique storage uses.
Add a new member functino UniqueStorageUseVisitor::visitBeginAccess and
call it when GatherUniqueStorageUses runs.
2022-02-18 10:10:17 -08:00
Allan Shortlidge
212043840f SIL: Add flag to SILDeclRef for back deployment thunks. 2022-02-17 11:28:12 -08:00
Arnold Schwaighofer
62ec31a462 Merge pull request #41338 from aschwaighofer/reuse_contiguous_array_storage_metadata
Reuse `_ContiguousArrayStorage<AnyObject>` metadata for any class or objc generic type
2022-02-17 12:47:23 -05:00
Andrew Trick
afde39db1b Merge pull request #41366 from atrick/addrlower-silapi
Many minor/obvious SIL API improvements that address lowering depends on
2022-02-16 17:37:12 -08:00
Andrew Trick
59eea142c4 Add OwnershipForwardingMixin::hasSameRepresentation and verify
Also add OwnershipForwardingMixin::isAddressOnly.
2022-02-16 12:23:01 -08:00
Andrew Trick
ba66d4ae39 OwnershipUtils comment 2022-02-16 12:23:01 -08:00
Andrew Trick
8f20da7024 Add computeDominanceFrontier().
A trivial utility that returns the leaf blocks in a dominance subtree.
2022-02-16 12:23:01 -08:00
Arnold Schwaighofer
9f2b6a4ebb Reuse _ContiguousArrayStorage<AnyObject> metadata for any class or objc generic type
Reduces the number of _ContiguousArrayStorage metadata.

In order to support constant time bridging we do need to set the correct
metadata when we bridge to Objective-C. This is so that the type check
succeeds when bridging back from Objective-C to reuse the storage
instance rather than bridging the elements.

To support dynamically setting the `_ContiguousArrayStorage` element
type i needed to add support for optimizing `alloc_ref_dynamic`
throughout the optimizer.

Possible future improvements:
* Use different metadata such that we can disambiguate native Swift
  classes during destruction -- allowing native release rather then unknown
  release usage.
* Optimize the newly added semantic function
  getContiguousArrayStorageType

rdar://86171143
2022-02-16 07:55:34 -08:00
Anthony Latsis
352b3a2f6d Merge pull request #41201 from AnthonyLatsis/opened-root
AST: Remove OpenedArchetypeType::getOpenedExistentialType()
2022-02-16 09:07:30 +03:00
Andrew Trick
f6ba6332a6 Allow SIL convention overriding in operand ownership verification
This lets the SILBuilder's verification continue to run during
address lowering before the SIL stage has been updated.
2022-02-15 13:28:47 -08:00
Andrew Trick
2cc58fea71 Add a return value to SILBuilder::emitStoreBorrowOperation 2022-02-15 13:28:47 -08:00
Andrew Trick
18f8507e89 ApplySite::getPseudoResult
This returns the fake tuple value for either an apply or
try_apply. This is not actually a result. It is composed of the
results.
2022-02-15 13:28:47 -08:00
Andrew Trick
83b01d8ebe Improve the SILPhiArgument API
This subclass of SILArgument should be eliminated--it's not always a
phi, and whether it is a "phi argument" has nothing whatsoever to do
with the opcode. That is a property of a value's uses, not a property of the
value.

Until then, provide a logical and useful API within the type. This
often avoids the need to explicitly cast to a SILPhiArgument type and
avoids a lot of boilerplate in code that deals with phis.

Note: PhiOperand and PhiValue are improved abstractions on top of this
API. But the SILArgument-level API is still an important bridge
between SILArgument and other phi abstractions.
2022-02-15 13:28:46 -08:00
Andrew Trick
05224aaa1f Improve the SILInstruction::getOperandValues() API.
Add NonTypeDependentOperandToValue predicate for composability.

Add a getNonTypeDependentOperandValues(), which can be used as a functor.

The skipTypeDependentOperands parameter complicated the API.
2022-02-15 13:24:29 -08:00
nate-chandler
23252935f6 Merge pull request #41358 from nate-chandler/lexical_lifetimes/shrink-borrow-scope/adopt-reachability
[ShrinkBorrowScope] Adopt BackwardReachability.
2022-02-15 07:07:30 -08:00
Michael Gottesman
edbe4db7af [move-function] Add initial debug info support to move checker passes.
Specifically in this commit we:

1. Add support to the move checkers for marking alloc_stack that are moved or
the debug_value of values that are moved with the [moved] flag. In a subsequent
PR, I am going to add support in IRGen for emitting llvm.dbg.addr instead of
llvm.dbg.declare for such variables. This will ensure that debug info for values
that aren't moved get the same codegen.

2. I changed the move checkers to begin emitting debug_value undef at the move
site. This ensures that after that point the moved value will be unavailable in
the debugger.

3. I also found a small bug that was around terminators that was exposed by some
of my tests.

What is not in this patch:

1. IRGen part of this patch.
2. DebugInfoCanonicalization that pushes debug_info into coroutine func lets to
avoid issues with Swift's coroutine splitting at the LLVM level.

rdar://85020571
2022-02-14 18:41:43 -08:00
Michael Gottesman
375ce353f2 [move-function] Add a flag to alloc_stack and debug_value that states that they describe an address/value that was moved at some point locally in the function.
The main effect of this will be that in IRGen we will use llvm.dbg.addr instead
of llvm.dbg.declare. We must do this since llvm.dbg.declare implies that the
given address is valid throughout the program.

This just adds the instructions/printing/parsing/serialization/deserialization.

rdar://85020571
2022-02-14 17:56:03 -08:00
Nate Chandler
45afec6e0a [SIL] Added SILBasicBlock::hasPhi. 2022-02-14 17:12:47 -08:00
Slava Pestov
a1c03db381 AST: Generalize ProtocolDecl::getRequirementSignature() to a new RequirementSignature type
The RequirementSignature generalizes the old ArrayRef<Requirement>
which stores the minimal requirements that a conforming type's
witnesses must satisfy, to also record the protocol typealiases
defined in the protocol.
2022-02-13 00:24:23 -05:00
Andrew Trick
c67b72b57e Merge pull request #41344 from atrick/fix-open-existential
Fix a miscompile in existential specialization during SILCombine.
2022-02-11 22:09:07 -08:00
nate-chandler
63161e6ee5 Merge pull request #41228 from nate-chandler/lexical_lifetimes/owned_function_args_are_lexical
[SIL] Make owned function arguments lexical.
2022-02-11 18:11:59 -08:00
Andrew Trick
07e6cfc8ae Fix a miscompile in existential specialization during SILCombine.
The transformation propagations stack-initialized values. It checks
for any writes to the stack before doing so. OpenExistial instructions
now have a mutable property, so that also needs to be checked.

Add OpenExistentialAddrInst::isRead(SILInstruction).

Replace an `isa<OpenExistentialAddrInst>(user)` check with
`OpenExistentialAddrInst::isRead(user).

Fixes rdar://88664423 (SR-15791: Miscompile under -O with mutating protocol method)
2022-02-11 13:10:14 -08:00
Nate Chandler
2aa70aff60 [Gardening] Tweaked comment. 2022-02-10 16:28:42 -08:00
Nate Chandler
d23139ff15 [OwnershipUtils] Added find for simple value. 2022-02-10 16:28:35 -08:00
Michael Gottesman
0e3bca99f5 [debug-var] When comparing address debug_value against value debug_value remove the diexpr from the address SILDebugVariable.
Otherwise they will never compare the same. Also restore the test that was
updated for the previous commit to its old state. I did this to ensure that each
commit would compile successfully and so that I could show the test associated
with this commit.
2022-02-09 14:06:23 -08:00
Michael Gottesman
ae8bc910ac [nfc] Move SILDebugVariable from SILInstruction.h -> SILDebugVariable.h
Just batching this with another NFC commit in preparation for a larger later
commit.
2022-02-09 13:59:02 -08:00
Michael Gottesman
0d0bf13f60 Fix a thinko 2022-02-09 12:27:41 -08:00
Michael Gottesman
204921687b Merge pull request #41208 from gottesmm/pr-fae72e24b0a9042a4b469ca911c5560195e2cd5a
Experiment. Add DIExpr to SILDebugVariable::operator==
2022-02-08 23:44:55 -08:00
Robert Widmann
bb7e085dd8 Merge pull request #40987 from 3405691582/StdintHack
Work around a possible platform/modules bug.
2022-02-08 11:04:13 -08:00
nate-chandler
fe74a7dc79 Merge pull request #41113 from nate-chandler/lexical_lifetimes/destroy_folding/add
[CopyPropagation] Added lexical destroy folding.
2022-02-04 22:23:21 -08:00
Michael Gottesman
0fb21094d7 Experiment. Add DIExpr to SILDebugVariable::operator== 2022-02-04 10:18:03 -08:00
Anthony Latsis
65d4af7e8c [NFC] SILCloner: Rename 'remapOpenedType' → 'remapRootOpenedType' 2022-02-04 16:26:00 +03:00
Anthony Latsis
91bd2b1803 AST: Remove OpenedArchetypeType::getOpenedExistentialType()
Clients can explicitly ask for the opened existential type on the archetype's generic environment,
or use `getExistentialType` to obtain a specific archetype's upper bounds.
2022-02-04 16:22:50 +03:00
swift-ci
f05f23147f Merge pull request #41154 from ktoso/wip-sil-emit-ref-recordArg 2022-02-02 10:41:14 -08:00
Nate Chandler
2c0a35aa54 [PrunedLiveness] Added areUsesOutsideBoundary. 2022-02-02 09:58:25 -08:00
Konrad `ktoso` Malawski
48db739db0 [Distributed] Record generic substitution types for invocation 2022-02-02 18:12:32 +09:00
eeckstein
00b795fe11 Merge pull request #41120 from eeckstein/capture-propagate-keypaths
CapturePropagation: specialize closures which capture a constant keypath
2022-02-02 07:54:47 +01:00
Anthony Latsis
c7fd60f2dd Merge pull request #39492 from AnthonyLatsis/se-309-2
SE-309: Covariant erasure for dependent member types
2022-02-02 07:07:17 +03:00
Anthony Latsis
60c85b0108 SILGen: Handle nested opened archetypes and add tests 2022-02-02 02:10:05 +03:00
Konrad `ktoso` Malawski
67acad7b5c Merge pull request #41118 from ktoso/wip-sil-bb-names
[SIL] Allow giving debug names to SILBasicBlocks
2022-02-02 08:04:31 +09:00
Joe Groff
23557b86da Merge pull request #41111 from jckarter/infinite-type-lowering-bailout
SIL: Detect and bail out on infinite aggregates.
2022-02-01 09:19:07 -08:00
Konrad `ktoso` Malawski
d7ba6c6fc6 store std::string, print before BB identifier 2022-02-01 23:31:32 +09:00
Erik Eckstein
34d79e3799 CapturePropagation: specialize closures which capture a constant keypath
This optimizes keypath-closures, like
```
   a.map { \.x }
```
It results in a significant performance improvement for such code patterns.

rdar://87968067
2022-02-01 09:22:07 +01:00
Konrad `ktoso` Malawski
d96cb1dbaf [SIL] Allow giving debug names to SILBasicBlocks 2022-02-01 14:35:03 +09:00
Joe Groff
fe19399585 SIL: Detect and bail out on infinite aggregates.
Sema diagnoses obvious cases of value types defined in terms of themselves,
but it can't catch cases that arise as a result of generic substitution,
such as if a generic struct has a field of associated type that becomes the
same as the struct type itself. SIL may end up handling these types, even
though they can't be instantiated (the runtime will complain and crash if
the metadata is requested), either during SILGen because they were written
in source code, or as a result of generic specialization during optimization.
SIL thus can't rely on diagnostics preventing such types from appearing, so
it needs to be able to continue gracefully when they show up. Add checks
in type lowering for when a struct or enum lowering ends up depending on
itself, and generate an infinite type lowering that's opaque and address-only.

Fixes rdar://80310017
2022-01-31 14:40:18 -08:00
Michael Gottesman
8fd75eac3f [no-implicit-copy] Make sure to error on copies on borrowed structural sub-values.
Example: consume(x.field). This turned out to be a pretty simple extension of
the underlying model. The cases we are interested in are caused by a
non-reference nominal type having an extracted field being passed to a consuming
use. This always requires a copy.

The reason I missed this was I originally wrote the test cases around this for
classes which do not have this problem since the class is move only, not the
field due to class being a reference type. I then cargo culted this test case
for struct/other types and did not notice that we should have started to error
on these tests.

On an interesting note, I caught this on my branch where I am preparing the
optimizer to allow for values to have a move only bit. One of the constraints is
that once we are in guaranteed SIL, copy_value can not be used on any moveOnly
type (e.x.: $@moveOnly T). To ensure this doesn't happen, the move only checker:

1. Uses copy propagation to rewrite the copies of the base owned value.

2. Emit a diagnostic error upon any copies we found were needed due to the owned
   value being consumed.

3. If a diagnostic was emitted, rewrite all copies of move only typed values to
   be explicit_copy_value to ensure that in canonical SIL we do not violate the
   invariant that copy_value can not be applied to move only type values. This
   is ok to do since we are going to error and just want to avoid breaking the
   invariant.

The end effect of this is that if we do not emit any diagnostic, any copy_value
on a move only typed value that is not eliminated by the checker hits an assert
in the verifier... allowing us to know that if a program successfully compiles
that all "move only" proofs successfully ran, guaranteeing safety!
2022-01-29 21:29:28 -08:00
Michael Gottesman
68d37e142b [no-implicit-copy] Add a new instruction called MarkMustCheckInst and use it in the move checker.
This is an instruction that I am going to use to drive some of the ownership
based dataflow optimizations that I am writing now. The instruction contains a
kind that allows one to know what type of checking is required and allows the
need to add a bunch of independent instructions for independent checkers. Each
checker is responsible for removing all of its own mark instructions. NOTE:
MarkMustCheckInst is only allowed in Raw SIL since once we are in Canonical SIL
we want to ensure that all such checking has already occurred.
2022-01-29 14:49:39 -08:00