blob: ced80c7d4edcd66b065bb01359fd8011e3fbe206 [file] [log] [blame]
// RUN: %swift -gnone -O -disable-legacy-type-info -target x86_64-apple-macosx10.9 -emit-assembly %s -o - | %FileCheck %s
// REQUIRES: CODEGENERATOR=X86
// rdar://17999904
// No i386 test right now because we don't actually have a formal pattern there.
import Builtin
class C {}
sil_vtable C {}
sil [ossa] @_TFC21autorelease_optimized1Cd : $@convention(method) (@owned C) -> @owned Builtin.NativeObject {
bb0(%0 : @owned $C):
%1 = unchecked_ref_cast %0 : $C to $Builtin.NativeObject // user: %2
return %1 : $Builtin.NativeObject // id: %2
}
sil public_external @foo : $@convention(thin) (@owned C) -> @autoreleased C
sil public_external @bar : $@convention(thin) (@owned C) -> ()
sil [ossa] @baz : $@convention(thin) (@owned C) -> () {
bb0(%0 : @owned $C):
%1 = function_ref @foo : $@convention(thin) (@owned C) -> @autoreleased C
%2 = apply %1(%0) : $@convention(thin) (@owned C) -> @autoreleased C
// This call is just so that we won't tail-call
// objc_retainAutoreleasedReturnValue, which complicates the test.
%3 = function_ref @bar : $@convention(thin) (@owned C) -> ()
apply %3(%2) : $@convention(thin) (@owned C) -> ()
%5 = tuple ()
return %5 : $()
}
// CHECK: callq _foo
// CHECK-NEXT: movq %rax, %rdi
// CHECK-NEXT: callq _objc_retainAutoreleasedReturnValue