Skip to content

Commit 8c26046

Browse files
Merge pull request #24478 from aschwaighofer/opaque_subst_use_resilience_expansion
ReplaceOpaqueTypesWithUnderlyingTypes: Use resilience expansion instead of inlinable attribute
2 parents 2493986 + 830abc3 commit 8c26046

File tree

4 files changed

+35
-154
lines changed

4 files changed

+35
-154
lines changed

lib/AST/Type.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2484,9 +2484,18 @@ bool ReplaceOpaqueTypesWithUnderlyingTypes::shouldPerformSubstitution(
24842484

24852485
// Allow replacement of opaque result types of inlineable function regardless
24862486
// of resilience and in which context.
2487-
if (namingDecl->getAttrs().hasAttribute<InlinableAttr>()) {
2488-
return true;
2487+
if (auto *afd = dyn_cast<AbstractFunctionDecl>(namingDecl)) {
2488+
if (afd->getResilienceExpansion() == ResilienceExpansion::Minimal) {
2489+
return true;
2490+
}
2491+
} else if (auto *asd = dyn_cast<AbstractStorageDecl>(namingDecl)) {
2492+
auto *getter = asd->getGetter();
2493+
if (getter &&
2494+
getter->getResilienceExpansion() == ResilienceExpansion::Minimal) {
2495+
return true;
2496+
}
24892497
}
2498+
24902499
// Allow replacement of opaque result types in the context of maximal
24912500
// resilient expansion if the context's and the opaque type's module are the
24922501
// same.

test/SILOptimizer/Inputs/specialize_opaque_type_archetypes_3.swift

Lines changed: 9 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -12,36 +12,9 @@ public func externalResilient() -> some ExternalP2 {
1212
return Int64(6)
1313
}
1414

15-
@usableFromInline
16-
@inline(never)
17-
func preventInlining() {}
18-
1915
@inlinable
16+
@inline(never)
2017
public func inlinableExternalResilient() -> some ExternalP2 {
21-
preventInlining()
22-
preventInlining()
23-
preventInlining()
24-
preventInlining()
25-
preventInlining()
26-
preventInlining()
27-
preventInlining()
28-
preventInlining()
29-
preventInlining()
30-
preventInlining()
31-
preventInlining()
32-
preventInlining()
33-
preventInlining()
34-
preventInlining()
35-
preventInlining()
36-
preventInlining()
37-
preventInlining()
38-
preventInlining()
39-
preventInlining()
40-
preventInlining()
41-
preventInlining()
42-
preventInlining()
43-
preventInlining()
44-
preventInlining()
4518
return Int64(6)
4619
}
4720

@@ -56,34 +29,18 @@ public struct ResilientContainer {
5629
}
5730

5831
@inlinable
32+
@inline(never)
5933
public var inlineableProperty : some ExternalP2 {
60-
preventInlining()
61-
preventInlining()
62-
preventInlining()
63-
preventInlining()
64-
preventInlining()
65-
preventInlining()
66-
preventInlining()
67-
preventInlining()
68-
preventInlining()
69-
preventInlining()
70-
preventInlining()
71-
preventInlining()
72-
preventInlining()
73-
preventInlining()
74-
preventInlining()
75-
preventInlining()
76-
preventInlining()
77-
preventInlining()
78-
preventInlining()
79-
preventInlining()
80-
preventInlining()
81-
preventInlining()
82-
preventInlining()
83-
preventInlining()
8434
return x
8535
}
8636

37+
@_alwaysEmitIntoClient
38+
@inline(never)
39+
public var inlineableProperty2 : some ExternalP2 {
40+
return x
41+
}
42+
43+
8744
@inlinable
8845
public func inlineableContext() {
8946
let x = computedProperty
Lines changed: 4 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,17 @@
11
import External2
22

3-
@usableFromInline
4-
@inline(never)
5-
func preventInlining() {}
6-
73
// When specializing the opaque result type for this function we should not
84
// specialize the opaque result type of the recursive invocation.
95
@inlinable
6+
@inline(never)
107
public func inlinableExternalResilientCallsResilient() -> some ExternalP2 {
11-
preventInlining()
12-
preventInlining()
13-
preventInlining()
14-
preventInlining()
15-
preventInlining()
16-
preventInlining()
17-
preventInlining()
18-
preventInlining()
19-
preventInlining()
20-
preventInlining()
21-
preventInlining()
22-
preventInlining()
23-
preventInlining()
24-
preventInlining()
25-
preventInlining()
26-
preventInlining()
27-
preventInlining()
28-
preventInlining()
29-
preventInlining()
30-
preventInlining()
31-
preventInlining()
32-
preventInlining()
33-
preventInlining()
34-
preventInlining()
358
return externalResilient()
369
}
3710

3811
// In this case we should look through the recursion.
3912
@inlinable
13+
@inline(never)
4014
public func inlinableExternalResilientCallsInlinableExternalResilient() -> some ExternalP2 {
41-
preventInlining()
42-
preventInlining()
43-
preventInlining()
44-
preventInlining()
45-
preventInlining()
46-
preventInlining()
47-
preventInlining()
48-
preventInlining()
49-
preventInlining()
50-
preventInlining()
51-
preventInlining()
52-
preventInlining()
53-
preventInlining()
54-
preventInlining()
55-
preventInlining()
56-
preventInlining()
57-
preventInlining()
58-
preventInlining()
59-
preventInlining()
60-
preventInlining()
61-
preventInlining()
62-
preventInlining()
63-
preventInlining()
64-
preventInlining()
6515
return inlinableExternalResilient()
6616
}
6717

@@ -76,60 +26,14 @@ public struct ResilientContainer2 {
7626
}
7727

7828
@inlinable
29+
@inline(never)
7930
public var inlineableProperty : some ExternalP2 {
80-
preventInlining()
81-
preventInlining()
82-
preventInlining()
83-
preventInlining()
84-
preventInlining()
85-
preventInlining()
86-
preventInlining()
87-
preventInlining()
88-
preventInlining()
89-
preventInlining()
90-
preventInlining()
91-
preventInlining()
92-
preventInlining()
93-
preventInlining()
94-
preventInlining()
95-
preventInlining()
96-
preventInlining()
97-
preventInlining()
98-
preventInlining()
99-
preventInlining()
100-
preventInlining()
101-
preventInlining()
102-
preventInlining()
103-
preventInlining()
10431
return r.computedProperty
10532
}
10633

10734
@inlinable
35+
@inline(never)
10836
public var inlineablePropertyCallsResilientInlineable : some ExternalP2 {
109-
preventInlining()
110-
preventInlining()
111-
preventInlining()
112-
preventInlining()
113-
preventInlining()
114-
preventInlining()
115-
preventInlining()
116-
preventInlining()
117-
preventInlining()
118-
preventInlining()
119-
preventInlining()
120-
preventInlining()
121-
preventInlining()
122-
preventInlining()
123-
preventInlining()
124-
preventInlining()
125-
preventInlining()
126-
preventInlining()
127-
preventInlining()
128-
preventInlining()
129-
preventInlining()
130-
preventInlining()
131-
preventInlining()
132-
preventInlining()
13337
return r.inlineableProperty
13438
}
13539
}

test/SILOptimizer/specialize_opaque_type_archetypes.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,17 @@ public func testResilientInlinableProperty() {
337337
useP(r.inlineableProperty.myValue3())
338338
}
339339

340+
// CHECK-LABEL: sil @$s1A31testResilientInlinableProperty3yyF
341+
// CHECK: [[CONTAINER:%.*]] = alloc_stack $ResilientContainer
342+
// CHECK: [[RES:%.*]] = alloc_stack $Int64
343+
// CHECK: [[FUN:%.*]] = function_ref @$s9External218ResilientContainerV19inlineableProperty2Qrvg
344+
// CHECK: [[RES2:%.*]] = unchecked_addr_cast [[RES]] : $*Int64 to $*@_opaqueReturnTypeOf("$s9External218ResilientContainerV19inlineableProperty2Qrvp", 0)
345+
// CHECK: apply [[FUN]]([[RES2]], [[CONTAINER]])
346+
public func testResilientInlinableProperty3() {
347+
let r = ResilientContainer()
348+
useP(r.inlineableProperty2.myValue3())
349+
}
350+
340351
// CHECK-LABEL: sil @$s1A22testResilientProperty2yyF
341352
// CHECK: [[CONTAINER:%.*]] = alloc_stack $ResilientContainer2
342353
// CHECK: [[RES:%.*]] = alloc_stack $@_opaqueReturnTypeOf("$s9External319ResilientContainer2V16computedPropertyQrvp", 0)

0 commit comments

Comments
 (0)