blob: 22f57087dd49e0b755d4fca9fa8ff6b64cc36b1c [file] [log] [blame]
// RUN: %target-sil-opt -O -enable-sil-opaque-values -emit-sorted-sil %s | %FileCheck %s
import Builtin
// CHECK-LABEL: sil_stage canonical
sil_stage canonical
public typealias Int = Builtin.Int64
// CHECK: sil shared [noinline] @$s20f010_genericIdentityBi64__Tg5 : $@convention(thin) (Builtin.Int64) -> Builtin.Int64 {
// CHECK: bb0(%0 : $Builtin.Int64):
// CHECK: return %0 : $Builtin.Int64
// CHECK: } // end sil function '$s20f010_genericIdentityBi64__Tg5'
sil hidden [noinline] @f010_genericIdentity : $@convention(thin) <T> (@in T) -> @out T {
bb0(%0 : $T):
return %0 : $T
}
sil @f015_callGeneric : $@convention(thin) (Builtin.Int64) -> Builtin.Int64 {
bb0(%0 : $Builtin.Int64):
%2 = function_ref @f010_genericIdentity : $@convention(thin) _0_0> (@in τ_0_0) -> @out τ_0_0
%3 = apply %2<Builtin.Int64>(%0) : $@convention(thin) _0_0> (@in τ_0_0) -> @out τ_0_0
return %3 : $Builtin.Int64
}
// Test returning an opaque tuple of tuples.
// FIXME: Early copy optimization should eliminate one copy_value+destroy pair,
// and forward %0 into all tuple positions.
// ---
// CHECK-LABEL: sil hidden [noinline] @f020_multiResult : $@convention(thin) <T> (@in T) -> (@out T, @out T, @out T) {
// CHECK: bb0(%0 : $T):
// CHECK: %1 = copy_value %0 : $T
// CHECK: %2 = copy_value %0 : $T
// CHECK: %3 = copy_value %0 : $T
// CHECK: destroy_value %0 : $T
// CHECK: %5 = tuple (%1 : $T, %2 : $T, %3 : $T)
// CHECK: return %5 : $(T, T, T)
// CHECK-LABEL: } // end sil function 'f020_multiResult'
sil hidden [noinline] @f020_multiResult : $@convention(thin) <T> (@in T) -> (@out T, @out T, @out T) {
bb0(%0 : $T):
%2 = copy_value %0 : $T
%3 = copy_value %0 : $T
%4 = copy_value %0 : $T
destroy_value %0 : $T
%6 = tuple (%2 : $T, %3 : $T, %4 : $T)
return %6 : $(T, T, T)
}
// Test returning an opaque tuple of tuples as a concrete tuple.
// The multiResult call is specialized, but the SIL result convention does not change.
// ---
// CHECK-LABEL: sil @f030_callMultiResult : $@convention(thin) (Builtin.Int64) -> (Builtin.Int64, Builtin.Int64, Builtin.Int64) {
// CHECK: bb0(%0 : $Builtin.Int64):
// CHECK: %1 = function_ref @$s16f020_multiResultBi64__Tg5 : $@convention(thin) (Builtin.Int64) -> (Builtin.Int64, @out Builtin.Int64, @out Builtin.Int64)
// CHECK: %2 = apply %1(%0) : $@convention(thin) (Builtin.Int64) -> (Builtin.Int64, @out Builtin.Int64, @out Builtin.Int64)
// CHECK: return %2 : $(Builtin.Int64, Builtin.Int64, Builtin.Int64)
// CHECK-LABEL: } // end sil function 'f030_callMultiResult'
sil @f030_callMultiResult : $@convention(thin) (Int) -> (Int, Int, Int) {
bb0(%0 : $Int):
%1 = function_ref @f020_multiResult : $@convention(thin) _0_0> (@in τ_0_0) -> (@out τ_0_0, @out τ_0_0, @out τ_0_0)
%2 = apply %1<Int>(%0) : $@convention(thin) _0_0> (@in τ_0_0) -> (@out τ_0_0, @out τ_0_0, @out τ_0_0)
%3 = tuple_extract %2 : $(Int, Int, Int), 0
%4 = tuple_extract %2 : $(Int, Int, Int), 1
%5 = tuple_extract %2 : $(Int, Int, Int), 2
%6 = tuple (%3 : $Int, %4 : $Int, %5 : $Int)
return %6 : $(Int, Int, Int)
}