Commit Graph

1392 Commits

Author SHA1 Message Date
Michael Gottesman
1132cda811 [ownership] Move SemanticARCOpts into a separate folder in preparation for splitting into multiple small pseudo-passes.
SemanticARCOpts keeps on growing with various optimizations attached to a single
"optimization" manager. Move it to its own folder in prepation for splitting it
into multiple different optimizations and utility files.
2020-08-27 23:58:14 -07:00
Nate Chandler
f74a3b47fc [SIL] Added async flag to SILExtInfo. 2020-08-25 17:33:27 -07:00
Nate Chandler
94b5f76654 Revert "[SIL] Add SILFunctionType flag for async."
This reverts commit 9b8828848d.
2020-08-25 13:37:26 -07:00
Michael Gottesman
ac64ad6f85 [opt-remark] Add remarks for alloc_box, alloc_ref, alloc_stack
Specifically, we can identify rr on alloc_stack, alloc_ref, alloc_box and also
can emit a remark if ref,box result in heap allocations.
2020-08-22 19:19:13 -07:00
Michael Gottesman
7aac6817d4 [opt-remark] Handle inline locations correctly.
Specifically, now we properly identify the SILLocation for the final inlined
call site of a Source Location and put the remark there instead of in the
callee.
2020-08-22 14:30:59 -07:00
Nate Chandler
9b8828848d [SIL] Add SILFunctionType flag for async. 2020-08-19 11:29:58 -07:00
Michael Gottesman
18af945187 Merge pull request #33545 from gottesmm/pr-6574d4de544193a4d6c09072d5450e264677fd7f
[opt-remark] Skip implicit top level functions and autogenerated compiler functions.
2020-08-18 20:24:52 -07:00
Michael Gottesman
ac5016bc94 [opt-remark] Skip implicit top level functions and autogenerated compiler functions.
This eliminates opt-remarks on initializers/friends, e.x.:

```
struct KlassPair {
   var lhs: Klass // expected-remark {{retain of type 'Klass'}}
                  // expected-note @-1 {{of 'self.lhs'}}
                  // expected-remark @-2 {{release of type 'Klass'}}
                  // expected-note @-3 {{of 'self.lhs'}}
   var rhs: Klass // expected-remark {{retain of type 'Klass'}}
                  // expected-note @-1 {{of 'self.rhs'}}
                  // expected-remark @-2 {{release of type 'Klass'}}
                  // expected-note @-3 {{of 'self.rhs'}}
}
```

becomes:

```
struct KlassPair {
   var lhs: Klass
   var rhs: Klass
}
```

I also added an -Xllvm option (-optremarkgen-visit-implicit-autogen-funcs) that
will force these to be emitted as a compiler knob for compiler developers. There
is a test that validates the behavior.
2020-08-18 17:46:01 -07:00
Michael Gottesman
c98d04b3f1 Merge pull request #33351 from gottesmm/pr-2debc9735fb751cf4057c98a1d85ce39b325f38c
[semantic-arc] When computing Lifetimes include all consuming uses, not just the final destroying use.
2020-08-18 13:11:05 -07:00
Slava Pestov
253c0ac692 SIL: Generalize some explicit requiresClass() checks to use layout constraints 2020-08-15 03:09:12 -04:00
David Zarzycki
1e940c2c7e [NFC] Fix -Wsuggest-override warnings
LLVM, as of 77e0e9e17daf0865620abcd41f692ab0642367c4, now builds with
-Wsuggest-override. Let's clean up the swift sources rather than disable
the warning locally.
2020-08-13 16:17:46 -04:00
Meghana Gupta
bfeafb62d1 Merge pull request #33376 from meg-gupta/fixallocboxtostack
Fix edgecase in AllocBoxToStack handling of local apply
2020-08-10 08:45:38 -07:00
Michael Gottesman
17eb463e18 Merge pull request #33347 from gottesmm/pr-0e907fa209a6d12c8e02117c55a3d0f8989fa231
[ssa-updater] Modernize style before adding support for guaranteed parameters
2020-08-08 11:37:44 -07:00
Meghana Gupta
4d4af13582 Add a flag to turn off analysis of function calls in AllocBoxToStack 2020-08-07 22:36:47 -07:00
Meghana Gupta
fba46ee9f2 Fix edgecase in AllocBoxToStack handling of local apply
rdar://66542551
2020-08-07 22:36:43 -07:00
Michael Gottesman
962106fed3 [semantic-arc] When computing Lifetimes include all consuming uses, not just the final destroying use.
TLDR: This fixes an ownership verifier assert caused by not placing end_borrows
along paths where an enum is provable to have a trivial case. It only happens if
all non-trivial cases in a switch_enum are "dead end blocks" where the program
will end and we leak objects.

