// RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -enable-sil-verify-all %s -cse | %FileCheck %s
// REQUIRES: objc_interop

import Builtin
import Swift
import Foundation

@objc(XX) protocol XX {
}

// CHECK-LABEL: sil @cse_objc_protocol
// CHECK: objc_protocol #XX : $Protocol
// CHECK-NOT: objc_protocol
// CHECK: tuple (%0 : $Protocol, %0 : $Protocol)
// CHECK: return
sil @cse_objc_protocol : $@convention(thin) () -> @owned (Protocol, Protocol) {
bb0:
  %0 = objc_protocol #XX : $Protocol
  %1 = objc_protocol #XX : $Protocol
  %2 = tuple (%0: $Protocol, %1: $Protocol)
  return %2 : $(Protocol, Protocol)
}

@objc protocol Walkable {
   func walk()
}

 class Bar : NSObject, Walkable {
   override init()
   func walk()
   deinit
}

func trytowalk(f: Walkable)

// test.Bar.init (test.Bar.Type)() -> test.Bar
sil hidden @_TFC4test3BarcfMS0_FT_S0_ : $@convention(method) (@owned Bar) -> @owned Bar {
bb0(%0 : $Bar):
  %1 = alloc_stack $Bar, let, name "sf"              // users: %2, %6, %9, %10
  store %0 to %1 : $*Bar                        // id: %2
  %3 = upcast %0 : $Bar to $NSObject              // user: %7
  %4 = super_method [volatile] %0 : $Bar, #NSObject.init!initializer.1.foreign : (NSObject.Type) -> () -> NSObject, $@convention(objc_method) (@owned NSObject) -> @owned NSObject // user: %7
  %7 = apply %4(%3) : $@convention(objc_method) (@owned NSObject) -> @owned NSObject // user: %8
  %8 = unchecked_ref_cast %7 : $NSObject to $Bar  // users: %9, %11
  store %8 to %1 : $*Bar                        // id: %9
  dealloc_stack %1 : $*Bar       // id: %10
  return %8 : $Bar                                // id: %11
}

// test.Bar.__allocating_init (test.Bar.Type)() -> test.Bar
sil hidden @_TFC4test3BarCfMS0_FT_S0_ : $@convention(thin) (@thick Bar.Type) -> @owned Bar {
bb0(%0 : $@thick Bar.Type):
  %1 = alloc_ref [objc] $Bar                      // user: %3
  // function_ref test.Bar.init (test.Bar.Type)() -> test.Bar
  %2 = function_ref @_TFC4test3BarcfMS0_FT_S0_ : $@convention(method) (@owned Bar) -> @owned Bar // user: %3
  %3 = apply %2(%1) : $@convention(method) (@owned Bar) -> @owned Bar // user: %4
  return %3 : $Bar                                // id: %4
}

// @objc test.Bar.init (test.Bar.Type)() -> test.Bar
sil hidden @_TToFC4test3BarcfMS0_FT_S0_ : $@convention(objc_method) (@owned Bar) -> @owned Bar {
bb0(%0 : $Bar):
  // function_ref test.Bar.init (test.Bar.Type)() -> test.Bar
  %1 = function_ref @_TFC4test3BarcfMS0_FT_S0_ : $@convention(method) (@owned Bar) -> @owned Bar // user: %2
  %2 = apply %1(%0) : $@convention(method) (@owned Bar) -> @owned Bar // user: %3
  return %2 : $Bar                                // id: %3
}

// test.Bar.walk (test.Bar)() -> ()
sil hidden @_TFC4test3Bar4walkfS0_FT_T_ : $@convention(method) (@guaranteed Bar) -> () {
bb0(%0 : $Bar):
  debug_value %0 : $Bar, let, name "self" // id: %1
  %2 = tuple ()                                   // user: %3
  return %2 : $()                                 // id: %3
}

// @objc test.Bar.walk (test.Bar)() -> ()
sil hidden @_TToFC4test3Bar4walkfS0_FT_T_ : $@convention(objc_method) (Bar) -> () {
bb0(%0 : $Bar):
  strong_retain %0 : $Bar                         // id: %1
  // function_ref test.Bar.walk (test.Bar)() -> ()
  %2 = function_ref @_TFC4test3Bar4walkfS0_FT_T_ : $@convention(method) (@guaranteed Bar) -> () // user: %3
  %3 = apply %2(%0) : $@convention(method) (@guaranteed Bar) -> () // user: %5
  strong_release %0 : $Bar                        // id: %4
  return %3 : $()                                 // id: %5
}

