Skip to content

Commit a9eea9f

Browse files
authored
Merge pull request #14180 from eeckstein/fix-castoptimizer-5.0
2 parents 9cd9f26 + 4074f76 commit a9eea9f

File tree

2 files changed

+49
-2
lines changed

2 files changed

+49
-2
lines changed

lib/SILOptimizer/Utils/Local.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1457,8 +1457,10 @@ optimizeBridgedObjCToSwiftCast(SILInstruction *Inst,
14571457
} else if (isConditional) {
14581458
SILBasicBlock *CastSuccessBB = Inst->getFunction()->createBasicBlock();
14591459
CastSuccessBB->createPHIArgument(SILBridgedTy, ValueOwnershipKind::Owned);
1460-
NewI = Builder.createCheckedCastBranch(Loc, false, Load, SILBridgedTy,
1461-
CastSuccessBB, ConvFailBB);
1460+
auto *CCBI = Builder.createCheckedCastBranch(Loc, false, Load,
1461+
SILBridgedTy, CastSuccessBB, ConvFailBB);
1462+
NewI = CCBI;
1463+
splitEdge(CCBI, /* EdgeIdx to ConvFailBB */ 1);
14621464
Builder.setInsertionPoint(CastSuccessBB);
14631465
SrcOp = CastSuccessBB->getArgument(0);
14641466
} else {
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -performance-constant-propagation %s | %FileCheck %s
2+
3+
// REQUIRES: objc_interop
4+
5+
sil_stage canonical
6+
7+
import Builtin
8+
import Swift
9+
import Foundation
10+
11+
class TestObjCKeyTy : NSObject {
12+
override init()
13+
}
14+
struct TestBridgedKeyTy : _ObjectiveCBridgeable {
15+
func _bridgeToObjectiveC() -> TestObjCKeyTy
16+
static func _forceBridgeFromObjectiveC(_ x: TestObjCKeyTy, result: inout TestBridgedKeyTy?)
17+
static func _conditionallyBridgeFromObjectiveC(_ x: TestObjCKeyTy, result: inout TestBridgedKeyTy?) -> Bool
18+
static func _unconditionallyBridgeFromObjectiveC(_ source: TestObjCKeyTy?) -> TestBridgedKeyTy
19+
}
20+
21+
// Test that we don't crash in the verifier because of a critical edge
22+
23+
// CHECK-LABEL: testit
24+
// CHECK: checked_cast_br
25+
sil @testit : $@convention(thin) (@owned NSObject) -> () {
26+
bb0(%0 : $NSObject):
27+
%73 = alloc_stack $NSObject
28+
store %0 to %73 : $*NSObject
29+
%75 = alloc_stack $Optional<TestBridgedKeyTy>
30+
%76 = init_enum_data_addr %75 : $*Optional<TestBridgedKeyTy>, #Optional.some!enumelt.1
31+
%77 = load %73 : $*NSObject
32+
checked_cast_addr_br take_always NSObject in %73 : $*NSObject to TestBridgedKeyTy in %76 : $*TestBridgedKeyTy, bb1, bb2
33+
34+
bb1:
35+
br bb3
36+
37+
bb2:
38+
br bb3
39+
40+
bb3:
41+
dealloc_stack %75 : $*Optional<TestBridgedKeyTy>
42+
dealloc_stack %73 : $*NSObject
43+
%r = tuple ()
44+
return %r : $()
45+
}

0 commit comments

Comments
 (0)