| // RUN: %target-sil-opt %s -basic-instruction-property-dump -o /dev/null | %FileCheck %s |
| |
| // REQUIRES: asserts |
| |
| import Builtin |
| |
| class X { |
| @sil_stored var a: Builtin.Int32 |
| @sil_stored var x: X |
| |
| init() |
| func foo() |
| } |
| |
| class Y : X {} |
| |
| sil_vtable X {} |
| sil_vtable Y {} |
| |
| sil [readnone] @full_apply_site_effects_callee_1 : $@convention(thin) (@owned X) -> () |
| sil [readnone] @full_apply_site_effects_callee_2 : $@convention(thin) (@owned X, @owned X, @owned X) -> () |
| |
| // CHECK-LABEL: @full_apply_site_effects |
| // CHECK: Inst #: 9 |
| // CHECK: apply |
| // CHECK: Mem Behavior: None |
| // CHECK: Release Behavior: MayRelease |
| // CHECK: Inst #: 10 |
| // CHECK: apply |
| // CHECK: Mem Behavior: None |
| // CHECK: Release Behavior: MayRelease |
| // CHECK: Inst #: 11 |
| // CHECK: apply |
| // CHECK: Mem Behavior: None |
| // CHECK: Release Behavior: MayRelease |
| // CHECK: Inst #: 12 |
| // CHECK: apply |
| // CHECK: Mem Behavior: None |
| // CHECK: Release Behavior: MayRelease |
| // CHECK: Inst #: 13 |
| // CHECK: apply |
| // CHECK: Mem Behavior: None |
| // CHECK: Release Behavior: MayRelease |
| // CHECK: Inst #: 14 |
| // CHECK: apply |
| // CHECK: Mem Behavior: None |
| // CHECK: Release Behavior: MayRelease |
| // CHECK: Inst #: 15 |
| // CHECK: apply |
| // CHECK: Mem Behavior: MayHaveSideEffects |
| // CHECK: Release Behavior: MayRelease |
| // CHECK: Inst #: 16 |
| // CHECK: Inst #: 17 |
| // CHECK: apply |
| // CHECK: Mem Behavior: None |
| // CHECK: Release Behavior: MayRelease |
| sil @full_apply_site_effects : $@convention(thin) (@owned X) -> () { |
| bb0(%0 : $X): |
| %1 = function_ref @full_apply_site_effects_callee_1 : $@convention(thin) (@owned X) -> () |
| %2 = partial_apply %1(%0) : $@convention(thin) (@owned X) -> () |
| %3 = thin_to_thick_function %1 : $@convention(thin) (@owned X) -> () to $@callee_owned @convention(thick) (@owned X) -> () |
| %4 = function_ref @full_apply_site_effects_callee_2 : $@convention(thin) (@owned X, @owned X, @owned X) -> () |
| %5 = partial_apply %4(%0) : $@convention(thin) (@owned X, @owned X, @owned X) -> () |
| %6 = partial_apply %5(%0) : $@callee_owned @convention(thick) (@owned X, @owned X) -> () |
| %7 = partial_apply %6(%0) : $@callee_owned @convention(thick) (@owned X) -> () |
| %8 = class_method %0 : $X, #X.foo!1 : (X) -> () -> (), $@convention(method) (@guaranteed X) -> () |
| %9 = convert_function %6 : $@callee_owned @convention(thick) (@owned X) -> () to $@callee_owned @convention(thick) (@owned Y) -> () |
| |
| apply %1(%0) : $@convention(thin) (@owned X) -> () |
| apply %2() : $@callee_owned @convention(thick) () -> () |
| apply %3(%0) : $@callee_owned @convention(thick) (@owned X) -> () |
| |
| apply %5(%0, %0) : $@callee_owned @convention(thick) (@owned X, @owned X) -> () |
| apply %6(%0) : $@callee_owned @convention(thick) (@owned X) -> () |
| apply %7() : $@callee_owned @convention(thick) () -> () |
| |
| // Make sure we properly handle full apply sites for which we can not |
| // trivially find an absolute referenced function. |
| apply %8(%0) : $@convention(method) (@guaranteed X) -> () |
| |
| %10 = unchecked_ref_cast %0 : $X to $Y |
| apply %9(%10) : $@callee_owned @convention(thick) (@owned Y) -> () |
| return undef : $() |
| } |