// test.Bar.__deallocating_deinit
sil hidden @_TFC4test3BarD : $@convention(method) (@owned Bar) -> () {
bb0(%0 : $Bar):
  debug_value %0 : $Bar, let, name "self" // id: %1
  %2 = super_method %0 : $Bar, #NSObject.deinit!deallocator.foreign : (NSObject) -> () -> (), $@convention(objc_method) (NSObject) -> ()  // user: %4
  %3 = upcast %0 : $Bar to $NSObject              // user: %4
  %4 = apply %2(%3) : $@convention(objc_method) (NSObject) -> ()
  %5 = tuple ()                                   // user: %6
  return %5 : $()                                 // id: %6
}

// CHECK-LABEL: _TF4test9trytowalkFPS_8Walkable_T_
// CHECK:           bb0(%0 : $Walkable):
// CHECK-NEXT:      open_existential_ref
// CHECK-NEXT:      witness_method
// CHECK-NEXT:      apply
// CHECK-NEXT:      witness_method
// CHECK-NEXT:      apply
// CHECK-NEXT:      strong_release
// CHECK-NEXT:      tuple
// CHECK-NEXT:      return
// test.trytowalk (test.Walkable) -> ()
sil hidden @_TF4test9trytowalkFPS_8Walkable_T_ : $@convention(thin) (@owned Walkable) -> () {
bb0(%0 : $Walkable):
  %2 = open_existential_ref %0 : $Walkable to $@opened("7813D5BE-4C48-11E5-BD72-AC87A3294C0A") Walkable // users: %3, %4
  %3 = witness_method [volatile] $@opened("7813D5BE-4C48-11E5-BD72-AC87A3294C0A") Walkable, #Walkable.walk!1.foreign, %2 : $@opened("7813D5BE-4C48-11E5-BD72-AC87A3294C0A") Walkable : $@convention(objc_method) <τ_0_0 where τ_0_0 : Walkable> (τ_0_0) -> () // user: %4
  %4 = apply %3<@opened("7813D5BE-4C48-11E5-BD72-AC87A3294C0A") Walkable>(%2) : $@convention(objc_method) <τ_0_0 where τ_0_0 : Walkable> (τ_0_0) -> ()
  %5 = witness_method [volatile] $@opened("7813D5BE-4C48-11E5-BD72-AC87A3294C0A") Walkable, #Walkable.walk!1.foreign, %2 : $@opened("7813D5BE-4C48-11E5-BD72-AC87A3294C0A") Walkable : $@convention(objc_method) <τ_0_0 where τ_0_0 : Walkable> (τ_0_0) -> () // user: %6
  %6 = apply %5<@opened("7813D5BE-4C48-11E5-BD72-AC87A3294C0A") Walkable>(%2) : $@convention(objc_method) <τ_0_0 where τ_0_0 : Walkable> (τ_0_0) -> ()
  strong_release %0 : $Walkable                   // id: %8
  %9 = tuple ()                                   // user: %10
  return %9 : $()                                 // id: %10
}

// Check that the open_existential_ref is CSEed not only in instructions, but also in the types
// of BB arguments. The type of BB2 argument should use the same opened existential as the
// one opened in the entry block.

