Files
swift-mirror/test/SIL/Serialization/boxes.sil
Erik Eckstein 18063707b5 Optimizer: enable complete OSSA lifetimes throughout the pass pipeline
This new OSSA invariant simplifies many optimizations because they don't have to take care of the corner case of incomplete lifetimes in dead-end blocks.

The implementation basically consists of these changes:
* add the lifetime completion utility
* add a flag in SILFunction which tells optimization that they need to run the lifetime completion utility
* let all optimizations complete lifetimes if necessary
* enable the ownership verifier to check complete lifetimes
2026-01-22 17:41:48 +01:00

110 lines
5.1 KiB
Plaintext

// First parse this and then emit a *.sib. Then read in the *.sib, then recreate
// RUN: %empty-directory(%t)
// RUN: %target-sil-opt %s -emit-sib -o %t/tmp.sib -module-name boxes
// RUN: %target-sil-opt %t/tmp.sib -emit-sib -o %t/tmp.2.sib -module-name boxes
// RUN: %target-sil-opt %t/tmp.2.sib -module-name boxes -emit-sorted-sil | %FileCheck %s
// Keep this file in sorted order by using alphabetical prefixes on the SIL functions.
sil_stage canonical
import Swift
protocol P {}
struct F {}
struct G: P {}
struct Q: P {}
// TODO: Transform boxes by transforming their arguments, not as single-field,
// so that they work as parameters in generic SIL functions.
// CHECK-LABEL: sil hidden [ossa] @AA_box_type_parsing : $@convention(thin) (
sil hidden [ossa] @AA_box_type_parsing : $@convention(thin) (
// CHECK: <τ_0_0> { var τ_0_0 } <F>,
<B>{ var B }<F>,
// CHECK: <τ_0_0 where τ_0_0 : P> { let τ_0_0 } <G>,
<C: P>{ let C }<G>,
// CHECK: <τ_0_0 where τ_0_0 : P> { var τ_0_0 } <Q>,
<D: P>{ var D }<Q>,
// CHECK: { let Int },
{ let Int },
// CHECK: { var Int, let String },
{ var Int, let String },
// CHECK: { },
{},
// CHECK: <τ_0_0, τ_0_1, τ_0_2> { var τ_0_0, let τ_0_2 } <Int, String, Optional<Double>>
<X, Y, Z>{ var X, let Z }<Int, String, Optional<Double>>
// CHECK: ) -> ()
) -> () {
entry(%0 : @unowned $<E>{ var E }<F>, %1 : @unowned $<F: P>{ let F }<G>, %2 : @unowned $<G: P>{ var G }<Q>, %3 : @unowned ${ let Int }, %4 : @unowned ${ var Int, let String }, %5 : @unowned ${}, %6 : @unowned $<XX, YY, ZZ>{ var XX, let ZZ }<Int, String, Optional<Double>>):
unreachable
}
// CHECK-LABEL: sil hidden [ossa] @BB_box_type_parsing_in_generic_function : $@convention(thin) <F, G where G : P> (
sil hidden [ossa] @BB_box_type_parsing_in_generic_function : $@convention(thin) <F, G: P> (
// CHECK: <τ_0_0> { var τ_0_0 } <F>,
<B>{ var B }<F>,
// CHECK: <τ_0_0 where τ_0_0 : P> { let τ_0_0 } <G>,
<C: P>{ let C }<G>,
// CHECK: <τ_0_0 where τ_0_0 : P> { var τ_0_0 } <Q>,
<D: P>{ var D }<Q>,
// CHECK: { let Int },
{ let Int },
// CHECK: { var Int, let String },
{ var Int, let String },
// CHECK: { },
{},
// CHECK: <τ_0_0, τ_0_1, τ_0_2> { var τ_0_0, let τ_0_2 } <Int, String, Optional<Double>>
<X, Y, Z>{ var X, let Z }<Int, String, Optional<Double>>
// CHECK: ) -> ()
) -> () {
entry(%0 : @unowned $<E>{ var E }<F>, %1 : @unowned $<F: P>{ let F }<G>, %2 : @unowned $<G: P>{ var G }<Q>, %3 : @unowned ${ let Int }, %4 : @unowned ${ var Int, let String }, %5 : @unowned ${}, %6 : @unowned $<XX, YY, ZZ>{ var XX, let ZZ }<Int, String, Optional<Double>>):
unreachable
}
// CHECK-LABEL: sil hidden [ossa] @CC_same_generic_param_name_in_multiple_box_signatures : $@convention(thin) (
sil hidden [ossa] @CC_same_generic_param_name_in_multiple_box_signatures : $@convention(thin) (
// CHECK: <τ_0_0> { var τ_0_0 } <Int>,
<A> { var A } <Int>,
// CHECK: <τ_0_0> { var τ_0_0 } <String>
<A> { var A } <String>
// CHECK: ) -> ()
) -> () {
entry(%0 : @unowned $<A> { var A } <Int>, %1 : @unowned $<A> { var A } <String>):
unreachable
}
// CHECK-LABEL: sil hidden [ossa] @DD_same_generic_param_name_in_outer_scope : $@convention(thin) <A> (
sil hidden [ossa] @DD_same_generic_param_name_in_outer_scope : $@convention(thin) <A> (
// CHECK: <τ_0_0> { var τ_0_0 } <A>
<A> { var A } <A>
// CHECK: ) -> ()
) -> () {
entry(%0 : @unowned $<B> { var B } <A>):
unreachable
}
// CHECK-LABEL: sil hidden [ossa] @EE_box_ownership : $@convention(thin) (@owned { var Int }, @guaranteed <τ_0_0> { let τ_0_0 } <Int>) -> ()
sil hidden [ossa] @EE_box_ownership : $@convention(thin) (@owned { var Int }, @guaranteed <T> { let T } <Int>) -> () {
entry(%0 : @owned ${ var Int }, %1 : @guaranteed $<T> { let T } <Int>):
destroy_value [dead_end] %0
unreachable
}
// CHECK-LABEL: sil hidden [ossa] @FF_address_of_box
sil hidden [ossa] @FF_address_of_box : $@convention(thin) (@in { var Int }, @in <T> { let T } <Int>) -> () {
// CHECK: %0 : $*{ var Int }, %1 : $*<τ_0_0> { let τ_0_0 } <Int>
entry(%0 : $*{ var Int }, %1 : $*<T> { let T } <Int>):
unreachable
}
sil @serialize_all : $@convention(thin) () -> () {
entry:
%0 = function_ref @AA_box_type_parsing : $@convention(thin) (<B>{ var B }<F>, <C: P>{ let C }<G>, <D: P>{ var D }<Q>, { let Int }, { var Int, let String }, {}, <X, Y, Z>{ var X, let Z }<Int, String, Optional<Double>>) -> ()
%1 = function_ref @BB_box_type_parsing_in_generic_function : $@convention(thin) <F, G: P> (<B>{ var B }<F>, <C: P>{ let C }<G>, <D: P>{ var D }<Q>, { let Int }, { var Int, let String }, {}, <X, Y, Z>{ var X, let Z }<Int, String, Optional<Double>>) -> ()
%2 = function_ref @CC_same_generic_param_name_in_multiple_box_signatures : $@convention(thin) (<A> { var A } <Int>, <A> { var A } <String>) -> ()
%3 = function_ref @DD_same_generic_param_name_in_outer_scope : $@convention(thin) <A> (<A> { var A } <A>) -> ()
%4 = function_ref @EE_box_ownership : $@convention(thin) (@owned { var Int }, @guaranteed <T> { let T } <Int>) -> ()
%5 = function_ref @FF_address_of_box : $@convention(thin) (@in { var Int }, @in <T> { let T } <Int>) -> ()
unreachable
}