Skip to content

Commit 90f7af2

Browse files
committed
[SILOpt] Run DestroyAddrHoisting in mandatory.
Run DestroyAddrHoisting in the pipeline where DestroyHoisting was previously running. Avoid extra ARC traffic that having no form of destroy hoisting in the mandatory pipeline results in. rdar://90495704
1 parent 71448d6 commit 90f7af2

File tree

6 files changed

+56
-25
lines changed

6 files changed

+56
-25
lines changed

lib/SILOptimizer/PassManager/PassPipeline.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,12 @@ static void addMandatoryDiagnosticOptPipeline(SILPassPipelinePlan &P) {
176176
P.addSILSkippingChecker();
177177
#endif
178178

179-
if (Options.shouldOptimize() && EnableDestroyHoisting) {
180-
P.addDestroyHoisting();
179+
if (Options.shouldOptimize()) {
180+
if (EnableDestroyHoisting) {
181+
P.addDestroyHoisting();
182+
} else if (P.getOptions().DestroyHoisting == DestroyHoistingOption::On) {
183+
P.addDestroyAddrHoisting();
184+
}
181185
}
182186
P.addMandatoryInlining();
183187
P.addMandatorySILLinker();

test/Interop/Cxx/class/copy-move-assignment-irgen.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public func copyAssign() {
2020
// CHECK: call {{void|\%struct.NonTrivialCopyAndCopyMoveAssign\*}} @{{_ZN31NonTrivialCopyAndCopyMoveAssignC1Ev|_ZN31NonTrivialCopyAndCopyMoveAssignC2Ev|"\?\?0NonTrivialCopyAndCopyMoveAssign@@QEAA@XZ"}}(%struct.NonTrivialCopyAndCopyMoveAssign* %[[COPY_INSTANCE:.*]])
2121
// CHECK: call {{void|\%struct.NonTrivialCopyAndCopyMoveAssign\*}} @{{_ZN31NonTrivialCopyAndCopyMoveAssignC1Ev|_ZN31NonTrivialCopyAndCopyMoveAssignC2Ev|"\?\?0NonTrivialCopyAndCopyMoveAssign@@QEAA@XZ"}}(%struct.NonTrivialCopyAndCopyMoveAssign* %[[COPY_INSTANCE2:.*]])
2222
// CHECK: call {{void|\%struct.NonTrivialCopyAndCopyMoveAssign\*}} @{{_ZN31NonTrivialCopyAndCopyMoveAssignD1Ev|_ZN31NonTrivialCopyAndCopyMoveAssignD2Ev|"\?\?1NonTrivialCopyAndCopyMoveAssign@@QEAA@XZ"}}(%struct.NonTrivialCopyAndCopyMoveAssign* %[[COPY_INSTANCE]])
23-
// CHECK: call {{void|\%struct.NonTrivialCopyAndCopyMoveAssign\*}} @{{_ZN31NonTrivialCopyAndCopyMoveAssignC1ERKS_|_ZN31NonTrivialCopyAndCopyMoveAssignC2ERKS_|_ZN31NonTrivialCopyAndCopyMoveAssignC2ERKS_Tm|"\?\?0NonTrivialCopyAndCopyMoveAssign@@QEAA@AEBU0@@Z"}}(%struct.NonTrivialCopyAndCopyMoveAssign*
23+
// CHECK: call {{void|\%struct.NonTrivialCopyAndCopyMoveAssign\*}} @{{_ZN31NonTrivialCopyAndCopyMoveAssignC1EOS_|_ZN31NonTrivialCopyAndCopyMoveAssignC2EOS_|_ZN31NonTrivialCopyAndCopyMoveAssignC1ERKS_Tm|_ZN31NonTrivialCopyAndCopyMoveAssignC2ERKS_Tm|"\?\?0NonTrivialCopyAndCopyMoveAssign@@QEAA@AEBU0@@Z"}}(
2424
// CHECK-SAME: %[[COPY_INSTANCE]],
2525
// CHECK-SAME: %struct.NonTrivialCopyAndCopyMoveAssign*
2626
// CHECK-SAME: %[[COPY_INSTANCE2]])

test/Interop/SwiftToCxx/class/swift-class-execution.cpp

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,50 @@
1-
// RUN: %empty-directory(%t)
1+
// (1) Onone, no evolution
22

3-
// RUN: %target-swift-frontend %S/swift-class-in-cxx.swift -typecheck -module-name Class -clang-header-expose-decls=all-public -emit-clang-header-path %t/class.h
3+
// RUN: %empty-directory(%t-onone)
44

5-
// RUN: %target-interop-build-clangxx -c %s -I %t -o %t/swift-class-execution.o
6-
// RUN: %target-interop-build-swift %S/swift-class-in-cxx.swift -o %t/swift-class-execution -Xlinker %t/swift-class-execution.o -module-name Class -Xfrontend -entry-point-function-name -Xfrontend swiftMain
5+
// RUN: %target-swift-frontend %S/swift-class-in-cxx.swift -typecheck -module-name Class -clang-header-expose-decls=all-public -emit-clang-header-path %t-onone/class.h -Onone
76

8-
// RUN: %target-codesign %t/swift-class-execution
9-
// RUN: %target-run %t/swift-class-execution | %FileCheck %s
7+
// RUN: %target-interop-build-clangxx -c %s -I %t-onone -o %t-onone/swift-class-execution.o
8+
// RUN: %target-interop-build-swift %S/swift-class-in-cxx.swift -o %t-onone/swift-class-execution -Xlinker %t-onone/swift-class-execution.o -module-name Class -Xfrontend -entry-point-function-name -Xfrontend swiftMain -Onone
109

11-
// RUN: %empty-directory(%t-evo)
10+
// RUN: %target-codesign %t-onone/swift-class-execution
11+
// RUN: %target-run %t-onone/swift-class-execution | %FileCheck %s --check-prefixes=CHECK,CHECK-ONONE
1212

13-
// RUN: %target-swift-frontend %S/swift-class-in-cxx.swift -typecheck -module-name Class -clang-header-expose-decls=all-public -enable-library-evolution -emit-clang-header-path %t-evo/class.h
13+
// (2) O, no evolution
1414

15-
// RUN: %target-interop-build-clangxx -c %s -I %t-evo -o %t-evo/swift-class-execution.o
16-
// RUN: %target-interop-build-swift %S/swift-class-in-cxx.swift -o %t-evo/swift-class-execution-evo -Xlinker %t-evo/swift-class-execution.o -module-name Class -enable-library-evolution -Xfrontend -entry-point-function-name -Xfrontend swiftMain
15+
// RUN: %empty-directory(%t-ofast)
1716

18-
// RUN: %target-codesign %t-evo/swift-class-execution-evo
19-
// RUN: %target-run %t-evo/swift-class-execution-evo | %FileCheck %s
17+
// RUN: %target-swift-frontend %S/swift-class-in-cxx.swift -typecheck -module-name Class -clang-header-expose-decls=all-public -emit-clang-header-path %t-ofast/class.h -O
18+
19+
// RUN: %target-interop-build-clangxx -c %s -I %t-ofast -o %t-ofast/swift-class-execution.o
20+
// RUN: %target-interop-build-swift %S/swift-class-in-cxx.swift -o %t-ofast/swift-class-execution -Xlinker %t-ofast/swift-class-execution.o -module-name Class -Xfrontend -entry-point-function-name -Xfrontend swiftMain -O
21+
22+
// RUN: %target-codesign %t-ofast/swift-class-execution
23+
// RUN: %target-run %t-ofast/swift-class-execution | %FileCheck %s --check-prefixes=CHECK,CHECK-OPT
24+
25+
// (3) Onone, evolution
26+
27+
// RUN: %empty-directory(%t-evo-onone)
28+
29+
// RUN: %target-swift-frontend %S/swift-class-in-cxx.swift -typecheck -module-name Class -clang-header-expose-decls=all-public -enable-library-evolution -emit-clang-header-path %t-evo-onone/class.h -Onone
30+
31+
// RUN: %target-interop-build-clangxx -c %s -I %t-evo-onone -o %t-evo-onone/swift-class-execution.o
32+
// RUN: %target-interop-build-swift %S/swift-class-in-cxx.swift -o %t-evo-onone/swift-class-execution-evo -Xlinker %t-evo-onone/swift-class-execution.o -module-name Class -enable-library-evolution -Xfrontend -entry-point-function-name -Xfrontend swiftMain -Onone
33+
34+
// RUN: %target-codesign %t-evo-onone/swift-class-execution-evo
35+
// RUN: %target-run %t-evo-onone/swift-class-execution-evo | %FileCheck %s --check-prefixes=CHECK,CHECK-ONONE
36+
37+
// (4) O, evolution
38+
39+
// RUN: %empty-directory(%t-evo-ofast)
40+
41+
// RUN: %target-swift-frontend %S/swift-class-in-cxx.swift -typecheck -module-name Class -clang-header-expose-decls=all-public -enable-library-evolution -emit-clang-header-path %t-evo-ofast/class.h -O
42+
43+
// RUN: %target-interop-build-clangxx -c %s -I %t-evo-ofast -o %t-evo-ofast/swift-class-execution.o
44+
// RUN: %target-interop-build-swift %S/swift-class-in-cxx.swift -o %t-evo-ofast/swift-class-execution-evo -Xlinker %t-evo-ofast/swift-class-execution.o -module-name Class -enable-library-evolution -Xfrontend -entry-point-function-name -Xfrontend swiftMain -O
45+
46+
// RUN: %target-codesign %t-evo-ofast/swift-class-execution-evo
47+
// RUN: %target-run %t-evo-ofast/swift-class-execution-evo | %FileCheck %s --check-prefixes=CHECK,CHECK-OPT
2048

2149
// REQUIRES: executable_test
2250

@@ -70,8 +98,10 @@ int main() {
7098
takeClassWithIntField(x);
7199
}
72100
// CHECK-NEXT: init ClassWithIntField
73-
// CHECK-NEXT: init ClassWithIntField
74-
// CHECK-NEXT: destroy ClassWithIntField
101+
// CHECK-ONONE-NEXT: init ClassWithIntField
102+
// CHECK-ONONE-NEXT: destroy ClassWithIntField
103+
// CHECK-OPT-NEXT: destroy ClassWithIntField
104+
// CHECK-OPT-NEXT: init ClassWithIntField
75105
// CHECK-NEXT: ClassWithIntField: -11;
76106
// CHECK-NEXT: destroy ClassWithIntField
77107

test/SILOptimizer/capture_promotion_generic_context.sil

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,10 @@ exit:
108108
// closure is invoked.
109109
// CHECK-LABEL: sil {{.*}}@call_generic_promotable_box_from_different_generic2 :
110110
// CHECK: bb0(%0 : $*R<T>, %1 : $*E<(R<U>) -> Builtin.Int32>, %2 : $*Builtin.Int32):
111-
// CHECK: %3 = load %1 : $*E<(R<U>) -> Builtin.Int32>
112111
// CHECK: [[F:%.*]] = function_ref @$s23generic_promotable_box2Tf2nnni_n : $@convention(thin) <τ_0_0> (@in_guaranteed R<τ_0_0>, @in_guaranteed Builtin.Int32, @guaranteed E<(R<τ_0_0>) -> Builtin.Int32>) -> @out Builtin.Int32
113-
// CHECK-NEXT: [[CLOSURE:%.*]] = partial_apply [callee_guaranteed] [[F]]<U>(%2, %3)
114-
// CHECK-NEXT: retain_value %3
112+
// CHECK: %4 = load %1 : $*E<(R<U>) -> Builtin.Int32>
113+
// CHECK-NEXT: [[CLOSURE:%.*]] = partial_apply [callee_guaranteed] [[F]]<U>(%2, %4)
114+
// CHECK-NEXT: retain_value %4
115115
// CHECK-NEXT: return [[CLOSURE]]
116116
// CHECK: } // end sil function 'call_generic_promotable_box_from_different_generic2'
117117
sil [ossa] @call_generic_promotable_box_from_different_generic2 : $@convention(thin) <T, U: P> (@in_guaranteed R<T>, @in_guaranteed E<(R<U>)->Int>, @in Int) -> @owned @callee_guaranteed (@in_guaranteed R<U>) -> @out Int {

test/SILOptimizer/performance-annotations.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@ struct AllocatingStr : P {
3131
}
3232
}
3333

34-
/* Currently disabled: rdar://90495704
35-
3634
func noRTCallsForArrayGet(_ a: [Str], _ i: Int) -> Int {
3735
return a[i].x
3836
}
@@ -41,7 +39,6 @@ func noRTCallsForArrayGet(_ a: [Str], _ i: Int) -> Int {
4139
func callArrayGet(_ a: [Str]) -> Int {
4240
return noRTCallsForArrayGet(a, 0)
4341
}
44-
*/
4542

4643
@_noLocks
4744
func arcOperations(_ x: Cl) -> Cl {

test/stdlib/move_function.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ tests.test("simpleArrayVarTest") {
9191
expectTrue(x._buffer.isUniquelyReferenced())
9292

9393
var y = x
94-
expectTrue(x._buffer.isUniquelyReferenced())
94+
expectFalse(x._buffer.isUniquelyReferenced())
9595
let _ = y
9696
expectTrue(x._buffer.isUniquelyReferenced())
9797
y = []
@@ -101,7 +101,7 @@ tests.test("simpleArrayVarTest") {
101101
tests.test("simpleArrayInoutVarTest") {
102102
func inOutTest(_ x: inout [Enum]) {
103103
var y = x
104-
expectTrue(x._buffer.isUniquelyReferenced())
104+
expectFalse(x._buffer.isUniquelyReferenced())
105105
let _ = y
106106
expectTrue(x._buffer.isUniquelyReferenced())
107107
y = []

0 commit comments

Comments
 (0)