The Problem
-----------

The actual bug here only occurs in cases where we have a switch_enum on an enum
with mixed trivial, non-trivial cases and all of the non-trivial payloaded cases
are "dead end blocks". As an example, lets look at a simple switch_enum over an
optional where the .some case is a dead end block and we leak the Klass object
into program termination:

```
%0 = load [copy] %mem : $Klass
switch_enum %0 : $Optional<Klass>, case #Optional.some: bbDeadEnd, case #Optional.none: bbContinue

bbDeadEnd(%0a : @owned $Klass): // %0 is leaked into program end!
  unreachable

bbContinue:
  ... // program continue.
```

In this case, if we were only looking at final destroying uses, we would pass a
def without any uses to the ValueLifetimeChecker causing us to not have a
frontier at all causing us to not insert any end_borrows, yielding:

```
%0 = load_borrow %mem : $Klass
switch_enum %0 : $Optional<Klass>, case #Optional.some: bbDeadEnd, case #Optional.none: bbContinue

bbDeadEnd(%0a : @guaranteed $Klass): // %0 is leaked into program end and
                                     // doesnt need an end_borrow!
  unreachable

bbContinue:
  ... // program continue... we need an end_borrow here though!
```

This then trips the ownership verifier since switch_enum is a transforming
terminator that acts like a forwarding instruction implying we need an
end_borrow on the base value along all non-dead end paths through the program.

Importantly this is not actually a leak of a value or unsafe behavior since the
only time that we enter into unsafe territory is along paths where the enum was
actually trivial. So the load_borrow is actually just loaded the trivial enum
value.

The Fix
-------

In order to work around this, I realized that the right solution is to also
include the forwarding consuming uses (in this case the switch_enum use) when
determining the lifetime and that this solves the problem.

That being said, after I made that change, I noticed that I needed to remove my
previous manner of computing the insertion point to use for arguments when
finding the lifetime using ValueLifetimeAnalysis. Previously since I was using
only the destroying uses I knew that the destroy_value could not be the first
instruction in the block of my argument since I handled that case individually
before using the ValueLifetimeAnalysis. That invariant is no longer true as can
be seen in the case above if %0 was from a SILArgument itself instead of a load
[copy] and we were converting that argument to be a guaranteed argument.

To fix this, I taught ValueLifetimeAnalysis how to handle defs from
Arguments. The key thing is I noticed while reading the code that the analysis
only generally cared about the instruction's parent block. Beyond that, the def
being from an instruction was only needed to determine if a user is earlier in
the same block as the def instruction. Those concerns not apply to SILArgument
which dominate all instructions in the same block, so in this patch, we just
skip those conditional checks when we have a SILArgument. The rest of the code
that uses the parent block is the same for both SILArgument/SILInstructions.

rdar://65244617
2020-08-07 21:45:22 -07:00
Michael Gottesman
d064241599 [ssa-updater] Modernize style before adding support for guaranteed parameters.
Specifically:

1. I made methods, variables camelCase.
2. I expanded out variable names (e.x.: bb -> block, predBB -> predBlocks, U -> wrappedUse).
3. I changed typedef -> using.
4. I changed a few c style for loops into for each loops using llvm::enumerate.

NOTE: I left the parts needed for syncing to LLVM in the old style since LLVM
needs these to exist for CRTP to work correctly for the SILSSAUpdater.
2020-08-06 15:41:00 -07:00
Erik Eckstein
b8485d6d14 StringOptimization: fix a crash when constant folding the type name of an inner class
rdar://problem/66540633
2020-08-05 11:34:34 +02:00
Erik Eckstein
63c275c45f SILOptimizer: move String concatination optimization from SILCombine/ConstantFolding to StringOptimization.
This simplifies some code and it's not required to try this optimization on every run of SILCombine and ConstantPropagation.
2020-08-04 16:16:11 +02:00
Michael Gottesman
9f6f93ad50 Merge pull request #33260 from gottesmm/pr-8fc080f91028cba90df6e39440ac91d402da76fd
[ownership] Update SROA to support OSSA.
2020-08-03 16:41:57 -07:00
Michael Gottesman
12ffdd3765 Merge pull request #32885 from gottesmm/pr-9162e369eb8d716656842a8502a098f9c43a8423
[ownership] Update LowerAggregateInstrs for Ownership
2020-08-03 16:41:28 -07:00
zoecarver
12d652e39f [ownership] Update SROA to support OSSA.
Use destructure to chop up allocations. Other than that, just add
correct load/store qualifiers.
2020-08-03 11:10:06 -07:00
Michael Gottesman
ba46bc44d2 [lower-agg-instrs] Update for ossa.
For now I am trying out /not/ expanding when ownership is enabled. I still fixed
the problems in it though. I also put in a force expand everything pass to make
sure that in ossa we can still successfully go down this code path if we want
to.

