| // RUN: %target-swift-frontend %s -emit-silgen | FileCheck %s |
| |
| // rdar://14443287 |
| sil_stage raw |
| |
| import Builtin |
| import Swift |
| |
| // CHECK-LABEL: sil @_TF4test3fooFT1fGSqFT_T___T_ : $@convention(thin) (@owned Optional<() -> ()>) -> () |
| sil @_TF4test3fooFT1fGSqFT_T___T_ : $@convention(thin) (@owned Optional<() -> ()>) -> () { |
| bb0(%0 : $Optional<() -> ()>): |
| %1 = alloc_box $Optional<() -> ()> // var f // users: %2, %6, %32 |
| %1a = project_box %1 : $@box Optional<() -> ()> |
| store %0 to %1a : $*Optional<() -> ()> // id: %2 |
| %3 = alloc_stack $Optional<()> // users: %22, %28, %30, %31 |
| %4 = alloc_stack $() // users: %12, %22, %25 |
| %5 = alloc_stack $Optional<() -> ()> // users: %6, %8, %10, %11, %16, %24 |
| copy_addr %1a to [initialization] %5 : $*Optional<() -> ()> // id: %6 |
| %7 = function_ref @_TFs22_doesOptionalHaveValueU__FT1vRGSqQ___Bi1_ : $@convention(thin) <τ_0_0> (@inout Optional<τ_0_0>) -> Builtin.Int1 // user: %8 |
| %8 = apply %7<() -> ()>(%5) : $@convention(thin) <τ_0_0> (@inout Optional<τ_0_0>) -> Builtin.Int1 // user: %9 |
| br bb2 // id: %13 |
| |
| bb2: // Preds: bb0 |
| %14 = function_ref @_TFs17_getOptionalValueU__FT1vGSqQ___Q_ : $@convention(thin) <τ_0_0> (@in Optional<τ_0_0>) -> @out τ_0_0 // user: %16 |
| %15 = alloc_stack $@callee_owned (@in ()) -> @out () // users: %16, %17, %23 |
| // CHECK: apply %{{[0-9]+}}<() -> ()>(%{{[0-9]+}}, %{{[0-9]+}}) : $@convention(thin) <τ_0_0> (@in Optional<τ_0_0>) -> @out τ_0_0 |
| %16 = apply %14<() -> ()>(%15, %5) : $@convention(thin) <τ_0_0> (@in Optional<τ_0_0>) -> @out τ_0_0 |
| %17 = load %15 : $*@callee_owned (@in ()) -> @out () // user: %19 |
| %18 = function_ref @_TTRXFo_iT__iT__XFo__dT__ : $@convention(thin) (@owned @callee_owned (@in ()) -> @out ()) -> () // user: %19 |
| %19 = partial_apply %18(%17) : $@convention(thin) (@owned @callee_owned (@in ()) -> @out ()) -> () // user: %20 |
| %20 = apply %19() : $@callee_owned () -> () |
| %21 = function_ref @_TFs24_injectValueIntoOptionalU__FT1vQ__GSqQ__ : $@convention(thin) <τ_0_0> (@in τ_0_0) -> @out Optional<τ_0_0> // user: %22 |
| // CHECK: apply %{{[0-9]+}}<()>(%{{[0-9]+}}, %{{[0-9]+}}) : $@convention(thin) <τ_0_0> (@in τ_0_0) -> @out Optional<τ_0_0> |
| %22 = apply %21<()>(%3, %4) : $@convention(thin) <τ_0_0> (@in τ_0_0) -> @out Optional<τ_0_0> |
| dealloc_stack %15 : $*@callee_owned (@in ()) -> @out () // id: %23 |
| dealloc_stack %5 : $*Optional<() -> ()> // id: %24 |
| dealloc_stack %4 : $*() // id: %25 |
| br bb4 // id: %26 |
| |
| bb4: // Preds: bb2 bb3 |
| %30 = load %3 : $*Optional<()> |
| dealloc_stack %3 : $*Optional<()> // id: %31 |
| strong_release %1 : $@box Optional<() -> ()> |
| %33 = tuple () // user: %34 |
| return %33 : $() // id: %34 |
| } |
| |
| sil [transparent] @_TFs22_doesOptionalHaveValueU__FT1vRGSqQ___Bi1_ : $@convention(thin) <τ_0_0> (@inout Optional<τ_0_0>) -> Builtin.Int1 |
| sil [transparent] @_TFs17_getOptionalValueU__FT1vGSqQ___Q_ : $@convention(thin) <τ_0_0> (@in Optional<τ_0_0>) -> @out τ_0_0 |
| sil [transparent] @_TTRXFo_iT__iT__XFo__dT__ : $@convention(thin) (@owned @callee_owned (@in ()) -> @out ()) -> () |
| sil [transparent] @_TFs24_injectValueIntoOptionalU__FT1vQ__GSqQ__ : $@convention(thin) <τ_0_0> (@in τ_0_0) -> @out Optional<τ_0_0> |