// CHECK-LABEL: sil @cse_open_existential_in_bbarg : $@convention(thin) (@owned AnyObject) -> ()
// CHECK: open_existential_ref %0 : $AnyObject to $[[OPENED:@opened\(.*\) AnyObject]]
// CHECK: bb1(%{{[0-9]*}} : $@convention(objc_method) ([[OPENED]]) -> @autoreleased Optional<NSString>):
// CHECK-NOT: open_existential_ref
// CHECK: bb2(%{{[0-9]*}} : $@convention(objc_method) ([[OPENED]]) -> @autoreleased Optional<NSString>):
// CHECK-NOT: open_existential_ref
// CHECK: return
sil @cse_open_existential_in_bbarg : $@convention(thin) (@owned AnyObject) -> () {
bb0(%0 : $AnyObject):
  %1 = open_existential_ref %0 : $AnyObject to $@opened("CCEAC0E2-4BB2-11E6-86F8-B8E856428C60") AnyObject
  dynamic_method_br %1 : $@opened("CCEAC0E2-4BB2-11E6-86F8-B8E856428C60") AnyObject, #NSProxy.description!getter.1.foreign, bb1, bb3

bb1(%3 : $@convention(objc_method) (@opened("CCEAC0E2-4BB2-11E6-86F8-B8E856428C60") AnyObject) -> @autoreleased Optional<NSString>):
  strong_retain %1 : $@opened("CCEAC0E2-4BB2-11E6-86F8-B8E856428C60") AnyObject
  %5 = partial_apply %3(%1) : $@convention(objc_method) (@opened("CCEAC0E2-4BB2-11E6-86F8-B8E856428C60") AnyObject) -> @autoreleased Optional<NSString>
  %6 = apply %5() : $@callee_owned () -> @owned Optional<NSString>
  %7 = open_existential_ref %0 : $AnyObject to $@opened("CCEDAF1E-4BB2-11E6-86F8-B8E856428C60") AnyObject
  dynamic_method_br %7 : $@opened("CCEDAF1E-4BB2-11E6-86F8-B8E856428C60") AnyObject, #NSProxy.description!getter.1.foreign, bb2, bb3

bb2(%9 : $@convention(objc_method) (@opened("CCEDAF1E-4BB2-11E6-86F8-B8E856428C60") AnyObject) -> @autoreleased Optional<NSString>):
  strong_retain %7 : $@opened("CCEDAF1E-4BB2-11E6-86F8-B8E856428C60") AnyObject
  %10 = partial_apply %9(%7) : $@convention(objc_method) (@opened("CCEDAF1E-4BB2-11E6-86F8-B8E856428C60") AnyObject) -> @autoreleased Optional<NSString>
  %11 = apply %10() : $@callee_owned () -> @owned Optional<NSString>
  br bb3

bb3:
  strong_release %0 : $AnyObject
  %13 = tuple ()
  return %13 : $()
}

// CHECK-LABEL: sil @cse_value_metatype
// CHECK: value_metatype $@objc_metatype
// CHECK: objc_metatype_to_object
// CHECK-NOT: value_metatype $@objc_metatype
// CHECK: strong_release
// CHECK: return
sil @cse_value_metatype : $@convention(thin) <T where T : AnyObject> (@owned T) -> @owned (AnyObject, AnyObject) {
bb0(%0 : $T):
  %2 = value_metatype $@objc_metatype T.Type, %0 : $T
  %4 = objc_metatype_to_object %2 : $@objc_metatype T.Type to $AnyObject
  %5 = value_metatype $@objc_metatype T.Type, %0 : $T
  %7 = objc_metatype_to_object %5 : $@objc_metatype T.Type to $AnyObject
  strong_release %0 : $T
  %9 = tuple (%4: $AnyObject, %7: $AnyObject)
  return %9 : $(AnyObject, AnyObject)
}

// CHECK-LABEL: sil @cse_existential_metatype
// CHECK: existential_metatype $@objc_metatype
// CHECK: objc_existential_metatype_to_object
// CHECK-NOT: existential_metatype $@objc_metatype
// CHECK: strong_release
// CHECK: return
sil @cse_existential_metatype : $@convention(thin) (@owned XX) -> @owned (AnyObject, AnyObject) {
bb0(%0 : $XX):
  %2 = existential_metatype $@objc_metatype XX.Type, %0 : $XX
  %4 = objc_existential_metatype_to_object %2 : $@objc_metatype XX.Type to $AnyObject
  %5 = existential_metatype $@objc_metatype XX.Type, %0 : $XX
  %6 = objc_existential_metatype_to_object %5 : $@objc_metatype XX.Type to $AnyObject
  strong_release %0 : $XX
  %7 = tuple (%4: $AnyObject, %6: $AnyObject)
  return %7 : $(AnyObject, AnyObject)
}

class B {}

