Commit Graph

153 Commits

Author SHA1 Message Date
Hamish Knight
127eb9e008 [test] Add test case for rdar://41010883 2022-09-27 20:22:51 +01:00
Hamish Knight
fa3c951975 Merge pull request #61203 from hamishknight/pop-and-loc 2022-09-27 19:44:34 +01:00
Hamish Knight
9f93bc8dcd [Profiler] Emit increment for property wrapper backing initializers
Previously we were creating a SILProfiler for
such functions, but weren't actually emitting the
increment, leading to missed coverage.

Part of the fix for rdar://99931619
2022-09-26 12:18:44 +01:00
Hamish Knight
0431bb2d1c [IRGen] Don't emit coverage maps for synthesized Clang decls
We don't need to perform coverage mapping for any
Clang decls we've synthesized, as they have no
user-written code. This is also needed to avoid a
Clang crash when attempting to emit coverage for
decls without source locations (rdar://100172217).

rdar://82820628
2022-09-20 15:58:07 +01:00
Hamish Knight
372b7b0e33 [test] Add regression test for SR-307 2022-09-20 13:13:21 +01: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
Hamish Knight
01c7c16c18 [IRGen] Allow lazy emission of coverage mapped functions
We previously eagerly emitted such functions to
ensure that their name data is emitted through the
profiler increment. Now that are able to emit the
profile name data separately, this is unnecessary,
and we can avoid emitting their definitions.
2022-09-16 15:47:17 +01:00
Hamish Knight
cc465937a2 [IRGen] Emit name data for unused coverage counters
Previously, if all the coverage counters for a
given SIL function were optimized out, we would
have dropped the coverage map on the floor,
leading to inaccurate coverage reports in `-O`.
However LLVM allows us to emit the name data for
the coverage maps separately by defining an
`__llvm_coverage_names` global with the name data,
which is picked up by its instrumentation lowering
pass. Use this to continue to emit coverage maps
for functions that do not get emitted.

rdar://99813754
2022-09-16 15:47:16 +01:00
Hamish Knight
1eedefe287 Merge pull request #61134 from hamishknight/comprehensive-coverage 2022-09-15 21:20:27 +01:00
Hamish Knight
c963a90754 Merge pull request #61046 from hamishknight/cant-pass-this-up 2022-09-15 17:02:13 +01: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
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
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
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
Hamish Knight
00217aee23 [test] Add profiler tests for rdar://77217762
Ensure that LLVM doesn't optimize out a profiler
increment before lowering it, ensuring its name
gets recorded.
2022-09-12 12:27:36 +01:00
Anthony Latsis
3bc4c32ad8 Merge pull request #60920 from AnthonyLatsis/migrate-test-suite-to-gh-issues-17
Gardening: Migrate test suite to GH issues p. 17
2022-09-09 12:05:13 +03:00
Hamish Knight
41dd46b4f5 [test] Limit test/Profiler/rdar39146527.sil to x86_64 2022-09-08 19:03:31 +01: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
Anthony Latsis
f9429f9731 Gardening: Migrate test suite to GH issues: Profiler 2022-09-02 01:44:24 +03:00
Hamish Knight
27b27a400e [Profiler] Fix autoclosure property wrapper crash
We need to query the top-level expression, not
the sub-expression of a potential function
conversion.

rdar://99449154
2022-09-01 19:29:19 +01:00
Hamish Knight
7e141f4b1c [Profiler] Emit coverage for literal initializers
It's not clear why these should be excluded when
other initializers receive coverage.
2022-09-01 19:29:17 +01:00
Hamish Knight
05e2309788 [Profiler] Fix coverage mapping for switches
Previously we assumed the exit counter was the
same as the entry counter. Update the logic such
that we track break statements (including
implicitly at the end of a case), as well as
early returns and jumps to parent statements. This
follows a similar logic to what we do for if
statements.

rdar://99141044
2022-08-25 17:30:34 +01:00
Hamish Knight
caf597212c Merge pull request #60645 from hamishknight/simon-says 2022-08-19 19:58:04 +01:00
Hamish Knight
d8bab13469 [Profiler] Fix counters following DoStmts
Previously we weren't compensating for label
jumps and returns, i.e we assumed the exit count
is the same as the entry count. Ensure we follow
the same logic that other labeled statements
follow such that control flow is accounted for.

rdar://98881045
2022-08-19 15:06:11 +01:00
Hamish Knight
64fcbd9412 [Profiler] Support lazy variable initializers
Start visiting LazyInitializerExpr for profiling,
such that we emit a profile counter when
initializing the initial value for the first time.

rdar://43393937
2022-08-19 14:03:40 +01:00
Hamish Knight
df66f2777e Merge pull request #60509 from hamishknight/insurance-claim 2022-08-19 13:46:33 +01:00
Hamish Knight
d1eb6f9465 [Profiler] Avoid introducing empty unreachable regions
When computing the counter for the region
following a labeled statement such as `if`, avoid
adding a new empty region if the counter for such
a region is known to be zero, i.e unreachable.
This avoids adding spurious unreachable regions
after an if statements where each branch returns,
throws, or otherwise jumps to a parent statement.

We will however still add the region if any code
follows such a statement, making it non-empty.

rdar://29390569
2022-08-16 20:27:30 +01:00
Hamish Knight
19e1e2f7a2 [SILGen] Fix deinit coverage mapping
Stop profiling the deallocating deinitializer
function for non-ObjC classes, and instead profile
the destructor, which is where we emit the user's
code written in a `deinit`.

rdar://54443107
2022-08-11 15:09:53 +01:00
Hamish Knight
2f38f83050 [test] Rename a test 2022-08-11 15:09:53 +01:00
Joe Groff
482cc8ae24 SILGen: Emit a closure literal in a function conversion as the converted type.
Closure literals are sometimes type-checked as one type then immediately converted to another
type in the AST. One particular case of this is when a closure body never throws, but the closure
is used as an argument to a function that takes a parameter that `throws`. Emitting this naively,
by emitting the closure as its original type, then converting to throws, can be expensive for
async closures, since that takes a reabstraction thunk. Even for non-async functions, we still want
to get the benefit of reabstraction optimization for the closure literal through the conversion too.
So if the function conversion just add `throws`, emit the closure as throwing, and pass down the
context abstraction pattern when emitting the closure as well.
2022-05-04 10:24:11 -07:00
Vedant Kumar
9066d9132e Revert "[test] Fix a bug in test/Profiler/coverage_smoke.swift" (#38894)
This reverts commit ebdb4d9ace, due to
https://reviews.llvm.org/D85036 being reverted upstream.

rdar://81815347
2021-08-16 11:49:02 -07:00
Vedant Kumar
92c159ced8 Revert "[test] Fix a bug in test/Profiler/coverage_smoke.swift" (#38893)
This reverts commit 956558f23f, due to
https://reviews.llvm.org/D85036 being reverted upstream.

rdar://81815347
2021-08-16 11:46:12 -07:00
Doug Gregor
fcd5d43457 Revert "stdlib: Add reasync variants of '&&', '||' and '??'" 2021-04-05 16:45:44 -07:00
Slava Pestov
c473869141 stdlib: Add reasync variants of '&&', '||' and '??'
Fixes rdar://problem/72770687.
2021-03-31 19:21:08 -04:00
Nate Chandler
20db2c0981 Merge branch 'main' into rebranch
Conflicts:
	include/swift/Basic/AnyValue.h
2021-01-12 16:30:02 -08:00
Varun Gandhi
02c4ad3850 [SILGen] Branch on result of next() before conversion.
Fixes SR-8688 (rdar://problem/47162940).
2021-01-12 09:09:48 -08:00
David Smith
0180aca9fc Merge branch 'main' into david/fix-merge-conflict 2020-10-27 13:05:20 -07:00
Doug Gregor
6d41524fe6 [SE-0289] Finish renaming source code, tests to "result builders" 2020-10-20 22:18:51 -07:00
Doug Gregor
6a40a3a8aa [SE-0289] Add support for @resultBuilder.
"Function builders" are being renamed to "result builders". Add the
corresponding `@resultBuilder` attribute, with `@_functionBuilder` as
an alias for it, Update test cases to use @resultBuilder.
2020-10-20 13:24:51 -07:00
swift_jenkins
75c4b09f51 Merge remote-tracking branch 'origin/master' into master-next 2020-09-15 15:41:58 -07:00
Pavel Yaskevich
dd374a1d52 Merge remote-tracking branch 'origin/master' into fix-merge-master-master-next 2020-09-15 11:44:10 -07:00
Vedant Kumar
ab817e83e0 [Profiler] Increment function body count prior to the prolog
This fixes another 'SILBuilder has no valid insertion point' assertion
failure seen when compiling Carthage.

rdar://68759819
2020-09-15 11:09:24 -07:00
Vedant Kumar
43935527f2 [Profiler] Increment closure body count prior to the prolog (#33946)
This fixes a 'SILBuilder has no valid insertion point' assertion failure
seen when compiling various projects from the source compat suite.

rdar://68759819
2020-09-15 10:45:24 -07:00
Vedant Kumar
cfd38c42a1 [Profiler] Assign counter to IfStmt condition
Push a region to cover any expressions within an IfStmt condition.

rdar://67280997
2020-08-18 14:05:24 -07:00
Vedant Kumar
0ade2ffa6e [test] Weaken a test in coverage_smoke.swift
The test regressed after D85036. rdar://67280997 tracks a proper fix for
this issue.
2020-08-17 17:02:04 -07:00
Vedant Kumar
ebdb4d9ace [test] Fix a bug in test/Profiler/coverage_smoke.swift
A 'catch' line was marked with the wrong execution count. This was
exposed by D85036.
2020-08-14 14:34:59 -07:00
swift_jenkins
8dd7cac75d Merge remote-tracking branch 'origin/master' into master-next 2020-08-07 19:46:31 -07:00
Mishal Shah
a3cd8bc9e9 [Tests] Codesign the binary before executing the test 2020-08-07 00:26:07 -07:00
Vedant Kumar
956558f23f [test] Fix a bug in test/Profiler/coverage_smoke.swift
The two sides of an if-expr can't have counts that add up to more than
the count of the if-expr.

This was exposed by https://reviews.llvm.org/D85036.

rdar://66642166
2020-08-06 15:42:36 -07:00