blob: 59183292bec8b51f9d22875746dd2ebec001f1b0 [file] [log] [blame]
// RUN: %target-sil-opt -enable-sil-verify-all -sroa %s | %FileCheck %s
sil_stage canonical
import Builtin
import Swift
///////////////////////////////
// Struct with Scalar Fields //
///////////////////////////////
struct S1 {
var x : Builtin.Int1
var y : Builtin.Int32
var z : Builtin.Int64
}
sil @use_int32 : $@convention(thin) (Builtin.Int32) -> ()
// CHECK-LABEL: sil @struct_with_scalar_fields : $@convention(thin) (S1) -> ()
// CHECK: bb0([[VAR_0:%[0-9]+]] : $S1):
// CHECK: [[VAR_1:%[0-9]+]] = alloc_stack $Builtin.Int1
// CHECK: [[VAR_2:%[0-9]+]] = alloc_stack $Builtin.Int32
// CHECK: [[VAR_3:%[0-9]+]] = alloc_stack $Builtin.Int64
// CHECK: [[VAR_4:%[0-9]+]] = struct_extract [[VAR_0]] : $S1, #S1.x
// CHECK: store [[VAR_4]] to [[VAR_1]] : $*Builtin.Int1
// CHECK: [[VAR_6:%[0-9]+]] = struct_extract [[VAR_0]] : $S1, #S1.y
// CHECK: store [[VAR_6]] to [[VAR_2]] : $*Builtin.Int32
// CHECK: [[VAR_8:%[0-9]+]] = struct_extract [[VAR_0]] : $S1, #S1.z
// CHECK: store [[VAR_8]] to [[VAR_3]] : $*Builtin.Int64
// CHECK: [[VAR_10:%[0-9]+]] = function_ref @use_int32 : $@convention(thin) (Builtin.Int32) -> ()
// CHECK: [[VAR_11:%[0-9]+]] = load [[VAR_2]] : $*Builtin.Int32
// CHECK: [[VAR_12:%[0-9]+]] = apply [[VAR_10]]([[VAR_11]]) : $@convention(thin) (Builtin.Int32) -> ()
// CHECK: [[VAR_13:%[0-9]+]] = load [[VAR_1]] : $*Builtin.Int1
// CHECK: [[VAR_14:%[0-9]+]] = load [[VAR_2]] : $*Builtin.Int32
// CHECK: [[VAR_15:%[0-9]+]] = load [[VAR_3]] : $*Builtin.Int64
// CHECK: [[VAR_16:%[0-9]+]] = struct $S1 ([[VAR_13]] : $Builtin.Int1, [[VAR_14]] : $Builtin.Int32, [[VAR_15]] : $Builtin.Int64)
// CHECK: dealloc_stack [[VAR_3]] : $*Builtin.Int64
// CHECK: dealloc_stack [[VAR_2]] : $*Builtin.Int32
// CHECK: dealloc_stack [[VAR_1]] : $*Builtin.Int1
// CHECK: [[VAR_20:%[0-9]+]] = tuple ()
// CHECK: return [[VAR_20]] : $()
sil @struct_with_scalar_fields : $@convention(thin) (S1) -> () {
bb0(%0 : $S1):
%1 = alloc_stack $S1
debug_value %1 : $*S1 // should not prevent the optimization
debug_value %1 : $*S1 // should not prevent the optimization
store %0 to %1 : $*S1
%2 = function_ref @use_int32 : $@convention(thin) (Builtin.Int32) -> ()
%3 = struct_element_addr %1 : $*S1, #S1.y
%4 = load %3 : $*Builtin.Int32
apply %2(%4) : $@convention(thin) (Builtin.Int32) -> ()
%5 = load %1 : $*S1
dealloc_stack %1 : $*S1
%6 = tuple ()
return %6 : $()
}
// CHECK-LABEL: sil @dont_sroa_without_benefit : $@convention(thin) (S1) -> S1
// CHECK: bb0
// CHECK-NEXT: alloc_stack $S1
// CHECK-NEXT: store %0 to %1 : $*S1
// CHECK-NEXT: load %1 : $*S1
// CHECK-NEXT: dealloc_stack %1 : $*S1
// CHECK-NEXT: return
sil @dont_sroa_without_benefit : $@convention(thin) (S1) -> S1 {
bb0(%0 : $S1):
%1 = alloc_stack $S1
store %0 to %1 : $*S1
%3 = load %1 : $*S1
dealloc_stack %1 : $*S1
return %3 : $S1
}
///////////////////////////////
// Struct With Struct Fields //
///////////////////////////////
sil @use_s1 : $@convention(thin) (S1) -> ()
struct S2 {
var alpha : Builtin.FPIEEE32
var beta : S1
}
// CHECK-LABEL: sil @struct_with_struct_fields : $@convention(thin) (S2, Builtin.Int64) -> ()
// CHECK: bb0([[VAR_0:%[0-9]+]] : $S2, [[VAR_1:%[0-9]+]] : $Builtin.Int64):
// CHECK: [[VAR_2:%[0-9]+]] = alloc_stack $Builtin.FPIEEE32
// CHECK: [[VAR_3:%[0-9]+]] = alloc_stack $Builtin.Int1
// CHECK: [[VAR_4:%[0-9]+]] = alloc_stack $Builtin.Int32
// CHECK: [[VAR_5:%[0-9]+]] = alloc_stack $Builtin.Int64
// CHECK: [[VAR_6:%[0-9]+]] = struct_extract [[VAR_0]] : $S2, #S2.alpha
// CHECK: store [[VAR_6]] to [[VAR_2]] : $*Builtin.FPIEEE32
// CHECK: [[VAR_8:%[0-9]+]] = struct_extract [[VAR_0]] : $S2, #S2.beta
// CHECK: [[VAR_9:%[0-9]+]] = struct_extract [[VAR_8]] : $S1, #S1.x
// CHECK: store [[VAR_9]] to [[VAR_3]] : $*Builtin.Int1
// CHECK: [[VAR_11:%[0-9]+]] = struct_extract [[VAR_8]] : $S1, #S1.y
// CHECK: store [[VAR_11]] to [[VAR_4]] : $*Builtin.Int32
// CHECK: [[VAR_13:%[0-9]+]] = struct_extract [[VAR_8]] : $S1, #S1.z
// CHECK: store [[VAR_13]] to [[VAR_5]] : $*Builtin.Int64
// CHECK: [[VAR_15:%[0-9]+]] = load [[VAR_3]] : $*Builtin.Int1
// CHECK: [[VAR_16:%[0-9]+]] = load [[VAR_4]] : $*Builtin.Int32
// CHECK: [[VAR_17:%[0-9]+]] = load [[VAR_5]] : $*Builtin.Int64
// CHECK: [[VAR_18:%[0-9]+]] = struct $S1 ([[VAR_15]] : $Builtin.Int1, [[VAR_16]] : $Builtin.Int32, [[VAR_17]] : $Builtin.Int64)
// CHECK: [[VAR_19:%[0-9]+]] = function_ref @use_s1 : $@convention(thin) (S1) -> ()
// CHECK: [[VAR_20:%[0-9]+]] = apply [[VAR_19]]([[VAR_18]]) : $@convention(thin) (S1) -> ()
// CHECK: [[VAR_21:%[0-9]+]] = function_ref @use_int32 : $@convention(thin) (Builtin.Int32) -> ()
// CHECK: [[VAR_22:%[0-9]+]] = load [[VAR_4]] : $*Builtin.Int32
// CHECK: [[VAR_23:%[0-9]+]] = apply [[VAR_21]]([[VAR_22]]) : $@convention(thin) (Builtin.Int32) -> ()
// CHECK: [[VAR_24:%[0-9]+]] = load [[VAR_2]] : $*Builtin.FPIEEE32
// CHECK: [[VAR_25:%[0-9]+]] = load [[VAR_3]] : $*Builtin.Int1
// CHECK: [[VAR_26:%[0-9]+]] = load [[VAR_4]] : $*Builtin.Int32
// CHECK: [[VAR_27:%[0-9]+]] = load [[VAR_5]] : $*Builtin.Int64
// CHECK: [[VAR_28:%[0-9]+]] = struct $S1 ([[VAR_25]] : $Builtin.Int1, [[VAR_26]] : $Builtin.Int32, [[VAR_27]] : $Builtin.Int64)
// CHECK: [[VAR_29:%[0-9]+]] = struct $S2 ([[VAR_24]] : $Builtin.FPIEEE32, [[VAR_28]] : $S1)
// CHECK: store [[VAR_1]] to [[VAR_5]] : $*Builtin.Int64
// CHECK: dealloc_stack [[VAR_5]] : $*Builtin.Int64
// CHECK: dealloc_stack [[VAR_4]] : $*Builtin.Int32
// CHECK: dealloc_stack [[VAR_3]] : $*Builtin.Int1
// CHECK: dealloc_stack [[VAR_2]] : $*Builtin.FPIEEE32
// CHECK: [[VAR_35:%[0-9]+]] = tuple ()
// CHECK: return [[VAR_35]] : $()
sil @struct_with_struct_fields : $@convention(thin) (S2, Builtin.Int64) -> () {
bb0(%0 : $S2, %1 : $Builtin.Int64):
%2 = alloc_stack $S2
store %0 to %2 : $*S2
%3 = struct_element_addr %2 : $*S2, #S2.beta
%4 = load %3 : $*S1
%5 = function_ref @use_s1 : $@convention(thin) (S1) -> ()
apply %5(%4) : $@convention(thin) (S1) -> ()
%6 = struct_element_addr %3 : $*S1, #S1.y
%7 = function_ref @use_int32 : $@convention(thin) (Builtin.Int32) -> ()
%8 = load %6 : $*Builtin.Int32
apply %7(%8) : $@convention(thin) (Builtin.Int32) -> ()
%9 = load %2 : $*S2
%10 = struct_element_addr %3 : $*S1, #S1.z
store %1 to %10 : $*Builtin.Int64
dealloc_stack %2 : $*S2
%11 = tuple()
return %11 : $()
}
//////////////////////////////
// Struct with Tuple Fields //
//////////////////////////////
sil @use_tup : $@convention(thin) ((Builtin.Int32, Builtin.Int64, Builtin.Int16)) -> ()
struct S3 {
var gamma : (Builtin.Int32, Builtin.Int64, Builtin.Int16)
var delta : Builtin.FPIEEE32
}
// CHECK-LABEL: sil @struct_with_tuple_fields : $@convention(thin) (S3, Builtin.Int64) -> ()
// CHECK: bb0([[VAR_0:%[0-9]+]] : $S3, [[VAR_1:%[0-9]+]] : $Builtin.Int64):
// CHECK: [[VAR_2:%[0-9]+]] = alloc_stack $Builtin.Int32
// CHECK: [[VAR_3:%[0-9]+]] = alloc_stack $Builtin.Int64
// CHECK: [[VAR_4:%[0-9]+]] = alloc_stack $Builtin.Int16
// CHECK: [[VAR_5:%[0-9]+]] = alloc_stack $Builtin.FPIEEE32
// CHECK: [[VAR_6:%[0-9]+]] = struct_extract [[VAR_0]] : $S3, #S3.gamma
// CHECK: [[VAR_7:%[0-9]+]] = tuple_extract [[VAR_6]] : $(Builtin.Int32, Builtin.Int64, Builtin.Int16), 0
// CHECK: store [[VAR_7]] to [[VAR_2]] : $*Builtin.Int32
// CHECK: [[VAR_9:%[0-9]+]] = tuple_extract [[VAR_6]] : $(Builtin.Int32, Builtin.Int64, Builtin.Int16), 1
// CHECK: store [[VAR_9]] to [[VAR_3]] : $*Builtin.Int64
// CHECK: [[VAR_11:%[0-9]+]] = tuple_extract [[VAR_6]] : $(Builtin.Int32, Builtin.Int64, Builtin.Int16), 2
// CHECK: store [[VAR_11]] to [[VAR_4]] : $*Builtin.Int16
// CHECK: [[VAR_13:%[0-9]+]] = struct_extract [[VAR_0]] : $S3, #S3.delta
// CHECK: store [[VAR_13]] to [[VAR_5]] : $*Builtin.FPIEEE32
// CHECK: [[VAR_15:%[0-9]+]] = function_ref @use_tup : $@convention(thin) ((Builtin.Int32, Builtin.Int64, Builtin.Int16)) -> ()
// CHECK: [[VAR_16:%[0-9]+]] = load [[VAR_2]] : $*Builtin.Int32
// CHECK: [[VAR_17:%[0-9]+]] = load [[VAR_3]] : $*Builtin.Int64
// CHECK: [[VAR_18:%[0-9]+]] = load [[VAR_4]] : $*Builtin.Int16
// CHECK: [[VAR_19:%[0-9]+]] = tuple ([[VAR_16]] : $Builtin.Int32, [[VAR_17]] : $Builtin.Int64, [[VAR_18]] : $Builtin.Int16)
// CHECK: [[VAR_20:%[0-9]+]] = apply [[VAR_15]]([[VAR_19]]) : $@convention(thin) ((Builtin.Int32, Builtin.Int64, Builtin.Int16)) -> ()
// CHECK: [[VAR_21:%[0-9]+]] = load [[VAR_2]] : $*Builtin.Int32
// CHECK: [[VAR_22:%[0-9]+]] = function_ref @use_int32 : $@convention(thin) (Builtin.Int32) -> ()
// CHECK: [[VAR_23:%[0-9]+]] = apply [[VAR_22]]([[VAR_21]]) : $@convention(thin) (Builtin.Int32) -> ()
// CHECK: [[VAR_24:%[0-9]+]] = load [[VAR_2]] : $*Builtin.Int32
// CHECK: [[VAR_25:%[0-9]+]] = load [[VAR_3]] : $*Builtin.Int64
// CHECK: [[VAR_26:%[0-9]+]] = load [[VAR_4]] : $*Builtin.Int16
// CHECK: [[VAR_27:%[0-9]+]] = tuple ([[VAR_24]] : $Builtin.Int32, [[VAR_25]] : $Builtin.Int64, [[VAR_26]] : $Builtin.Int16)
// CHECK: [[VAR_28:%[0-9]+]] = load [[VAR_5]] : $*Builtin.FPIEEE32
// CHECK: [[VAR_29:%[0-9]+]] = struct $S3 ([[VAR_27]] : $(Builtin.Int32, Builtin.Int64, Builtin.Int16), [[VAR_28]] : $Builtin.FPIEEE32)
// CHECK: store [[VAR_1]] to [[VAR_3]] : $*Builtin.Int64
// CHECK: dealloc_stack [[VAR_5]] : $*Builtin.FPIEEE32
// CHECK: dealloc_stack [[VAR_4]] : $*Builtin.Int16
// CHECK: dealloc_stack [[VAR_3]] : $*Builtin.Int64
// CHECK: dealloc_stack [[VAR_2]] : $*Builtin.Int32
// CHECK: [[VAR_35:%[0-9]+]] = tuple ()
// CHECK: return [[VAR_35]] : $()
sil @struct_with_tuple_fields : $@convention(thin) (S3, Builtin.Int64) -> () {
bb0(%0 : $S3, %1 : $Builtin.Int64):
%2 = alloc_stack $S3
store %0 to %2 : $*S3
%3 = function_ref @use_tup : $@convention(thin) ((Builtin.Int32, Builtin.Int64, Builtin.Int16)) -> ()
%4 = struct_element_addr %2 : $*S3, #S3.gamma
%5 = load %4 : $*(Builtin.Int32, Builtin.Int64, Builtin.Int16)
apply %3(%5) : $@convention(thin) ((Builtin.Int32, Builtin.Int64, Builtin.Int16)) -> ()
%6 = tuple_element_addr %4 : $*(Builtin.Int32, Builtin.Int64, Builtin.Int16), 0
%7 = load %6 : $*Builtin.Int32
%8 = function_ref @use_int32 : $@convention(thin) (Builtin.Int32) -> ()
apply %8(%7) : $@convention(thin) (Builtin.Int32) -> ()
%9 = load %2 : $*S3
%10 = tuple_element_addr %4 : $*(Builtin.Int32, Builtin.Int64, Builtin.Int16), 1
store %1 to %10 : $*Builtin.Int64
dealloc_stack %2 : $*S3
%11 = tuple ()
return %11 : $()
}
//////////////////////////////
// Tuple with Scalar Fields //
//////////////////////////////
// CHECK-LABEL: sil @tuple_with_scalar_fields : $@convention(thin) ((Builtin.Int1, Builtin.Int32, Builtin.Int64)) -> ()
// CHECK: bb0([[VAR_0:%[0-9]+]] : $(Builtin.Int1, Builtin.Int32, Builtin.Int64)):
// CHECK: [[VAR_1:%[0-9]+]] = alloc_stack $Builtin.Int1
// CHECK: [[VAR_2:%[0-9]+]] = alloc_stack $Builtin.Int32
// CHECK: [[VAR_3:%[0-9]+]] = alloc_stack $Builtin.Int64
// CHECK: [[VAR_4:%[0-9]+]] = tuple_extract [[VAR_0]] : $(Builtin.Int1, Builtin.Int32, Builtin.Int64), 0
// CHECK: store [[VAR_4]] to [[VAR_1]] : $*Builtin.Int1
// CHECK: [[VAR_6:%[0-9]+]] = tuple_extract [[VAR_0]] : $(Builtin.Int1, Builtin.Int32, Builtin.Int64), 1
// CHECK: store [[VAR_6]] to [[VAR_2]] : $*Builtin.Int32
// CHECK: [[VAR_8:%[0-9]+]] = tuple_extract [[VAR_0]] : $(Builtin.Int1, Builtin.Int32, Builtin.Int64), 2
// CHECK: store [[VAR_8]] to [[VAR_3]] : $*Builtin.Int64
// CHECK: [[VAR_10:%[0-9]+]] = function_ref @use_int32 : $@convention(thin) (Builtin.Int32) -> ()
// CHECK: [[VAR_11:%[0-9]+]] = load [[VAR_2]] : $*Builtin.Int32
// CHECK: [[VAR_12:%[0-9]+]] = apply [[VAR_10]]([[VAR_11]]) : $@convention(thin) (Builtin.Int32) -> ()
// CHECK: [[VAR_13:%[0-9]+]] = load [[VAR_1]] : $*Builtin.Int1
// CHECK: [[VAR_14:%[0-9]+]] = load [[VAR_2]] : $*Builtin.Int32
// CHECK: [[VAR_15:%[0-9]+]] = load [[VAR_3]] : $*Builtin.Int64
// CHECK: [[VAR_16:%[0-9]+]] = tuple ([[VAR_13]] : $Builtin.Int1, [[VAR_14]] : $Builtin.Int32, [[VAR_15]] : $Builtin.Int64)
// CHECK: dealloc_stack [[VAR_3]] : $*Builtin.Int64
// CHECK: dealloc_stack [[VAR_2]] : $*Builtin.Int32
// CHECK: dealloc_stack [[VAR_1]] : $*Builtin.Int1
// CHECK: [[VAR_20:%[0-9]+]] = tuple ()
// CHECK: return [[VAR_20]] : $()
sil @tuple_with_scalar_fields : $@convention(thin) ((Builtin.Int1, Builtin.Int32, Builtin.Int64)) -> () {
bb0(%0 : $(Builtin.Int1, Builtin.Int32, Builtin.Int64)):
%1 = alloc_stack $(Builtin.Int1, Builtin.Int32, Builtin.Int64)
store %0 to %1 : $*(Builtin.Int1, Builtin.Int32, Builtin.Int64)
%2 = function_ref @use_int32 : $@convention(thin) (Builtin.Int32) -> ()
%3 = tuple_element_addr %1 : $*(Builtin.Int1, Builtin.Int32, Builtin.Int64), 1
%4 = load %3 : $*Builtin.Int32
apply %2(%4) : $@convention(thin) (Builtin.Int32) -> ()
%5 = load %1 : $*(Builtin.Int1, Builtin.Int32, Builtin.Int64)
dealloc_stack %1 : $*(Builtin.Int1, Builtin.Int32, Builtin.Int64)
%6 = tuple()
return %6 : $()
}
//////////////////////////////
// Tuple With Struct Fields //
//////////////////////////////
struct S4 {
var aleph : Builtin.Int64
var bet : Builtin.Int32
}
sil @use_str4 : $@convention(thin) (S4) -> ()
// CHECK-LABEL: sil @tuple_with_struct_fields : $@convention(thin) ((S4, Builtin.Int16), Builtin.Int16) -> ()
// CHECK: bb0([[VAR_0:%[0-9]+]] : $(S4, Builtin.Int16), [[VAR_1:%[0-9]+]] : $Builtin.Int16):
// CHECK: [[VAR_2:%[0-9]+]] = alloc_stack $Builtin.Int64
// CHECK: [[VAR_3:%[0-9]+]] = alloc_stack $Builtin.Int32
// CHECK: [[VAR_4:%[0-9]+]] = alloc_stack $Builtin.Int16
// CHECK: [[VAR_5:%[0-9]+]] = tuple_extract [[VAR_0]] : $(S4, Builtin.Int16), 0
// CHECK: [[VAR_6:%[0-9]+]] = struct_extract [[VAR_5]] : $S4, #S4.aleph
// CHECK: store [[VAR_6]] to [[VAR_2]] : $*Builtin.Int64
// CHECK: [[VAR_8:%[0-9]+]] = struct_extract [[VAR_5]] : $S4, #S4.bet
// CHECK: store [[VAR_8]] to [[VAR_3]] : $*Builtin.Int32
// CHECK: [[VAR_10:%[0-9]+]] = tuple_extract [[VAR_0]] : $(S4, Builtin.Int16), 1
// CHECK: store [[VAR_10]] to [[VAR_4]] : $*Builtin.Int16
// CHECK: [[VAR_12:%[0-9]+]] = function_ref @use_str4 : $@convention(thin) (S4) -> ()
// CHECK: [[VAR_13:%[0-9]+]] = load [[VAR_2]] : $*Builtin.Int64
// CHECK: [[VAR_14:%[0-9]+]] = load [[VAR_3]] : $*Builtin.Int32
// CHECK: [[VAR_15:%[0-9]+]] = struct $S4 ([[VAR_13]] : $Builtin.Int64, [[VAR_14]] : $Builtin.Int32)
// CHECK: [[VAR_16:%[0-9]+]] = apply [[VAR_12]]([[VAR_15]]) : $@convention(thin) (S4) -> ()
// CHECK: [[VAR_17:%[0-9]+]] = load [[VAR_3]] : $*Builtin.Int32
// CHECK: [[VAR_18:%[0-9]+]] = function_ref @use_int32 : $@convention(thin) (Builtin.Int32) -> ()
// CHECK: [[VAR_19:%[0-9]+]] = apply [[VAR_18]]([[VAR_17]]) : $@convention(thin) (Builtin.Int32) -> ()
// CHECK: [[VAR_20:%[0-9]+]] = load [[VAR_2]] : $*Builtin.Int64
// CHECK: [[VAR_21:%[0-9]+]] = load [[VAR_3]] : $*Builtin.Int32
// CHECK: [[VAR_22:%[0-9]+]] = struct $S4 ([[VAR_20]] : $Builtin.Int64, [[VAR_21]] : $Builtin.Int32)
// CHECK: [[VAR_23:%[0-9]+]] = load [[VAR_4]] : $*Builtin.Int16
// CHECK: [[VAR_24:%[0-9]+]] = tuple ([[VAR_22]] : $S4, [[VAR_23]] : $Builtin.Int16)
// CHECK: store [[VAR_1]] to [[VAR_4]] : $*Builtin.Int16
// CHECK: dealloc_stack [[VAR_4]] : $*Builtin.Int16
// CHECK: dealloc_stack [[VAR_3]] : $*Builtin.Int32
// CHECK: dealloc_stack [[VAR_2]] : $*Builtin.Int64
// CHECK: [[VAR_29:%[0-9]+]] = tuple ()
// CHECK: return [[VAR_29]] : $()
sil @tuple_with_struct_fields : $@convention(thin) ((S4, Builtin.Int16), Builtin.Int16) -> () {
bb0(%0 : $(S4, Builtin.Int16), %1 : $Builtin.Int16):
%2 = alloc_stack $(S4, Builtin.Int16)
store %0 to %2 : $*(S4, Builtin.Int16)
%3 = function_ref @use_str4 : $@convention(thin) (S4) -> ()
%4 = tuple_element_addr %2 : $*(S4, Builtin.Int16), 0
%5 = load %4 : $*S4
apply %3(%5) : $@convention(thin) (S4) -> ()
%6 = struct_element_addr %4 : $*S4, #S4.bet
%7 = load %6 : $*Builtin.Int32
%8 = function_ref @use_int32 : $@convention(thin) (Builtin.Int32) -> ()
apply %8(%7) : $@convention(thin) (Builtin.Int32) -> ()
%9 = load %2 : $*(S4, Builtin.Int16)
%10 = tuple_element_addr %2 : $*(S4, Builtin.Int16), 1
store %1 to %10 : $*Builtin.Int16
dealloc_stack %2 : $*(S4, Builtin.Int16)
%11 = tuple()
return %11 : $()
}
/////////////////////////////////
// Tuple with Tuple Field Test //
/////////////////////////////////
sil @use_tup2 : $@convention(thin) ((Builtin.Int64, Builtin.Int32)) -> ()
sil @use_int16 : $@convention(thin) (Builtin.Int16) -> ()
// CHECK-LABEL: sil @tuple_with_tuple_fields : $@convention(thin) (((Builtin.Int64, Builtin.Int32), Builtin.Int16), Builtin.Int16) -> ()
// CHECK: bb0([[VAR_0:%[0-9]+]] : $((Builtin.Int64, Builtin.Int32), Builtin.Int16), [[VAR_1:%[0-9]+]] : $Builtin.Int16):
// CHECK: [[VAR_2:%[0-9]+]] = alloc_stack $Builtin.Int64
// CHECK: [[VAR_3:%[0-9]+]] = alloc_stack $Builtin.Int32
// CHECK: [[VAR_4:%[0-9]+]] = alloc_stack $Builtin.Int16
// CHECK: [[VAR_5:%[0-9]+]] = tuple_extract [[VAR_0]] : $((Builtin.Int64, Builtin.Int32), Builtin.Int16), 0
// CHECK: [[VAR_6:%[0-9]+]] = tuple_extract [[VAR_5]] : $(Builtin.Int64, Builtin.Int32), 0
// CHECK: store [[VAR_6]] to [[VAR_2]] : $*Builtin.Int64
// CHECK: [[VAR_8:%[0-9]+]] = tuple_extract [[VAR_5]] : $(Builtin.Int64, Builtin.Int32), 1
// CHECK: store [[VAR_8]] to [[VAR_3]] : $*Builtin.Int32
// CHECK: [[VAR_10:%[0-9]+]] = tuple_extract [[VAR_0]] : $((Builtin.Int64, Builtin.Int32), Builtin.Int16), 1
// CHECK: store [[VAR_10]] to [[VAR_4]] : $*Builtin.Int16
// CHECK: [[VAR_12:%[0-9]+]] = load [[VAR_2]] : $*Builtin.Int64
// CHECK: [[VAR_13:%[0-9]+]] = load [[VAR_3]] : $*Builtin.Int32
// CHECK: [[VAR_14:%[0-9]+]] = tuple ([[VAR_12]] : $Builtin.Int64, [[VAR_13]] : $Builtin.Int32)
// CHECK: [[VAR_15:%[0-9]+]] = function_ref @use_tup2 : $@convention(thin) ((Builtin.Int64, Builtin.Int32)) -> ()
// CHECK: [[VAR_16:%[0-9]+]] = apply [[VAR_15]]([[VAR_14]]) : $@convention(thin) ((Builtin.Int64, Builtin.Int32)) -> ()
// CHECK: [[VAR_17:%[0-9]+]] = function_ref @use_int32 : $@convention(thin) (Builtin.Int32) -> ()
// CHECK: [[VAR_18:%[0-9]+]] = load [[VAR_3]] : $*Builtin.Int32
// CHECK: [[VAR_19:%[0-9]+]] = apply [[VAR_17]]([[VAR_18]]) : $@convention(thin) (Builtin.Int32) -> ()
// CHECK: [[VAR_20:%[0-9]+]] = load [[VAR_2]] : $*Builtin.Int64
// CHECK: [[VAR_21:%[0-9]+]] = load [[VAR_3]] : $*Builtin.Int32
// CHECK: [[VAR_22:%[0-9]+]] = tuple ([[VAR_20]] : $Builtin.Int64, [[VAR_21]] : $Builtin.Int32)
// CHECK: [[VAR_23:%[0-9]+]] = load [[VAR_4]] : $*Builtin.Int16
// CHECK: [[VAR_24:%[0-9]+]] = tuple ([[VAR_22]] : $(Builtin.Int64, Builtin.Int32), [[VAR_23]] : $Builtin.Int16)
// CHECK: store [[VAR_1]] to [[VAR_4]] : $*Builtin.Int16
// CHECK: dealloc_stack [[VAR_4]] : $*Builtin.Int16
// CHECK: dealloc_stack [[VAR_3]] : $*Builtin.Int32
// CHECK: dealloc_stack [[VAR_2]] : $*Builtin.Int64
// CHECK: [[VAR_29:%[0-9]+]] = tuple ()
// CHECK: return [[VAR_29]] : $()
sil @tuple_with_tuple_fields : $@convention(thin) (((Builtin.Int64, Builtin.Int32), Builtin.Int16), Builtin.Int16) -> () {
bb0(%0 : $((Builtin.Int64, Builtin.Int32), Builtin.Int16), %1 : $Builtin.Int16):
%2 = alloc_stack $((Builtin.Int64, Builtin.Int32), Builtin.Int16)
store %0 to %2 : $*((Builtin.Int64, Builtin.Int32), Builtin.Int16)
%3 = tuple_element_addr %2 : $*((Builtin.Int64, Builtin.Int32), Builtin.Int16), 0
%4 = load %3 : $*(Builtin.Int64, Builtin.Int32)
%5 = function_ref @use_tup2 : $@convention(thin) ((Builtin.Int64, Builtin.Int32)) -> ()
apply %5(%4) : $@convention(thin) ((Builtin.Int64, Builtin.Int32)) -> ()
%6 = tuple_element_addr %3 : $*(Builtin.Int64, Builtin.Int32), 1
%7 = function_ref @use_int32 : $@convention(thin) (Builtin.Int32) -> ()
%8 = load %6 : $*Builtin.Int32
apply %7(%8) : $@convention(thin) (Builtin.Int32) -> ()
%9 = load %2 : $*((Builtin.Int64, Builtin.Int32), Builtin.Int16)
%10 = tuple_element_addr %2 : $*((Builtin.Int64, Builtin.Int32), Builtin.Int16), 1
store %1 to %10 : $*Builtin.Int16
dealloc_stack %2 : $*((Builtin.Int64, Builtin.Int32), Builtin.Int16)
%11 = tuple()
return %11 : $()
}
/////////////////////////
// Capture Struct Test //
/////////////////////////
struct CapturedS {
var x : Builtin.Int32
}
sil @use_capturedstruct : $@convention(thin) (@inout CapturedS) -> ()
// CHECK-LABEL: sil @captured_struct : $@convention(thin) (CapturedS) -> ()
// CHECK: bb0([[VAR_0:%[0-9]+]] : $CapturedS):
// CHECK: [[VAR_1:%[0-9]+]] = alloc_stack $CapturedS
// CHECK: store [[VAR_0]] to [[VAR_1]] : $*CapturedS
// CHECK: [[VAR_3:%[0-9]+]] = struct_element_addr [[VAR_1]] : $*CapturedS, #CapturedS.x
// CHECK: [[VAR_4:%[0-9]+]] = load [[VAR_3]] : $*Builtin.Int32
// CHECK: [[VAR_5:%[0-9]+]] = function_ref @use_capturedstruct : $@convention(thin) (@inout CapturedS) -> ()
// CHECK: [[VAR_6:%[0-9]+]] = apply [[VAR_5]]([[VAR_1]]) : $@convention(thin) (@inout CapturedS) -> ()
// CHECK: [[VAR_7:%[0-9]+]] = load [[VAR_3]] : $*Builtin.Int32
// CHECK: dealloc_stack [[VAR_1]] : $*CapturedS
// CHECK: [[VAR_9:%[0-9]+]] = tuple ()
// CHECK: return [[VAR_9]] : $()
sil @captured_struct : $@convention(thin) (CapturedS) -> () {
bb0(%0 : $CapturedS):
%1 = alloc_stack $CapturedS
store %0 to %1 : $*CapturedS
%3 = struct_element_addr %1 : $*CapturedS, #CapturedS.x
%4 = load %3 : $*Builtin.Int32
%5 = function_ref @use_capturedstruct : $@convention(thin) (@inout CapturedS) -> ()
%6 = apply %5(%1) : $@convention(thin) (@inout CapturedS) -> ()
%7 = load %3 : $*Builtin.Int32
dealloc_stack %1 : $*CapturedS
%9 = tuple ()
return %9 : $()
}
/////////////////////////
// Captured Tuple Test //
/////////////////////////
sil @use_capturedtuple : $@convention(thin) (@inout (Builtin.Int32, Builtin.Int64)) -> ()
// CHECK-LABEL: sil @captured_tuple : $@convention(thin) ((Builtin.Int32, Builtin.Int64)) -> ()
// CHECK: bb0([[VAR_0:%[0-9]+]] : $(Builtin.Int32, Builtin.Int64)):
// CHECK: [[VAR_1:%[0-9]+]] = alloc_stack $(Builtin.Int32, Builtin.Int64)
// CHECK: store [[VAR_0]] to [[VAR_1]] : $*(Builtin.Int32, Builtin.Int64)
// CHECK: [[VAR_3:%[0-9]+]] = tuple_element_addr [[VAR_1]] : $*(Builtin.Int32, Builtin.Int64), 0
// CHECK: [[VAR_4:%[0-9]+]] = load [[VAR_3]] : $*Builtin.Int32
// CHECK: [[VAR_5:%[0-9]+]] = function_ref @use_capturedtuple : $@convention(thin) (@inout (Builtin.Int32, Builtin.Int64)) -> ()
// CHECK: [[VAR_6:%[0-9]+]] = apply [[VAR_5]]([[VAR_1]]) : $@convention(thin) (@inout (Builtin.Int32, Builtin.Int64)) -> ()
// CHECK: [[VAR_7:%[0-9]+]] = load [[VAR_3]] : $*Builtin.Int32
// CHECK: dealloc_stack [[VAR_1]] : $*(Builtin.Int32, Builtin.Int64)
// CHECK: [[VAR_9:%[0-9]+]] = tuple ()
// CHECK: return [[VAR_9]] : $()
sil @captured_tuple : $@convention(thin) ((Builtin.Int32, Builtin.Int64)) -> () {
bb0(%0 : $(Builtin.Int32, Builtin.Int64)):
%1 = alloc_stack $(Builtin.Int32, Builtin.Int64)
store %0 to %1 : $*(Builtin.Int32, Builtin.Int64)
%3 = tuple_element_addr %1 : $*(Builtin.Int32, Builtin.Int64), 0
%4 = load %3 : $*Builtin.Int32
%5 = function_ref @use_capturedtuple : $@convention(thin) (@inout (Builtin.Int32, Builtin.Int64)) -> ()
%6 = apply %5(%1) : $@convention(thin) (@inout (Builtin.Int32, Builtin.Int64)) -> ()
%7 = load %3 : $*Builtin.Int32
dealloc_stack %1 : $*(Builtin.Int32, Builtin.Int64)
%9 = tuple ()
return %9 : $()
}