Skip to content

Commit db80c36

Browse files
committed
[Outliner] Fixed bridged property match in OSSA.
Previously, the match failed to find the larger sequence that began with load [copy] and ended with destroy_value because the iterator advanced after finding the load [copy]. Advanced the iterator here. Enables reverting the test outlining test changes introduced in a52b896.
1 parent e4d8fa4 commit db80c36

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

lib/SILOptimizer/Transforms/Outliner.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,7 @@ bool BridgedProperty::matchInstSequence(SILBasicBlock::iterator It) {
642642
if (Load->getFunction()->hasOwnership()) {
643643
if (Load->getOwnershipQualifier() != LoadOwnershipQualifier::Copy)
644644
return false;
645+
ADVANCE_ITERATOR_OR_RETURN_FALSE(It);
645646
} else {
646647
// strong_retain %31 : $UITextField
647648
ADVANCE_ITERATOR_OR_RETURN_FALSE(It);

test/SILOptimizer/outliner.swift

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@ public class MyGizmo {
1414
gizmo = Gizmo()
1515
}
1616

17-
// CHECK-LABEL: sil {{.*}}@$s8outliner7MyGizmoC11usePropertyyyF :
18-
// CHECK: [[P_FUN:%.*]] = function_ref @$sSo5GizmoC14stringPropertySSSgvgToTepb_
19-
// CHECK: apply [[P_FUN]]({{.*}}) : $@convention(thin) (Gizmo) -> @owned Optional<String>
17+
// CHECK-LABEL: sil @$s8outliner7MyGizmoC11usePropertyyyF :
18+
// CHECK: [[A_FUN:%.*]] = function_ref @$sSo5GizmoC14stringPropertySSSgvgToTeab_
19+
// CHECK: apply [[A_FUN]]({{.*}}) : $@convention(thin) (@in_guaranteed Gizmo) -> @owned Optional<String>
2020
// CHECK-NOT: return
21+
// CHECK: [[P_FUN:%.*]] = function_ref @$sSo5GizmoC14stringPropertySSSgvgToTepb_
2122
// CHECK: apply [[P_FUN]]({{.*}}) : $@convention(thin) (Gizmo) -> @owned Optional<String>
2223
// CHECK: return
2324
// CHECK: } // end sil function '$s8outliner7MyGizmoC11usePropertyyyF'
@@ -65,6 +66,26 @@ public func testOutlining() {
6566
// CHECK: switch_enum [[RES]]
6667
// CHECK: } // end sil function '$s8outliner9dontCrash1ayyp_tF'
6768

69+
// CHECK-LABEL: sil shared [noinline] @$sSo5GizmoC14stringPropertySSSgvgToTeab_ : $@convention(thin) (@in_guaranteed Gizmo) -> @owned Optional<String>
70+
// CHECK: bb0(%0 : $*Gizmo):
71+
// CHECK: %1 = load %0 : $*Gizmo
72+
// CHECK: %2 = objc_method %1 : $Gizmo, #Gizmo.stringProperty!getter.foreign : (Gizmo) -> () -> String?
73+
// CHECK: %3 = apply %2(%1) : $@convention(objc_method) (Gizmo) -> @autoreleased Optional<NSString>
74+
// CHECK: switch_enum %3 : $Optional<NSString>, case #Optional.some!enumelt: bb1, case #Optional.none!enumelt: bb2
75+
// CHECK: bb1(%5 : $NSString):
76+
// CHECK: %6 = function_ref @$sSS10FoundationE36_unconditionallyBridgeFromObjectiveCySSSo8NSStringCSgFZ : $@convention(method) (@guaranteed Optional<NSString>, @thin String.Type) -> @owned String
77+
// CHECK: %7 = metatype $@thin String.Type
78+
// CHECK: %8 = apply %6(%3, %7) : $@convention(method) (@guaranteed Optional<NSString>, @thin String.Type) -> @owned String
79+
// CHECK: release_value %3 : $Optional<NSString>
80+
// CHECK: %10 = enum $Optional<String>, #Optional.some!enumelt, %8 : $String
81+
// CHECK: br bb3(%10 : $Optional<String>)
82+
// CHECK: bb2:
83+
// CHECK: %12 = enum $Optional<String>, #Optional.none!enumelt
84+
// CHECK: br bb3(%12 : $Optional<String>)
85+
// CHECK: bb3(%14 : $Optional<String>):
86+
// CHECK: return %14 : $Optional<String>
87+
// CHECK: } // end sil function '$sSo5GizmoC14stringPropertySSSgvgToTeab_'
88+
6889
// CHECK-LABEL: sil shared [noinline] @$sSo5GizmoC14stringPropertySSSgvgToTepb_ : $@convention(thin) (Gizmo) -> @owned Optional<String>
6990
// CHECK: bb0(%0 : $Gizmo):
7091
// CHECK: %1 = objc_method %0 : $Gizmo, #Gizmo.stringProperty!getter.foreign : (Gizmo) -> () -> String?

0 commit comments

Comments
 (0)