Skip to content

Commit 63fc691

Browse files
Merge pull request #31364 from aschwaighofer/fix_outliner_62494475_5.3
[5.3] Outliner: Fix an iterator problem
2 parents 05127e0 + 7b41296 commit 63fc691

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

lib/SILOptimizer/Transforms/Outliner.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,8 @@ BridgedArgument BridgedArgument::match(unsigned ArgIdx, SILValue Arg,
794794

795795
// Make sure that if we have a bridged value release that it is on the bridged
796796
// value.
797+
if (Enum->getParent() != AI->getParent())
798+
return BridgedArgument();
797799
auto *BridgedValueRelease = dyn_cast_or_null<ReleaseValueInst>(
798800
findReleaseOf(BridgedValue, std::next(SILBasicBlock::iterator(Enum)),
799801
SILBasicBlock::iterator(AI)));

test/SILOptimizer/outliner.sil

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,40 @@ bb7(%64 : $Optional<Data>):
6868
%102 = tuple ()
6969
return %102 : $()
7070
}
71+
72+
sil [Osize] @test_dont_crash : $@convention(thin) (@owned MyObject) -> () {
73+
bb0(%0: $MyObject):
74+
%35 = metatype $@objc_metatype MyObject.Type
75+
%41 = function_ref @getData : $@convention(thin) () -> @owned Data
76+
%43 = apply %41() : $@convention(thin) () -> @owned Data
77+
%44 = function_ref @$s10Foundation4DataV19_bridgeToObjectiveCSo6NSDataCyF : $@convention(method) (@guaranteed Data) -> @owned NSData
78+
%45 = apply %44(%43) : $@convention(method) (@guaranteed Data) -> @owned NSData
79+
%46 = enum $Optional<NSData>, #Optional.some!enumelt, %45 : $NSData
80+
br bb4
81+
82+
bb4:
83+
release_value %0 : $MyObject
84+
release_value %43 : $Data
85+
%50 = objc_method %35 : $@objc_metatype MyObject.Type, #MyObject.take!foreign : (MyObject.Type) -> (Data?) -> Data?, $@convention(objc_method) (Optional<NSData>, @objc_metatype MyObject.Type) -> @autoreleased Optional<NSData>
86+
%51 = apply %50(%46, %35) : $@convention(objc_method) (Optional<NSData>, @objc_metatype MyObject.Type) -> @autoreleased Optional<NSData>
87+
release_value %46 : $Optional<NSData>
88+
switch_enum %51 : $Optional<NSData>, case #Optional.some!enumelt: bb5, case #Optional.none!enumelt: bb6
89+
90+
bb5(%54 : $NSData):
91+
%55 = function_ref @$s10Foundation4DataV36_unconditionallyBridgeFromObjectiveCyACSo6NSDataCSgFZ : $@convention(method) (@guaranteed Optional<NSData>, @thin Data.Type) -> @owned Data
92+
%56 = enum $Optional<NSData>, #Optional.some!enumelt, %54 : $NSData
93+
%57 = metatype $@thin Data.Type
94+
%58 = apply %55(%56, %57) : $@convention(method) (@guaranteed Optional<NSData>, @thin Data.Type) -> @owned Data
95+
%59 = enum $Optional<Data>, #Optional.some!enumelt, %58 : $Data
96+
release_value %56 : $Optional<NSData>
97+
br bb7(%59 : $Optional<Data>)
98+
99+
bb6:
100+
%62 = enum $Optional<Data>, #Optional.none!enumelt
101+
br bb7(%62 : $Optional<Data>)
102+
103+
bb7(%64 : $Optional<Data>):
104+
release_value %64 : $Optional<Data>
105+
%102 = tuple ()
106+
return %102 : $()
107+
}

0 commit comments

Comments
 (0)