// CHECK-LABEL: sil @nocse_existential_metatype_addr
// CHECK: store
// CHECK: existential_metatype $@thick Any.Type
// CHECK: store
// CHECK: existential_metatype $@thick Any.Type
// CHECK: return
sil @nocse_existential_metatype_addr : $@convention(thin) (@owned B, @owned B) -> (@thick Any.Type, @thick Any.Type) {
bb0(%0 : $B, %1 : $B):
  %2 = alloc_stack $Any
  %3 = init_existential_addr %2 : $*Any, $B
  store %0 to %3 : $*B
  %5 = existential_metatype $@thick Any.Type, %2 : $*Any
  store %1 to %3 : $*B
  %7 = existential_metatype $@thick Any.Type, %2 : $*Any
  strong_release %1 : $B
  strong_release %0 : $B
  %99 = tuple (%5 : $@thick Any.Type, %7 : $@thick Any.Type)
  dealloc_stack %2 : $*Any
  return %99 : $(@thick Any.Type, @thick Any.Type)
}


// CHECK-LABEL: sil @cse_objc_metatype_to_object
// CHECK: value_metatype $@objc_metatype
// CHECK: objc_metatype_to_object
// CHECK-NOT: value_metatype $@objc_metatype
// CHECK-NOT: objc_metatype_to_object
// CHECK: strong_release
// CHECK: return
sil @cse_objc_metatype_to_object : $@convention(thin) <T where T : AnyObject> (@owned T) -> @owned (AnyObject, AnyObject) {
bb0(%0 : $T):
  %2 = value_metatype $@objc_metatype T.Type, %0 : $T
  %4 = objc_metatype_to_object %2 : $@objc_metatype T.Type to $AnyObject
  %5 = value_metatype $@objc_metatype T.Type, %0 : $T
  %7 = objc_metatype_to_object %5 : $@objc_metatype T.Type to $AnyObject
  strong_release %0 : $T
  %9 = tuple (%4: $AnyObject, %7: $AnyObject)
  return %9 : $(AnyObject, AnyObject)
}


// CHECK-LABEL: sil @cse_objc_existential_metatype_to_object
// CHECK: existential_metatype $@objc_metatype
// CHECK: objc_existential_metatype_to_object
// CHECK-NOT: existential_metatype $@objc_metatype
// CHECK-NOT: objc_existential_metatype_to_object
// CHECK: strong_release
// CHECK: return
sil @cse_objc_existential_metatype_to_object : $@convention(thin) (@owned XX) -> @owned (AnyObject, AnyObject) {
bb0(%0 : $XX):
  %2 = existential_metatype $@objc_metatype XX.Type, %0 : $XX
  %4 = objc_existential_metatype_to_object %2 : $@objc_metatype XX.Type to $AnyObject
  %5 = existential_metatype $@objc_metatype XX.Type, %0 : $XX
  %6 = objc_existential_metatype_to_object %5 : $@objc_metatype XX.Type to $AnyObject
  strong_release %0 : $XX
  %7 = tuple (%4: $AnyObject, %6: $AnyObject)
  return %7 : $(AnyObject, AnyObject)
}

@objc
class XXX {
}

// CHECK-LABEL: sil @cse_objc_to_thick_metatype
// CHECK: objc_to_thick_metatype
// CHECK-NOT: objc_to_thick_metatype
// CHECK: tuple
// CHECK: return
sil @cse_objc_to_thick_metatype : $@convention(thin) (@objc_metatype XXX.Type) -> (@thick XXX.Type, @thick XXX.Type) {
bb0(%0 : $@objc_metatype XXX.Type):
  %1 = objc_to_thick_metatype %0 : $@objc_metatype XXX.Type to $@thick XXX.Type
  %2 = objc_to_thick_metatype %0 : $@objc_metatype XXX.Type to $@thick XXX.Type
  %3 = tuple (%1: $@thick XXX.Type, %2: $@thick XXX.Type)
  return %3: $(@thick XXX.Type, @thick XXX.Type)
}

sil_vtable Bar {
  #Bar.init!initializer.1: _TFC4test3BarcfMS0_FT_S0_	// test.Bar.init (test.Bar.Type)() -> test.Bar
  #Bar.walk!1: _TFC4test3Bar4walkfS0_FT_T_	// test.Bar.walk (test.Bar)() -> ()
  #Bar.deinit!deallocator: _TFC4test3BarD	// test.Bar.__deallocating_deinit
}
