mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Type annotations for instruction operands are omitted, e.g. ``` %3 = struct $S(%1, %2) ``` Operand types are redundant anyway and were only used for sanity checking in the SIL parser. But: operand types _are_ printed if the definition of the operand value was not printed yet. This happens: * if the block with the definition appears after the block where the operand's instruction is located * if a block or instruction is printed in isolation, e.g. in a debugger The old behavior can be restored with `-Xllvm -sil-print-types`. This option is added to many existing test files which check for operand types in their check-lines.
264 lines
16 KiB
Plaintext
264 lines
16 KiB
Plaintext
// RUN: %target-sil-opt -sil-print-types -outliner %s -enable-sil-verify-all | %FileCheck %s
|
|
|
|
// REQUIRES: OS=macosx
|
|
|
|
sil_stage canonical
|
|
|
|
import Builtin
|
|
import Swift
|
|
import Foundation
|
|
|
|
|
|
@objc class MyObject {
|
|
@objc static func take(arg: Data?) -> Data?
|
|
}
|
|
|
|
sil @getData : $@convention(thin) () -> @owned Data
|
|
sil @$s10Foundation4DataV19_bridgeToObjectiveCSo6NSDataCyF : $@convention(method) (@guaranteed Data) -> @owned NSData
|
|
sil @$s10Foundation4DataV36_unconditionallyBridgeFromObjectiveCyACSo6NSDataCSgFZ : $@convention(method) (@guaranteed Optional<NSData>, @thin Data.Type) -> @owned Data
|
|
|
|
// We used to have a use-after release failure.
|
|
|
|
// CHECK-LABEL: sil [Osize] @test : $@convention(thin) (@owned MyObject) -> () {
|
|
// CHECK: bb0([[ARG:%.*]] : $MyObject):
|
|
// CHECK: [[META:%.*]] = metatype $@objc_metatype MyObject.Type
|
|
// CHECK: [[FUN1:%.*]] = function_ref @getData : $@convention(thin) () -> @owned Data
|
|
// CHECK: [[DATA:%.*]] = apply [[FUN1]]() : $@convention(thin) () -> @owned Data
|
|
// CHECK: release_value [[ARG]] : $MyObject
|
|
// CHECK: [[OUTLINED:%.*]] = function_ref @$s4main8MyObjectC4take3arg10Foundation4DataVSgAI_tFZToTembnb_ : $@convention(thin) (@owned Data, @objc_metatype MyObject.Type) -> @owned Optional<Data>
|
|
// CHECK: [[RES:%.*]] = apply [[OUTLINED]]([[DATA]], [[META]]) : $@convention(thin) (@owned Data, @objc_metatype MyObject.Type) -> @owned Optional<Data>
|
|
// CHECK: br bb1
|
|
|
|
// CHECK: bb1:
|
|
// CHECK: release_value [[RES]]
|
|
// CHECK: [[T:%.*]] = tuple ()
|
|
// CHECK: return [[T]] : $()
|
|
// CHECK: } // end sil function 'test'
|
|
|
|
sil [Osize] @test : $@convention(thin) (@owned MyObject) -> () {
|
|
bb0(%0: $MyObject):
|
|
%35 = metatype $@objc_metatype MyObject.Type
|
|
%41 = function_ref @getData : $@convention(thin) () -> @owned Data
|
|
%43 = apply %41() : $@convention(thin) () -> @owned Data
|
|
%44 = function_ref @$s10Foundation4DataV19_bridgeToObjectiveCSo6NSDataCyF : $@convention(method) (@guaranteed Data) -> @owned NSData
|
|
%45 = apply %44(%43) : $@convention(method) (@guaranteed Data) -> @owned NSData
|
|
%46 = enum $Optional<NSData>, #Optional.some!enumelt, %45 : $NSData
|
|
release_value %0 : $MyObject
|
|
release_value %43 : $Data
|
|
%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>
|
|
%51 = apply %50(%46, %35) : $@convention(objc_method) (Optional<NSData>, @objc_metatype MyObject.Type) -> @autoreleased Optional<NSData>
|
|
release_value %46 : $Optional<NSData>
|
|
switch_enum %51 : $Optional<NSData>, case #Optional.some!enumelt: bb5, case #Optional.none!enumelt: bb6
|
|
|
|
bb5(%54 : $NSData):
|
|
%55 = function_ref @$s10Foundation4DataV36_unconditionallyBridgeFromObjectiveCyACSo6NSDataCSgFZ : $@convention(method) (@guaranteed Optional<NSData>, @thin Data.Type) -> @owned Data
|
|
%56 = enum $Optional<NSData>, #Optional.some!enumelt, %54 : $NSData
|
|
%57 = metatype $@thin Data.Type
|
|
%58 = apply %55(%56, %57) : $@convention(method) (@guaranteed Optional<NSData>, @thin Data.Type) -> @owned Data
|
|
%59 = enum $Optional<Data>, #Optional.some!enumelt, %58 : $Data
|
|
release_value %56 : $Optional<NSData>
|
|
br bb7(%59 : $Optional<Data>)
|
|
|
|
bb6:
|
|
%62 = enum $Optional<Data>, #Optional.none!enumelt
|
|
br bb7(%62 : $Optional<Data>)
|
|
|
|
bb7(%64 : $Optional<Data>):
|
|
release_value %64 : $Optional<Data>
|
|
%102 = tuple ()
|
|
return %102 : $()
|
|
}
|
|
|
|
sil [Osize] @test_dont_crash : $@convention(thin) (@owned MyObject) -> () {
|
|
bb0(%0: $MyObject):
|
|
%35 = metatype $@objc_metatype MyObject.Type
|
|
%41 = function_ref @getData : $@convention(thin) () -> @owned Data
|
|
%43 = apply %41() : $@convention(thin) () -> @owned Data
|
|
%44 = function_ref @$s10Foundation4DataV19_bridgeToObjectiveCSo6NSDataCyF : $@convention(method) (@guaranteed Data) -> @owned NSData
|
|
%45 = apply %44(%43) : $@convention(method) (@guaranteed Data) -> @owned NSData
|
|
%46 = enum $Optional<NSData>, #Optional.some!enumelt, %45 : $NSData
|
|
br bb4
|
|
|
|
bb4:
|
|
release_value %0 : $MyObject
|
|
release_value %43 : $Data
|
|
%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>
|
|
%51 = apply %50(%46, %35) : $@convention(objc_method) (Optional<NSData>, @objc_metatype MyObject.Type) -> @autoreleased Optional<NSData>
|
|
release_value %46 : $Optional<NSData>
|
|
switch_enum %51 : $Optional<NSData>, case #Optional.some!enumelt: bb5, case #Optional.none!enumelt: bb6
|
|
|
|
bb5(%54 : $NSData):
|
|
%55 = function_ref @$s10Foundation4DataV36_unconditionallyBridgeFromObjectiveCyACSo6NSDataCSgFZ : $@convention(method) (@guaranteed Optional<NSData>, @thin Data.Type) -> @owned Data
|
|
%56 = enum $Optional<NSData>, #Optional.some!enumelt, %54 : $NSData
|
|
%57 = metatype $@thin Data.Type
|
|
%58 = apply %55(%56, %57) : $@convention(method) (@guaranteed Optional<NSData>, @thin Data.Type) -> @owned Data
|
|
%59 = enum $Optional<Data>, #Optional.some!enumelt, %58 : $Data
|
|
release_value %56 : $Optional<NSData>
|
|
br bb7(%59 : $Optional<Data>)
|
|
|
|
bb6:
|
|
%62 = enum $Optional<Data>, #Optional.none!enumelt
|
|
br bb7(%62 : $Optional<Data>)
|
|
|
|
bb7(%64 : $Optional<Data>):
|
|
release_value %64 : $Optional<Data>
|
|
%102 = tuple ()
|
|
return %102 : $()
|
|
}
|
|
|
|
sil @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
|
|
sil @$sSS21_builtinStringLiteral17utf8CodeUnitCount7isASCIISSBp_BwBi1_tcfC : $@convention(method) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, @thin String.Type) -> @owned String
|
|
sil @get : $@convention(thin) () -> @owned String
|
|
|
|
@objc class Ty {
|
|
@objc static func take2(_: String?, _: String?)
|
|
@objc static func take3(_: String?, _: String?, _: String?)
|
|
}
|
|
|
|
// CHECK-LABEL: sil [Osize] [ossa] @reuse_owned_2 : {{.*}} {
|
|
// CHECK: [[NATIVE:%[^,]+]] = apply {{%[^,]+}}()
|
|
// CHECK: [[TY:%[^,]+]] = metatype
|
|
// CHECK: [[OUTLINED:%[^,]+]] = function_ref @$s4main2TyC5take2yySSSg_AEtFZToTembgbgnn_
|
|
// CHECK: apply [[OUTLINED]]([[NATIVE]], [[NATIVE]], [[TY]])
|
|
// CHECK: destroy_value [[NATIVE]] : $String
|
|
// CHECK-LABEL: } // end sil function 'reuse_owned_2'
|
|
sil [ossa] [Osize] @reuse_owned_2 : $@convention(thin) () -> () {
|
|
bb0:
|
|
%get = function_ref @get : $@convention(thin) () -> @owned String
|
|
%native = apply %get() : $@convention(thin) () -> @owned String
|
|
%ty = metatype $@objc_metatype Ty.Type
|
|
%bridge = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
|
|
%bridged1 = apply %bridge(%native) : $@convention(method) (@guaranteed String) -> @owned NSString
|
|
%optbridged1 = enum $Optional<NSString>, #Optional.some!enumelt, %bridged1 : $NSString
|
|
%bridge2 = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
|
|
%bridged2 = apply %bridge2(%native) : $@convention(method) (@guaranteed String) -> @owned NSString
|
|
%optbridged2 = enum $Optional<NSString>, #Optional.some!enumelt, %bridged2 : $NSString
|
|
destroy_value %native : $String
|
|
%take2 = objc_method %ty : $@objc_metatype Ty.Type, #Ty.take2!foreign : (Ty.Type) -> (String?, String?) -> (), $@convention(objc_method) (Optional<NSString>, Optional<NSString>, @objc_metatype Ty.Type) -> ()
|
|
%27 = apply %take2(%optbridged1, %optbridged2, %ty) : $@convention(objc_method) (Optional<NSString>, Optional<NSString>, @objc_metatype Ty.Type) -> ()
|
|
destroy_value %optbridged2 : $Optional<NSString>
|
|
destroy_value %optbridged1 : $Optional<NSString>
|
|
%31 = tuple ()
|
|
return %31 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil [Osize] [ossa] @reuse_owned_3 : {{.*}} {
|
|
// CHECK: [[NATIVE:%[^,]+]] = apply {{%[^,]+}}()
|
|
// CHECK: [[TY:%[^,]+]] = metatype
|
|
// CHECK: [[OUTLINED:%[^,]+]] = function_ref @$s4main2TyC5take3yySSSg_A2EtFZToTembgbgbgnn_
|
|
// CHECK: apply [[OUTLINED]]([[NATIVE]], [[NATIVE]], [[NATIVE]], [[TY]])
|
|
// CHECK: destroy_value [[NATIVE]] : $String
|
|
// CHECK-LABEL: } // end sil function 'reuse_owned_3'
|
|
sil [ossa] [Osize] @reuse_owned_3 : $@convention(thin) () -> () {
|
|
bb0:
|
|
%get = function_ref @get : $@convention(thin) () -> @owned String
|
|
%native = apply %get() : $@convention(thin) () -> @owned String
|
|
%ty = metatype $@objc_metatype Ty.Type
|
|
%bridge = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
|
|
%bridged1 = apply %bridge(%native) : $@convention(method) (@guaranteed String) -> @owned NSString
|
|
%optbridged1 = enum $Optional<NSString>, #Optional.some!enumelt, %bridged1 : $NSString
|
|
%bridge2 = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
|
|
%bridged2 = apply %bridge2(%native) : $@convention(method) (@guaranteed String) -> @owned NSString
|
|
%optbridged2 = enum $Optional<NSString>, #Optional.some!enumelt, %bridged2 : $NSString
|
|
%bridge3 = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
|
|
%bridged3 = apply %bridge3(%native) : $@convention(method) (@guaranteed String) -> @owned NSString
|
|
%optbridged3 = enum $Optional<NSString>, #Optional.some!enumelt, %bridged3 : $NSString
|
|
destroy_value %native : $String
|
|
%take2 = objc_method %ty : $@objc_metatype Ty.Type, #Ty.take3!foreign : (Ty.Type) -> (String?, String?, String?) -> (), $@convention(objc_method) (Optional<NSString>, Optional<NSString>, Optional<NSString>, @objc_metatype Ty.Type) -> ()
|
|
%27 = apply %take2(%optbridged1, %optbridged2, %optbridged3, %ty) : $@convention(objc_method) (Optional<NSString>, Optional<NSString>, Optional<NSString>, @objc_metatype Ty.Type) -> ()
|
|
destroy_value %optbridged3 : $Optional<NSString>
|
|
destroy_value %optbridged2 : $Optional<NSString>
|
|
destroy_value %optbridged1 : $Optional<NSString>
|
|
%31 = tuple ()
|
|
return %31 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil [Osize] [ossa] @reuse_guaranteed_2 : {{.*}} {
|
|
// CHECK: bb0([[NATIVE:%[^,]+]] :
|
|
// CHECK: [[TY:%[^,]+]] = metatype
|
|
// CHECK: [[OUTLINED:%[^,]+]] = function_ref @$s4main2TyC5take2yySSSg_AEtFZToTembgbgnn_
|
|
// CHECK: apply [[OUTLINED]]([[NATIVE]], [[NATIVE]], [[TY]])
|
|
// CHECK-LABEL: } // end sil function 'reuse_guaranteed_2'
|
|
sil [ossa] [Osize] @reuse_guaranteed_2 : $@convention(thin) (@guaranteed String) -> () {
|
|
bb0(%native : @guaranteed $String):
|
|
%ty = metatype $@objc_metatype Ty.Type
|
|
%bridge = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
|
|
%bridged1 = apply %bridge(%native) : $@convention(method) (@guaranteed String) -> @owned NSString
|
|
%optbridged1 = enum $Optional<NSString>, #Optional.some!enumelt, %bridged1 : $NSString
|
|
%bridge2 = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
|
|
%bridged2 = apply %bridge2(%native) : $@convention(method) (@guaranteed String) -> @owned NSString
|
|
%optbridged2 = enum $Optional<NSString>, #Optional.some!enumelt, %bridged2 : $NSString
|
|
%take2 = objc_method %ty : $@objc_metatype Ty.Type, #Ty.take2!foreign : (Ty.Type) -> (String?, String?) -> (), $@convention(objc_method) (Optional<NSString>, Optional<NSString>, @objc_metatype Ty.Type) -> ()
|
|
%27 = apply %take2(%optbridged1, %optbridged2, %ty) : $@convention(objc_method) (Optional<NSString>, Optional<NSString>, @objc_metatype Ty.Type) -> ()
|
|
destroy_value %optbridged2 : $Optional<NSString>
|
|
destroy_value %optbridged1 : $Optional<NSString>
|
|
%31 = tuple ()
|
|
return %31 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil [Osize] [ossa] @reuse_guaranteed_3 : {{.*}} {
|
|
// CHECK: bb0([[NATIVE:%[^,]+]] :
|
|
// CHECK: [[TY:%[^,]+]] = metatype
|
|
// CHECK: [[OUTLINED:%[^,]+]] = function_ref @$s4main2TyC5take3yySSSg_A2EtFZToTembgbgbgnn_
|
|
// CHECK: apply [[OUTLINED]]([[NATIVE]], [[NATIVE]], [[NATIVE]], [[TY]])
|
|
// CHECK-LABEL: } // end sil function 'reuse_guaranteed_3'
|
|
sil [ossa] [Osize] @reuse_guaranteed_3 : $@convention(thin) (@guaranteed String) -> () {
|
|
bb0(%native : @guaranteed $String):
|
|
%ty = metatype $@objc_metatype Ty.Type
|
|
%bridge = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
|
|
%bridged1 = apply %bridge(%native) : $@convention(method) (@guaranteed String) -> @owned NSString
|
|
%optbridged1 = enum $Optional<NSString>, #Optional.some!enumelt, %bridged1 : $NSString
|
|
%bridge2 = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
|
|
%bridged2 = apply %bridge2(%native) : $@convention(method) (@guaranteed String) -> @owned NSString
|
|
%optbridged2 = enum $Optional<NSString>, #Optional.some!enumelt, %bridged2 : $NSString
|
|
%bridge3 = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
|
|
%bridged3 = apply %bridge3(%native) : $@convention(method) (@guaranteed String) -> @owned NSString
|
|
%optbridged3 = enum $Optional<NSString>, #Optional.some!enumelt, %bridged3 : $NSString
|
|
%take2 = objc_method %ty : $@objc_metatype Ty.Type, #Ty.take3!foreign : (Ty.Type) -> (String?, String?, String?) -> (), $@convention(objc_method) (Optional<NSString>, Optional<NSString>, Optional<NSString>, @objc_metatype Ty.Type) -> ()
|
|
%27 = apply %take2(%optbridged1, %optbridged2, %optbridged3, %ty) : $@convention(objc_method) (Optional<NSString>, Optional<NSString>, Optional<NSString>, @objc_metatype Ty.Type) -> ()
|
|
destroy_value %optbridged3 : $Optional<NSString>
|
|
destroy_value %optbridged2 : $Optional<NSString>
|
|
destroy_value %optbridged1 : $Optional<NSString>
|
|
%31 = tuple ()
|
|
return %31 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil shared [serialized] [noinline] [ossa] @$s4main2TyC5take2yySSSg_AEtFZToTembgbgnn_ : {{.*}} {
|
|
// CHECK: bb0([[FIRST:%[^,]+]] : @guaranteed
|
|
// CHECK-SAME: , [[SECOND:%[^,]+]] : @guaranteed
|
|
// CHECK-SAME: , [[TY:%[^,]+]] : $@objc_metatype
|
|
// CHECK-SAME: ):
|
|
// CHECK: [[CALLEE:%[^,]+]] = objc_method [[TY]]
|
|
// CHECK: [[BRIDGE_1:%[^,]+]] = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF
|
|
// CHECK: [[BRIDGED_1:%[^,]+]] = apply [[BRIDGE_1]]([[FIRST]])
|
|
// CHECK: [[OPT_BRIDGED_1:%[^,]+]] = enum $Optional<NSString>, #Optional.some!enumelt, [[BRIDGED_1]]
|
|
// CHECK: [[BRIDGE_2:%[^,]+]] = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF
|
|
// CHECK: [[BRIDGED_2:%[^,]+]] = apply [[BRIDGE_2]]([[SECOND]])
|
|
// CHECK: [[OPT_BRIDGED_2:%[^,]+]] = enum $Optional<NSString>, #Optional.some!enumelt, [[BRIDGED_2]]
|
|
// CHECK: apply [[CALLEE]]([[OPT_BRIDGED_1]], [[OPT_BRIDGED_2]], [[TY]])
|
|
// CHECK: destroy_value [[OPT_BRIDGED_2]]
|
|
// CHECK: destroy_value [[OPT_BRIDGED_1]]
|
|
// CHECK-LABEL: } // end sil function '$s4main2TyC5take2yySSSg_AEtFZToTembgbgnn_'
|
|
|
|
// CHECK-LABEL: sil shared [serialized] [noinline] [ossa] @$s4main2TyC5take3yySSSg_A2EtFZToTembgbgbgnn_ : {{.*}} {
|
|
// CHECK: bb0([[FIRST:%[^,]+]] : @guaranteed
|
|
// CHECK-SAME: , [[SECOND:%[^,]+]] : @guaranteed
|
|
// CHECK-SAME: , [[THIRD:%[^,]+]] : @guaranteed
|
|
// CHECK-SAME: , [[TY:%[^,]+]] : $@objc_metatype
|
|
// CHECK-SAME: ):
|
|
// CHECK: [[CALLEE:%[^,]+]] = objc_method [[TY]]
|
|
// CHECK: [[BRIDGE_1:%[^,]+]] = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF
|
|
// CHECK: [[BRIDGED_1:%[^,]+]] = apply [[BRIDGE_1]]([[FIRST]])
|
|
// CHECK: [[OPT_BRIDGED_1:%[^,]+]] = enum $Optional<NSString>, #Optional.some!enumelt, [[BRIDGED_1]]
|
|
// CHECK: [[BRIDGE_2:%[^,]+]] = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF
|
|
// CHECK: [[BRIDGED_2:%[^,]+]] = apply [[BRIDGE_2]]([[SECOND]])
|
|
// CHECK: [[OPT_BRIDGED_2:%[^,]+]] = enum $Optional<NSString>, #Optional.some!enumelt, [[BRIDGED_2]]
|
|
// CHECK: [[BRIDGE_3:%[^,]+]] = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF
|
|
// CHECK: [[BRIDGED_3:%[^,]+]] = apply [[BRIDGE_3]]([[THIRD]])
|
|
// CHECK: [[OPT_BRIDGED_3:%[^,]+]] = enum $Optional<NSString>, #Optional.some!enumelt, [[BRIDGED_3]]
|
|
// CHECK: apply [[CALLEE]]([[OPT_BRIDGED_1]], [[OPT_BRIDGED_2]], [[OPT_BRIDGED_3]], [[TY]])
|
|
// CHECK: destroy_value [[OPT_BRIDGED_3]]
|
|
// CHECK: destroy_value [[OPT_BRIDGED_2]]
|
|
// CHECK: destroy_value [[OPT_BRIDGED_1]]
|
|
// CHECK-LABEL: } // end sil function '$s4main2TyC5take3yySSSg_A2EtFZToTembgbgbgnn_'
|