The reason why I think this is the right thing to do is that the original reason
why lower aggregate instrs was written was to help the low level arc optimizer
(which only runs on non-ossa code). To the high level arc optimizer this is just
noise and will keep the IR simpler.

Another thing to note is that I updated the code so it should work in both ossa
and non-ossa. In order to not perturb the code too much, I had to add a small
optimization to TypeLowering where when ownership is disabled, we do not reform
aggregates when copying. Instead, we just return the passed in value. This makes
the pass the same when optimizing in both modes.
2020-08-03 10:42:34 -07:00
Varun Gandhi
270b5dc7a6 Merge pull request #33118 from varungandhi-apple/vg-builder-pattern-ExtInfo
Refactor ExtInfo to use the builder pattern for construction.
2020-08-03 10:30:05 -07:00
Erik Eckstein
e3f3b75208 StringOptimization: handle static let variables for String constant folding.
For example, constant fold:

struct Str {
    static let s = "hello"
}
...
let x = "<\(Str.s)>"
2020-08-03 12:01:29 +02:00
Erik Eckstein
2a035432e7 SILOptimizer: make a separate SROA pass for high-level SIL, which doesn't split String types.
The StringOptimization relies on seeing String values a a whole and not being split.
2020-08-03 12:01:29 +02:00
Erik Eckstein
568c156c37 Mem2Reg: fix a wrong assert
An empty tuple doesn't need to be assigned before it is passed to destroy_addr.

I found this by experimenting with the pass pipeline. Not sure if this crash can happen with the current pipeline.
2020-08-03 12:01:29 +02:00
Varun Gandhi
f219e58ada [NFC] Refactor ExtInfo to use a builder-pattern based API.
Since the two ExtInfos share a common ClangTypeInfo, and C++ doesn't let us
forward declare nested classes, we need to hoist out AnyFunctionType::ExtInfo
and SILFunctionType::ExtInfo to the top-level.

We also add some convenience APIs on (AST|SIL)ExtInfo for frequently used
withXYZ methods. Note that all non-default construction still goes through the
builder's build() method.

We do not add any checks for invariants here; those will be added later.
2020-07-31 13:55:55 -07:00
Slava Pestov
0ef12ec8aa SIL: Replace some calls to getDeclaredType() with getDeclaredInterfaceType() 2020-07-31 13:39:02 -04:00
Erik Eckstein
5f3e79b84e StringOptimization: bug fixes
Fix some bugs in the optimization and in the test files.

rdar://problem/66283894
2020-07-30 11:32:39 +02:00
Michael Gottesman
d52ddf4c21 Merge pull request #33171 from gottesmm/pr-97b9d62b30e73e019e7a9558e9cbf317d157c609
[opt-remark] Print out the type when we retain/release.
2020-07-29 12:05:44 -07:00
Michael Gottesman
ce298e94de [opt-remark] Print out the type when we retain/release.
This can be useful if we can't recognize a retain/release and one needs to
reason about what is being retained/released.
2020-07-28 18:35:34 -07:00
Arnold Schwaighofer
997fc5d070 Merge pull request #33140 from aschwaighofer/eager_specializer_function_pass
Convert the EagerSpecializer pass to a function pass
2020-07-28 15:27:46 -07:00
Arnold Schwaighofer
ecf9fbd5f1 Move the EagerSpecializer pass to the Transforms directory
It is no longer a module transform.
2020-07-28 10:25:36 -07:00
eeckstein
5fffeb81fb Merge pull request #33128 from eeckstein/string-optimization
SIL optimizer: Add a new string optimization
2020-07-28 10:17:28 +02:00
Michael Gottesman
68052a3d1b Merge pull request #33135 from gottesmm/pr-bcb3de84050b91b600ff133d7d6902b97e6065af
[opt-remark] Add support for simple object projections.
2020-07-27 15:50:54 -07:00
Michael Gottesman
0bd6a58fae [opt-remark] Add support for simple object projections.
This ensures that we are able to properly look through struct_extract,
tuple_extract in cases where we have an aggregate with multiple non-trivial
subtypes (implying it is not-rc identical with those sub-types).

