| // RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -enable-sil-verify-all -closure-specialize %s | %FileCheck %s |
| |
| import Builtin |
| import Swift |
| |
| sil @simple_partial_apply_fun : $@convention(thin) (Builtin.Int1, Builtin.Int1) -> Builtin.Int1 |
| |
| // CHECK-LABEL: sil shared @_T027simple_partial_apply_caller0a1_b1_C4_funBi1_Tf1c_n : $@convention(thin) (Builtin.Int1) -> Builtin.Int1 { |
| // CHECK: bb0([[CAPTURED_ARG:%.*]] : $Builtin.Int1): |
| // CHECK: [[CLOSED_OVER_FUN:%.*]] = function_ref @simple_partial_apply_fun : |
| // CHECK: [[NEW_PAI:%.*]] = partial_apply [[CLOSED_OVER_FUN]] |
| // CHECK: strong_release [[NEW_PAI]] |
| sil @simple_partial_apply_caller : $@convention(thin) (@owned @callee_owned (Builtin.Int1) -> Builtin.Int1) -> Builtin.Int1 { |
| bb0(%0 : $@callee_owned (Builtin.Int1) -> Builtin.Int1): |
| br bb1 |
| |
| bb1: |
| %1 = integer_literal $Builtin.Int1, 0 |
| // We cannot do anything here for now but in the future I think we should try |
| // to handle this in closure specialization potentially. |
| %2 = apply %0(%1) : $@callee_owned (Builtin.Int1) -> Builtin.Int1 |
| strong_release %0 : $@callee_owned (Builtin.Int1) -> Builtin.Int1 |
| cond_br undef, bb1, bb2 |
| |
| bb2: |
| return %2 : $Builtin.Int1 |
| } |
| |
| sil @simple_partial_apply_caller_decl : $@convention(thin) (@owned @callee_owned (Builtin.Int1) -> Builtin.Int1) -> Builtin.Int1 |
| |
| sil @simple_multiple_partial_apply_caller : $@convention(thin) (@owned @callee_owned (Builtin.Int1) -> Builtin.Int1, @owned @callee_owned (Builtin.Int1) -> Builtin.Int1) -> Builtin.Int1 { |
| bb0(%0 : $@callee_owned (Builtin.Int1) -> Builtin.Int1, %1 : $@callee_owned (Builtin.Int1) -> Builtin.Int1): |
| br bb1 |
| |
| bb1: |
| %2 = integer_literal $Builtin.Int1, 0 |
| // We cannot do anything here for now but in the future I think we should try |
| // to handle this in closure specialization potentially. |
| apply %0(%2) : $@callee_owned (Builtin.Int1) -> Builtin.Int1 |
| strong_release %0 : $@callee_owned (Builtin.Int1) -> Builtin.Int1 |
| apply %1(%2) : $@callee_owned (Builtin.Int1) -> Builtin.Int1 |
| strong_release %1 : $@callee_owned (Builtin.Int1) -> Builtin.Int1 |
| cond_br undef, bb1, bb2 |
| |
| bb2: |
| return %2 : $Builtin.Int1 |
| } |
| |
| sil @simple_partial_apply_fun2 : $@convention(thin) (Builtin.Int1, Builtin.Int1) -> Builtin.Int1 |
| sil @simple_partial_apply_caller2 : $@convention(thin) (@owned @callee_owned (Builtin.Int1) -> Builtin.Int1) -> Builtin.Int1 { |
| bb0(%0 : $@callee_owned (Builtin.Int1) -> Builtin.Int1): |
| br bb1 |
| |
| bb1: |
| %1 = integer_literal $Builtin.Int1, 0 |
| // We cannot do anything here for now but in the future I think we should try |
| // to handle this in closure specialization potentially. |
| %2 = apply %0(%1) : $@callee_owned (Builtin.Int1) -> Builtin.Int1 |
| strong_release %0 : $@callee_owned (Builtin.Int1) -> Builtin.Int1 |
| cond_br undef, bb1, bb2 |
| |
| bb2: |
| return %2 : $Builtin.Int1 |
| } |
| |
| |
| sil @indirect_parameter_partial_apply_fun : $@convention(thin) (@in Builtin.Int1, Builtin.Int1, @in Builtin.Int1) -> @out Builtin.Int1 |
| |
| sil @indirect_parameter_partial_apply_caller1 : $@convention(thin) (@callee_owned (@in Builtin.Int1, Builtin.Int1, @in Builtin.Int1) -> @out Builtin.Int1) -> () { |
| bb0(%0 : $@callee_owned (@in Builtin.Int1, Builtin.Int1, @in Builtin.Int1) -> @out Builtin.Int1): |
| br bb1 |
| |
| bb1: |
| %1 = alloc_stack $Builtin.Int1 |
| %2 = integer_literal $Builtin.Int1, 0 |
| apply %0(%1, %1, %2, %1) : $@callee_owned (@in Builtin.Int1, Builtin.Int1, @in Builtin.Int1) -> @out Builtin.Int1 |
| dealloc_stack %1 : $*Builtin.Int1 |
| cond_br undef, bb1, bb2 |
| |
| bb2: |
| %9999 = tuple() |
| return %9999 : $() |
| } |
| |
| sil @indirect_parameter_partial_apply_caller2 : $@convention(thin) (@callee_owned (@in Builtin.Int1, Builtin.Int1) -> @out Builtin.Int1) -> () { |
| bb0(%0 : $@callee_owned (@in Builtin.Int1, Builtin.Int1) -> @out Builtin.Int1): |
| br bb1 |
| |
| bb1: |
| %1 = alloc_stack $Builtin.Int1 |
| %2 = integer_literal $Builtin.Int1, 0 |
| apply %0(%1, %1, %2) : $@callee_owned (@in Builtin.Int1, Builtin.Int1) -> @out Builtin.Int1 |
| dealloc_stack %1 : $*Builtin.Int1 |
| cond_br undef, bb1, bb2 |
| |
| bb2: |
| %9999 = tuple() |
| return %9999 : $() |
| } |
| |
| sil @indirect_parameter_partial_apply_caller3 : $@convention(thin) (@callee_owned (@in Builtin.Int1) -> @out Builtin.Int1) -> () { |
| bb0(%0 : $@callee_owned (@in Builtin.Int1) -> @out Builtin.Int1): |
| br bb1 |
| |
| bb1: |
| %1 = alloc_stack $Builtin.Int1 |
| apply %0(%1, %1) : $@callee_owned (@in Builtin.Int1) -> @out Builtin.Int1 |
| dealloc_stack %1 : $*Builtin.Int1 |
| cond_br undef, bb1, bb2 |
| |
| bb2: |
| %9999 = tuple() |
| return %9999 : $() |
| } |
| |
| sil @indirect_parameter_partial_apply_caller4 : $@convention(thin) (@callee_owned () -> @out Builtin.Int1) -> () { |
| bb0(%0 : $@callee_owned () -> @out Builtin.Int1): |
| br bb1 |
| |
| bb1: |
| %1 = alloc_stack $Builtin.Int1 |
| apply %0(%1) : $@callee_owned () -> @out Builtin.Int1 |
| dealloc_stack %1 : $*Builtin.Int1 |
| cond_br undef, bb1, bb2 |
| |
| bb2: |
| %9999 = tuple() |
| return %9999 : $() |
| } |
| |
| sil @indirect_parameter_partial_apply_caller5 : $@convention(thin) (@callee_owned () -> ()) -> () { |
| bb0(%0 : $@callee_owned () -> ()): |
| br bb1 |
| |
| bb1: |
| apply %0() : $@callee_owned () -> () |
| cond_br undef, bb1, bb2 |
| |
| bb2: |
| %9999 = tuple() |
| return %9999 : $() |
| } |
| |
| sil @indirect_parameter_partial_apply_caller6 : $@convention(thin) (@callee_owned () -> @out Builtin.Int1) -> @out Builtin.Int1 { |
| bb0(%1 : $*Builtin.Int1, %0 : $@callee_owned () -> @out Builtin.Int1): |
| br bb1 |
| |
| bb1: |
| apply %0(%1) : $@callee_owned () -> @out Builtin.Int1 |
| cond_br undef, bb1, bb2 |
| |
| bb2: |
| %9999 = tuple() |
| return %9999 : $() |
| } |
| |
| sil @indirect_parameter_partial_apply_caller7 : $@convention(thin) (@callee_owned () -> @out Builtin.Int1) -> @out (Builtin.Int1, Builtin.Int1) { |
| bb0(%1 : $*(Builtin.Int1, Builtin.Int1), %0 : $@callee_owned () -> @out Builtin.Int1): |
| br bb1 |
| |
| bb1: |
| %2 = alloc_stack $Builtin.Int1 |
| %3 = alloc_stack $Builtin.Int1 |
| apply %0(%2) : $@callee_owned () -> @out Builtin.Int1 |
| apply %0(%3) : $@callee_owned () -> @out Builtin.Int1 |
| %4 = load %2: $*Builtin.Int1 |
| %5 = load %3: $*Builtin.Int1 |
| %6 = tuple(%4 : $Builtin.Int1, %5: $Builtin.Int1) |
| store %6 to %1 : $*(Builtin.Int1, Builtin.Int1) |
| dealloc_stack %3: $*Builtin.Int1 |
| dealloc_stack %2: $*Builtin.Int1 |
| cond_br undef, bb1, bb2 |
| |
| bb2: |
| %9999 = tuple() |
| return %9999 : $() |
| } |
| |
| // CHECK-LABEL: sil @loop_driver : $@convention(thin) (Builtin.Int1, Builtin.Int1) -> () { |
| // CHECK: [[SPECIALIZED_FUN:%.*]] = function_ref @_T027simple_partial_apply_caller0a1_b1_C4_funBi1_Tf1c_n : $@convention(thin) (Builtin.Int1) -> Builtin.Int1 |
| // CHECK: apply [[SPECIALIZED_FUN]] |
| |
| // We can't call this one b/c it is just a declaration. |
| // CHECK: [[UNSPECIALIZED_FUN_DECL:%.*]] = function_ref @simple_partial_apply_caller_decl : $@convention(thin) (@owned @callee_owned (Builtin.Int1) -> Builtin.Int1) -> Builtin.Int1 |
| // CHECK: apply [[UNSPECIALIZED_FUN_DECL]] |
| |
| // We handle closures with indirect results. |
| // CHECK: [[CLOSUREFUN:%.*]] = function_ref @indirect_parameter_partial_apply_fun |
| // CHECK-NOT: partial_apply [[CLOSUREFUN]]() |
| // CHECK: [[INLINEDCLOSURE_CALLER1:%.*]] = function_ref @_T040indirect_parameter_partial_apply_caller10a1_b1_c1_D4_funTf1c_n |
| // CHECK-NOT: partial_apply [[CLOSUREFUN]]() |
| |
| // We don't handle captured indirect @in and @in_guaranteed parameters yet. |
| // CHECK: [[CLOSURE2:%.*]] = partial_apply [[CLOSUREFUN]](%{{.*}}) |
| // CHECK: [[CLOSURE3:%.*]] = partial_apply [[CLOSUREFUN]](%{{.*}}) |
| // CHECK: [[CLOSURE4:%.*]] = partial_apply [[CLOSUREFUN]](%{{.*}}) |
| |
| // CHECK: [[CALLER1:%.*]] = function_ref @indirect_parameter_partial_apply_caller1 |
| // CHECK: [[CALLER2:%.*]] = function_ref @indirect_parameter_partial_apply_caller2 |
| // CHECK: [[CALLER3:%.*]] = function_ref @indirect_parameter_partial_apply_caller3 |
| // CHECK: [[CALLER4:%.*]] = function_ref @indirect_parameter_partial_apply_caller4 |
| |
| // Closure with indirect result but no captured indirect parameter. |
| // CHECK-NOT: apply [[CALLER1]] |
| // apply [[INLINEDCLOSURE_CALLER1]]() |
| // CHECK-NOT: apply [[CALLER1]] |
| |
| // Closures with captured indirect parameters. |
| // apply [[CALLER2]]([[CLOSURE2]]) |
| // apply [[CALLER3]]([[CLOSURE3]]) |
| // apply [[CALLER4]]([[CLOSURE4]]) |
| |
| // CHECK: return |
| sil @loop_driver : $@convention(thin) (Builtin.Int1, Builtin.Int1) -> () { |
| bb0(%0 : $Builtin.Int1, %1 : $Builtin.Int1): |
| %2 = function_ref @simple_partial_apply_fun : $@convention(thin) (Builtin.Int1, Builtin.Int1) -> Builtin.Int1 |
| %3 = partial_apply %2(%0) : $@convention(thin) (Builtin.Int1, Builtin.Int1) -> Builtin.Int1 |
| %4 = function_ref @simple_partial_apply_caller : $@convention(thin) (@owned @callee_owned (Builtin.Int1) -> Builtin.Int1) -> Builtin.Int1 |
| %5 = apply %4(%3) : $@convention(thin) (@owned @callee_owned (Builtin.Int1) -> Builtin.Int1) -> Builtin.Int1 |
| |
| %6 = partial_apply %2(%0) : $@convention(thin) (Builtin.Int1, Builtin.Int1) -> Builtin.Int1 |
| %7 = function_ref @simple_partial_apply_caller_decl : $@convention(thin) (@owned @callee_owned (Builtin.Int1) -> Builtin.Int1) -> Builtin.Int1 |
| %8 = apply %7(%6) : $@convention(thin) (@owned @callee_owned (Builtin.Int1) -> Builtin.Int1) -> Builtin.Int1 |
| |
| %9 = alloc_stack $Builtin.Int1 |
| |
| %10 = function_ref @indirect_parameter_partial_apply_fun : $@convention(thin) (@in Builtin.Int1, Builtin.Int1, @in Builtin.Int1) -> @out Builtin.Int1 |
| %11 = partial_apply %10() : $@convention(thin) (@in Builtin.Int1, Builtin.Int1, @in Builtin.Int1) -> @out Builtin.Int1 |
| %12 = partial_apply %10(%9) : $@convention(thin) (@in Builtin.Int1, Builtin.Int1, @in Builtin.Int1) -> @out Builtin.Int1 |
| %13 = partial_apply %10(%1, %9) : $@convention(thin) (@in Builtin.Int1, Builtin.Int1, @in Builtin.Int1) -> @out Builtin.Int1 |
| %14 = partial_apply %10(%9, %1, %9) : $@convention(thin) (@in Builtin.Int1, Builtin.Int1, @in Builtin.Int1) -> @out Builtin.Int1 |
| |
| %16 = function_ref @indirect_parameter_partial_apply_caller1 : $@convention(thin) (@callee_owned (@in Builtin.Int1, Builtin.Int1, @in Builtin.Int1) -> @out Builtin.Int1) -> () |
| %17 = function_ref @indirect_parameter_partial_apply_caller2 : $@convention(thin) (@callee_owned (@in Builtin.Int1, Builtin.Int1) -> @out Builtin.Int1) -> () |
| %18 = function_ref @indirect_parameter_partial_apply_caller3 : $@convention(thin) (@callee_owned (@in Builtin.Int1) -> @out Builtin.Int1) -> () |
| %19 = function_ref @indirect_parameter_partial_apply_caller4 : $@convention(thin) (@callee_owned () -> @out Builtin.Int1) -> () |
| %20 = function_ref @indirect_parameter_partial_apply_caller5 : $@convention(thin) (@callee_owned () -> ()) -> () |
| |
| apply %16(%11) : $@convention(thin) (@callee_owned (@in Builtin.Int1, Builtin.Int1, @in Builtin.Int1) -> @out Builtin.Int1) -> () |
| apply %17(%12) : $@convention(thin) (@callee_owned (@in Builtin.Int1, Builtin.Int1) -> @out Builtin.Int1) -> () |
| apply %18(%13) : $@convention(thin) (@callee_owned (@in Builtin.Int1) -> @out Builtin.Int1) -> () |
| apply %19(%14) : $@convention(thin) (@callee_owned () -> @out Builtin.Int1) -> () |
| |
| // Make sure we handle when we already have an out parameter correctly. |
| %21 = alloc_stack $(Builtin.Int1, Builtin.Int1) |
| %22 = function_ref @indirect_parameter_partial_apply_caller6 : $@convention(thin) (@callee_owned () -> @out Builtin.Int1) -> @out Builtin.Int1 |
| %23 = function_ref @indirect_parameter_partial_apply_caller7 : $@convention(thin) (@callee_owned () -> @out Builtin.Int1) -> @out (Builtin.Int1, Builtin.Int1) |
| %24 = partial_apply %10(%9, %1, %9) : $@convention(thin) (@in Builtin.Int1, Builtin.Int1, @in Builtin.Int1) -> @out Builtin.Int1 |
| %25 = partial_apply %10(%9, %1, %9) : $@convention(thin) (@in Builtin.Int1, Builtin.Int1, @in Builtin.Int1) -> @out Builtin.Int1 |
| apply %22(%9, %24) : $@convention(thin) (@callee_owned () -> @out Builtin.Int1) -> @out Builtin.Int1 |
| apply %23(%21, %25) : $@convention(thin) (@callee_owned () -> @out Builtin.Int1) -> @out (Builtin.Int1, Builtin.Int1) |
| |
| dealloc_stack %21 : $*(Builtin.Int1, Builtin.Int1) |
| dealloc_stack %9 : $*Builtin.Int1 |
| |
| %26 = partial_apply %2(%0) : $@convention(thin) (Builtin.Int1, Builtin.Int1) -> Builtin.Int1 |
| %27 = partial_apply %2(%0) : $@convention(thin) (Builtin.Int1, Builtin.Int1) -> Builtin.Int1 |
| %28 = function_ref @simple_multiple_partial_apply_caller : $@convention(thin) (@owned @callee_owned (Builtin.Int1) -> Builtin.Int1, @owned @callee_owned (Builtin.Int1) -> Builtin.Int1) -> Builtin.Int1 |
| %29 = apply %28(%26, %27) : $@convention(thin) (@owned @callee_owned (Builtin.Int1) -> Builtin.Int1, @owned @callee_owned (Builtin.Int1) -> Builtin.Int1) -> Builtin.Int1 |
| |
| %30 = function_ref @simple_partial_apply_fun2 : $@convention(thin) (Builtin.Int1, Builtin.Int1) -> Builtin.Int1 |
| %31 = partial_apply %30(%1) : $@convention(thin) (Builtin.Int1, Builtin.Int1) -> Builtin.Int1 |
| %32 = function_ref @simple_partial_apply_caller2 : $@convention(thin) (@owned @callee_owned (Builtin.Int1) -> Builtin.Int1) -> Builtin.Int1 |
| %33 = apply %32(%31) : $@convention(thin) (@owned @callee_owned (Builtin.Int1) -> Builtin.Int1) -> Builtin.Int1 |
| |
| |
| %9999 = tuple() |
| return %9999 : $() |
| } |
| |