Files
swift-mirror/test/SILOptimizer/outliner.sil
Erik Eckstein 7cceaff5f3 SIL: don't print operand types in textual SIL
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.
2024-11-21 18:49:52 +01:00

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_'