Skip to content

Commit 7e15303

Browse files
Merge pull request #42019 from nate-chandler/rdar90495704
[SILOpt] Run DestroyAddrHoisting in the mandatory pipeline when optimizing.
2 parents 986ffec + 90f7af2 commit 7e15303

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)