Skip to content

Commit 68b4671

Browse files
committed
[sil-combine] Enable sil-combine simplifications for {thick_to_objc,objc_to_thick}_metatype.
Metatype always have none ownership, so we can just perform this. I also removed a test (peephole_thick_to_objc_metatype.sil) that I had in a previous commit renamed to sil_combine_peephole_thick_to_objc_metatype.sil. This was os that this matched the rest of the sil_combine tests that have the 'sil_combine_*' prefix.
1 parent b6f873b commit 68b4671

File tree

4 files changed

+42
-213
lines changed

4 files changed

+42
-213
lines changed

lib/SILOptimizer/SILCombiner/SILCombinerCastVisitors.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -800,9 +800,6 @@ visitUncheckedBitwiseCastInst(UncheckedBitwiseCastInst *UBCI) {
800800

801801
SILInstruction *
802802
SILCombiner::visitThickToObjCMetatypeInst(ThickToObjCMetatypeInst *TTOCMI) {
803-
if (TTOCMI->getFunction()->hasOwnership())
804-
return nullptr;
805-
806803
if (auto *OCTTMI = dyn_cast<ObjCToThickMetatypeInst>(TTOCMI->getOperand())) {
807804
TTOCMI->replaceAllUsesWith(OCTTMI->getOperand());
808805
return eraseInstFromFunction(*TTOCMI);
@@ -825,9 +822,6 @@ SILCombiner::visitThickToObjCMetatypeInst(ThickToObjCMetatypeInst *TTOCMI) {
825822

826823
SILInstruction *
827824
SILCombiner::visitObjCToThickMetatypeInst(ObjCToThickMetatypeInst *OCTTMI) {
828-
if (OCTTMI->getFunction()->hasOwnership())
829-
return nullptr;
830-
831825
if (auto *TTOCMI = dyn_cast<ThickToObjCMetatypeInst>(OCTTMI->getOperand())) {
832826
OCTTMI->replaceAllUsesWith(TTOCMI->getOperand());
833827
return eraseInstFromFunction(*OCTTMI);

test/SILOptimizer/peephole_thick_to_objc_metatype.sil

Lines changed: 0 additions & 164 deletions
This file was deleted.

test/SILOptimizer/sil_combine_ossa.sil

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4267,14 +4267,14 @@ bb0(%0 : $Builtin.Int64):
42674267
convenience init(type: String) throws
42684268
}
42694269
// CHECK-LABEL: sil hidden [thunk] [ossa] @objc_init_partial_dealloc : $@convention(objc_method) (@owned TestObjCInit) -> @owned Optional<TestObjCInit> {
4270-
// XHECK: bb0(%0 : @owned $TestObjCInit):
4271-
// XHECK: [[VMT2:%.*]] = value_metatype $@objc_metatype TestObjCInit.Type, %0 : $TestObjCInit
4272-
// XHECK: [[VMT:%.*]] = value_metatype $@thick TestObjCInit.Type, %0 : $TestObjCInit
4273-
// XHECK: dealloc_partial_ref %0 : $TestObjCInit, [[VMT]] : $@thick TestObjCInit.Type
4274-
// XHECK-NOT: value_metatype
4275-
// XHECK: [[O:%.*]] = alloc_ref_dynamic [objc] [[VMT2]] : $@objc_metatype TestObjCInit.Type, $TestObjCInit
4276-
// XHECK: [[M:%.*]] = objc_method [[O]] : $TestObjCInit, #TestObjCInit.init!initializer.foreign : (TestObjCInit.Type) -> () -> TestObjCInit, $@convention(objc_method) (@owned TestObjCInit) -> @owned TestObjCInit
4277-
// XHECK: apply [[M]]([[O]]) : $@convention(objc_method) (@owned TestObjCInit) -> @owned TestObjCInit
4270+
// CHECK: bb0(%0 : @owned $TestObjCInit):
4271+
// CHECK: [[VMT2:%.*]] = value_metatype $@objc_metatype TestObjCInit.Type, %0 : $TestObjCInit
4272+
// CHECK: [[VMT:%.*]] = value_metatype $@thick TestObjCInit.Type, %0 : $TestObjCInit
4273+
// CHECK: dealloc_partial_ref %0 : $TestObjCInit, [[VMT]] : $@thick TestObjCInit.Type
4274+
// CHECK-NOT: value_metatype
4275+
// CHECK: [[O:%.*]] = alloc_ref_dynamic [objc] [[VMT2]] : $@objc_metatype TestObjCInit.Type, $TestObjCInit
4276+
// CHECK: [[M:%.*]] = objc_method [[O]] : $TestObjCInit, #TestObjCInit.init!initializer.foreign : (TestObjCInit.Type) -> () -> TestObjCInit, $@convention(objc_method) (@owned TestObjCInit) -> @owned TestObjCInit
4277+
// CHECK: apply [[M]]([[O]]) : $@convention(objc_method) (@owned TestObjCInit) -> @owned TestObjCInit
42784278
// CHECK-LABEL: } // end sil function 'objc_init_partial_dealloc'
42794279
sil hidden [thunk] [ossa] @objc_init_partial_dealloc : $@convention(objc_method) (@owned TestObjCInit) -> @owned Optional<TestObjCInit> {
42804280
bb0(%2 : @owned $TestObjCInit):

test/SILOptimizer/sil_combine_peephole_thick_to_objc_metatype_ossa.sil

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ class XImpl : X {
2121
// (thick_to_objc_metatype (metatype @thick)) -> (metatype @objc_metatype)
2222
//
2323
// CHECK-LABEL: sil [ossa] @_TF31peephole_thick_to_objc_metatype36test_thick_to_objc_metatype_metatypeFT_Ps9AnyObject_ : $@convention(thin) () -> @owned AnyObject
24-
// XHECK-NOT: metatype $@thick
25-
// XHECK-NOT: {{thick_to_objc_metatype }}
26-
// XHECK: metatype $@objc_metatype
27-
// XHECK: return
24+
// CHECK-NOT: metatype $@thick
25+
// CHECK-NOT: {{thick_to_objc_metatype }}
26+
// CHECK: metatype $@objc_metatype
27+
// CHECK: return
2828
// peephole_thick_to_objc_metatype.test_thick_to_objc_metatype_metatype () -> Swift.AnyObject
2929
sil [ossa] @_TF31peephole_thick_to_objc_metatype36test_thick_to_objc_metatype_metatypeFT_Ps9AnyObject_ : $@convention(thin) () -> @owned AnyObject {
3030
bb0:
@@ -37,10 +37,10 @@ bb0:
3737
// (thick_to_objc_metatype (existential_metatype @thick)) -> (existential_metatype @objc_metatype)
3838
//
3939
// CHECK-LABEL: sil [ossa] @_TF31peephole_thick_to_objc_metatype48test_thick_to_objc_metatype_existential_metatypeFPS_1X_Ps9AnyObject_ : $@convention(thin) (@owned X) -> @owned AnyObject
40-
// XHECK-NOT: existential_metatype $@thick
41-
// XHECK-NOT: {{thick_to_objc_metatype }}
42-
// XHECK: existential_metatype $@objc_metatype
43-
// XHECK: return
40+
// CHECK-NOT: existential_metatype $@thick
41+
// CHECK-NOT: {{thick_to_objc_metatype }}
42+
// CHECK: existential_metatype $@objc_metatype
43+
// CHECK: return
4444
// peephole_thick_to_objc_metatype.test_thick_to_objc_metatype_existential_metatype (peephole_thick_to_objc_metatype.X) -> Swift.AnyObject
4545
sil [ossa] @_TF31peephole_thick_to_objc_metatype48test_thick_to_objc_metatype_existential_metatypeFPS_1X_Ps9AnyObject_ : $@convention(thin) (@owned X) -> @owned AnyObject {
4646
bb0(%0 : @owned $X):
@@ -56,10 +56,10 @@ bb0(%0 : @owned $X):
5656
// (thick_to_objc_metatype (value_metatype @thick)) -> (value_metatype @objc_metatype)
5757
//
5858
// CHECK-LABEL: sil [ossa] @_TF31peephole_thick_to_objc_metatype42test_thick_to_objc_metatype_value_metatypeUs9AnyObject__FQ_PS0__ : $@convention(thin) <T where T : AnyObject> (@owned T) -> @owned An
59-
// XHECK-NOT: value_metatype $@thick
60-
// XHECK-NOT: {{thick_to_objc_metatype }}
61-
// XHECK: value_metatype $@objc_metatype
62-
// XHECK: return
59+
// CHECK-NOT: value_metatype $@thick
60+
// CHECK-NOT: {{thick_to_objc_metatype }}
61+
// CHECK: value_metatype $@objc_metatype
62+
// CHECK: return
6363
// peephole_thick_to_objc_metatype.test_thick_to_objc_metatype_value_metatype <A : Swift.AnyObject>(A) -> Swift.AnyObject
6464
sil [ossa] @_TF31peephole_thick_to_objc_metatype42test_thick_to_objc_metatype_value_metatypeUs9AnyObject__FQ_PS0__ : $@convention(thin) <T where T : AnyObject> (@owned T) -> @owned AnyObject {
6565
bb0(%0 : @owned $T):
@@ -75,10 +75,10 @@ bb0(%0 : @owned $T):
7575
// (objc_to_thick_metatype (metatype @objc_metatype)) -> (metatype @thick)
7676
//
7777
// CHECK-LABEL: sil [ossa] @_TF31peephole_thick_to_objc_metatype36test_objc_to_thick_metatype_metatypeFT_Ps9AnyObject_ : $@convention(thin) () -> @thick XImpl.Type
78-
// XHECK-NOT: metatype $@objc_metatype
79-
// XHECK-NOT: {{objc_to_thick_metatype }}
80-
// XHECK: metatype $@thick
81-
// XHECK: return
78+
// CHECK-NOT: metatype $@objc_metatype
79+
// CHECK-NOT: {{objc_to_thick_metatype }}
80+
// CHECK: metatype $@thick
81+
// CHECK: return
8282
sil [ossa] @_TF31peephole_thick_to_objc_metatype36test_objc_to_thick_metatype_metatypeFT_Ps9AnyObject_ : $@convention(thin) () -> @thick XImpl.Type {
8383
bb0:
8484
%0 = metatype $@objc_metatype XImpl.Type // users: %1, %2
@@ -89,10 +89,10 @@ bb0:
8989
// (objc_to_objc_metatype (existential_metatype @objc_metatype)) -> (existential_metatype @thick)
9090
//
9191
// CHECK-LABEL: sil [ossa] @_TF31peephole_thick_to_objc_metatype48test_objc_to_thick_metatype_existential_metatypeFPS_1X_Ps9AnyObject_ : $@convention(thin) (@owned X) -> @thick X.Type
92-
// XHECK-NOT: existential_metatype $@objc_metatype
93-
// XHECK-NOT: {{objc_to_thick_metatype }}
94-
// XHECK: existential_metatype $@thick
95-
// XHECK: return
92+
// CHECK-NOT: existential_metatype $@objc_metatype
93+
// CHECK-NOT: {{objc_to_thick_metatype }}
94+
// CHECK: existential_metatype $@thick
95+
// CHECK: return
9696
sil [ossa] @_TF31peephole_thick_to_objc_metatype48test_objc_to_thick_metatype_existential_metatypeFPS_1X_Ps9AnyObject_ : $@convention(thin) (@owned X) -> @thick X.Type {
9797
bb0(%0 : @owned $X):
9898
debug_value %0 : $X, let, name "o" // id: %1
@@ -105,10 +105,10 @@ bb0(%0 : @owned $X):
105105
// (objc_to_thick_metatype (value_metatype @objc_metatype)) -> (value_metatype @thick)
106106
//
107107
// CHECK-LABEL: sil [ossa] @_TF31peephole_thick_to_objc_metatype42test_objc_to_thick_metatype_value_metatypeUs9AnyObject__FQ_PS0__ : $@convention(thin) <T where T : AnyObject> (@owned T) -> @thick T.Type
108-
// XHECK-NOT: value_metatype $@objc_metatype
109-
// XHECK-NOT: {{objc_to_thick_metatype }}
110-
// XHECK: value_metatype $@thick
111-
// XHECK: return
108+
// CHECK-NOT: value_metatype $@objc_metatype
109+
// CHECK-NOT: {{objc_to_thick_metatype }}
110+
// CHECK: value_metatype $@thick
111+
// CHECK: return
112112
sil [ossa] @_TF31peephole_thick_to_objc_metatype42test_objc_to_thick_metatype_value_metatypeUs9AnyObject__FQ_PS0__ : $@convention(thin) <T where T : AnyObject> (@owned T) -> @thick T.Type {
113113
bb0(%0 : @owned $T):
114114
debug_value %0 : $T, let, name "o" // id: %1
@@ -119,11 +119,11 @@ bb0(%0 : @owned $T):
119119
}
120120

121121
// CHECK-LABEL: sil [ossa] @$test_peephole_objc_to_thick_to_objc :
122-
// XHECK: [[T:%.*]] = apply
123-
// XHECK-NOT: objc_to_thick_metatype
124-
// XHECK-NOT: thick_to_objc_metatype
125-
// XHECK: enum $Optional<@objc_metatype AnyObject.Type>, #Optional.some!enumelt, [[T]] : $@objc_metatype AnyObject.Type
126-
// XHECK: } // end sil function '$test_peephole_objc_to_thick_to_objc'
122+
// CHECK: [[T:%.*]] = apply
123+
// CHECK-NOT: objc_to_thick_metatype
124+
// CHECK-NOT: thick_to_objc_metatype
125+
// CHECK: enum $Optional<@objc_metatype AnyObject.Type>, #Optional.some!enumelt, [[T]] : $@objc_metatype AnyObject.Type
126+
// CHECK: } // end sil function '$test_peephole_objc_to_thick_to_objc'
127127

128128
sil [ossa] @$test_peephole_objc_to_thick_to_objc : $@convention(thin) (@guaranteed NSObject) -> Optional<UnsafeMutablePointer<OpaquePointer>> {
129129
// %0 "obj" // users: %3, %2, %1
@@ -144,12 +144,11 @@ bb0(%0 : @guaranteed $NSObject):
144144
}
145145

146146
// CHECK-LABEL: sil [ossa] @$test_peephole_thick_to_objc_to_thick :
147-
// XHECK: [[T:%.*]] = apply
148-
// XHECK-NOT: thick_to_objc_metatype
149-
// XHECK-NOT: objc_to_thick_metatype
150-
// XHECK: return [[T]]
151-
// XHECK: } // end sil function '$test_peephole_thick_to_objc_to_thick'
152-
147+
// CHECK: [[T:%.*]] = apply
148+
// CHECK-NOT: thick_to_objc_metatype
149+
// CHECK-NOT: objc_to_thick_metatype
150+
// CHECK: return [[T]]
151+
// CHECK: } // end sil function '$test_peephole_thick_to_objc_to_thick'
153152
sil [ossa] @$test_peephole_thick_to_objc_to_thick : $@convention(thin) (@guaranteed AnyObject) -> @thick AnyObject.Type {
154153
bb0(%0 : @guaranteed $AnyObject):
155154
%func = function_ref @foo : $@convention(thin) (@guaranteed AnyObject) -> @thick AnyObject.Type

0 commit comments

Comments
 (0)