The end result is that we now emit good diagnostics for things like this:

```
func returnStructWithOwnerOwner(x: StructWithOwner) -> Klass {
    return x.owner // expected-remark {{retain}}
                   // expected-note @-7:33 {{of 'x.owner'}}
}
```
2020-07-27 12:35:00 -07:00
Erik Eckstein
7f684b62e2 SIL optimizer: Add a new string optimization.
Optimizes String operations with constant operands.

Specifically:
  * Replaces x.append(y) with x = y if x is empty.
  * Removes x.append("")
  * Replaces x.append(y) with x = x + y if x and y are constant strings.
  * Replaces _typeName(T.self) with a constant string if T is statically known.

With this optimization it's possible to constant fold string interpolations, like "the \(Int.self) type" -> "the Int type"

This new pass runs on high-level SIL, where semantic calls are still in place.

rdar://problem/65642843
2020-07-27 21:32:56 +02:00
Joe Groff
90f0f7c627 Merge pull request #32359 from jckarter/enable-prune-vtables
Add PruneVTables to the performance optimizer passes.
2020-07-27 11:10:53 -07:00
Michael Gottesman
96097b0879 [opt-remark] Add @_semantics("optremark{.$SIL_PASS_NAME}") that force opt remarks on functions.
More specifically, if one wants to force emit /all/ opt-remarks on a function, mark it with:

```
@_semantics("optremark")
```

If one wants to emit opt-remarks only for a specific SIL pass (like lets say
sil-opt-remark-gen), one can write:

```
@_semantics("optremark.sil-opt-remark-gen")
```

I made the pattern matching strict so if you just put in a '.' or add additional
suffixes, it will not pattern match. I think that this is sufficient for a
prototyping tool.

This is useful if one wants to play around with opt-remarks when optimizing code
in Xcode or any IDE that can use serialized diagnostics.
2020-07-26 14:55:02 -07:00
Michael Gottesman
2b467adeff [opt-remark] Clean up remarks a little bit and emit the base name of each decl textually.
So now if one looks at remarks in an IDE, you will see in the NOTE itself the
decl to look for. I am going to expand this to include handling of projection
paths.
2020-07-26 14:55:02 -07:00
Michael Gottesman
c3595ad7f0 Merge pull request #33115 from gottesmm/pr-3b1ab9c8196e6decb2b6b49cbf4f5b44435ed2c9
[opt-remark] Move Argument::inferArgumentFromValue into OptRemarkGenerator.
2020-07-25 10:12:58 -07:00
Meghana Gupta
c042638a37 Merge pull request #33098 from meg-gupta/updatestyle
Update code as per Apple Style Guide
2020-07-25 07:44:44 -07:00
Michael Gottesman
2f3670f754 [opt-remark] Move Argument::inferArgumentFromValue into OptRemarkGenerator.
I noticed that I kept on needing to hack on this as I added stuff to
OptRemarkGenerator and felt the need to tie it even closer to
OptRemarkGenerator. As I began to think about it, this is really something
specific to that algorithm, so it really doesn't make sense to have it as part
of the general SIL library.

This is a NFC refactoring.
2020-07-24 21:15:34 -07:00
Michael Gottesman
750c8d32ac [opt-remark] Have OptEmitter store a SILFunction instead of a SILModule.
In all of these cases, we already had a SILFunction and were just grabbing its
SILModule instead of passing it in. So this is just an NFC change.

The reason why I am doing this is so that I can force emit opt-remarks on
functions with the semantics attribute "optremark", so I need to be able to
access the SILFunction in the optimization remark infrastructure.
2020-07-24 17:11:47 -07:00
Meghana Gupta
b34791a0a0 Update code as per Apple Style Guide
whitelist -> allowlist
blacklist -> denylist
2020-07-24 11:37:15 -07:00
Meghana Gupta
f28bff1846 Enable CopyForwarding on ossa 2020-07-24 01:05:38 -07:00
Joe Groff
570e0ad326 PruneVTables: Add DEBUG logging of the pass decisions 2020-07-23 20:40:49 -07:00
Joe Groff
b4a0ceac71 Add PruneVTables to the performance optimizer passes. 2020-07-23 20:40:49 -07:00
Andrew Trick
191adb0cd7 Merge pull request #33017 from atrick/really-add-class-tail-storage
Add AccessedStorage::Tail access kind and remove more exclusivity checks.
2020-07-21 21:08:52 -07:00