// RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -sil-inline-generics -enable-sil-verify-all %s -O | %FileCheck %s
// RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -simplify-cfg -enable-sil-verify-all %s -O | %FileCheck --check-prefix=CHECK-SIMPLIFY-CFG %s

// Check some corner cases related to tracking of opened archetypes.
// For example, the compiler used to crash compiling the "process" function (rdar://28024272)

sil_stage canonical

import Builtin
import Swift
import SwiftShims

public protocol P {
}

extension P {
  func invokeClosure(_ closure: () throws -> ()) rethrows
}

public func process(s: P)

sil [noinline] @invokeClosure : $@convention(method) <Self where Self : P> (@owned @callee_owned () -> @error Error, @in_guaranteed Self) -> @error Error {
bb0(%0 : $@callee_owned () -> @error Error, %1 : $*Self):
  strong_release %0 : $@callee_owned () -> @error Error
  %5 = tuple ()
  return %5 : $()
}

sil @closure : $@convention(thin) () -> () {
bb0:
  %0 = tuple ()
  debug_value %0 : $()
  %2 = tuple ()
  return %2 : $()
}

// CHECK-LABEL: sil @process
// CHECK: bb0
// CHECK-NOT: try_apply
// CHECK-NOT: unreachable
// CHECK: apply
// CHECK-NOT: unreachable
// CHECK: return
sil @process : $@convention(thin) (@in P) -> () {
bb0(%0 : $*P):
  %2 = open_existential_addr immutable_access %0 : $*P to $*@opened("4C22C24E-6BAA-11E6-B904-B8E856428C60") P
  %3 = function_ref @invokeClosure : $@convention(method) <τ_0_0 where τ_0_0 : P> (@owned @callee_owned () -> @error Error, @in_guaranteed τ_0_0) -> @error Error
  // function_ref (process(s : P) -> ()).(closure #1)
  %4 = function_ref @closure : $@convention(thin) () -> ()
  %5 = thin_to_thick_function %4 : $@convention(thin) () -> () to $@callee_owned () -> ()
  %6 = convert_function %5 : $@callee_owned () -> () to $@callee_owned () -> @error Error
  try_apply %3<@opened("4C22C24E-6BAA-11E6-B904-B8E856428C60") P>(%6, %2) : $@convention(method) <τ_0_0 where τ_0_0 : P> (@owned @callee_owned () -> @error Error, @in_guaranteed τ_0_0) -> @error Error, normal bb1, error bb2

bb1(%8 : $()):
  destroy_addr %0 : $*P
  %10 = tuple ()
  return %10 : $()

bb2(%12 : $Error):
  unreachable
}

sil_default_witness_table P {
}

public protocol View {
}

class DynamicStorage {
  deinit
  init()
}

final class ItemStorage<V> : DynamicStorage where V : View {
  @sil_stored final let content: V
  init(content: V)
  deinit
  override init()
}

extension View {
  func dynamicStorage() -> DynamicStorage
}

public struct DynamicItem {
  @sil_stored private var storage: DynamicStorage { get set }
  public init(view: View)
}

sil @ItemStorage_alloc_init : $@convention(method) <V where V : View> (@in V, @thick ItemStorage<V>.Type) -> @owned ItemStorage<V> {

bb0(%0 : $*V, %1 : $@thick ItemStorage<V>.Type):
  %2 = alloc_ref $ItemStorage<V>

  %3 = function_ref @ItemStorage_init : $@convention(method) <τ_0_0 where τ_0_0 : View> (@in τ_0_0, @owned ItemStorage<τ_0_0>) -> @owned ItemStorage<τ_0_0>
  %4 = apply %3<V>(%0, %2) : $@convention(method) <τ_0_0 where τ_0_0 : View> (@in τ_0_0, @owned ItemStorage<τ_0_0>) -> @owned ItemStorage<τ_0_0>
  return %4 : $ItemStorage<V>
}

sil @ItemStorage_init : $@convention(method) <V where V : View> (@in V, @owned ItemStorage<V>) -> @owned ItemStorage<V>

sil @function_with_generic_alloc_ref : $@convention(method) <Self where Self : View> (@in_guaranteed Self) -> @owned DynamicStorage {
bb0(%0 : $*Self):
  %2 = function_ref @ItemStorage_alloc_init : $@convention(method) <τ_0_0 where τ_0_0 : View> (@in τ_0_0, @thick ItemStorage<τ_0_0>.Type) -> @owned ItemStorage<τ_0_0>
  %3 = metatype $@thick ItemStorage<Self>.Type
  %4 = alloc_stack $Self
  copy_addr %0 to [initialization] %4 : $*Self
  %6 = apply %2<Self>(%4, %3) : $@convention(method) <τ_0_0 where τ_0_0 : View> (@in τ_0_0, @thick ItemStorage<τ_0_0>.Type) -> @owned ItemStorage<τ_0_0>
  dealloc_stack %4 : $*Self
  %8 = upcast %6 : $ItemStorage<Self> to $DynamicStorage
  return %8 : $DynamicStorage
}

// Check that function calls with inlined properly and an alloc_ref
// with an opened archetype was created.
// CHECK-LABEL: sil @testAllocRefWithOpenArchetype
// CHECK: alloc_ref{{.*}}ItemStorage{{.*}}opened
sil @testAllocRefWithOpenArchetype: $@convention(method) (@in View, @thin DynamicItem.Type) -> @owned DynamicItem {
bb0(%0 : $*View, %1 : $@thin DynamicItem.Type):
  %2 = alloc_stack $DynamicItem, var, name "self"
  %4 = open_existential_addr immutable_access %0 : $*View to $*@opened("50960F66-26E4-11E7-BC37-A45E60E99281") View
  %5 = function_ref @function_with_generic_alloc_ref : $@convention(method) <τ_0_0 where τ_0_0 : View> (@in_guaranteed τ_0_0) -> @owned DynamicStorage
  %6 = apply %5<@opened("50960F66-26E4-11E7-BC37-A45E60E99281") View>(%4) : $@convention(method) <τ_0_0 where τ_0_0 : View> (@in_guaranteed τ_0_0) -> @owned DynamicStorage
  %7 = struct_element_addr %2 : $*DynamicItem, #DynamicItem.storage
  store %6 to %7 : $*DynamicStorage
  %9 = struct $DynamicItem (%6 : $DynamicStorage)
  retain_value %9 : $DynamicItem
  destroy_addr %0 : $*View
  %12 = struct $DynamicItem (%6 : $DynamicStorage)
  release_value %12 : $DynamicItem
  dealloc_stack %2 : $*DynamicItem
  return %9 : $DynamicItem
}

func use<T>(_ t: T)

final class Foo<T> where T : P {
  init(_ x: T)
  @sil_stored final var x: T { get set }
  @sil_stored final var y: T { get set }
  deinit
}

extension P {
  @inline(__always) func foo()
}

public func bar(_ p: P)

// Foo.__allocating_init(_:)
sil @Foo_alloc_init : $@convention(method) <T where T : P> (@in T, @thick Foo<T>.Type) -> @owned Foo<T> {
bb0(%0 : $*T, %1 : $@thick Foo<T>.Type):
  %2 = alloc_ref $Foo<T>
  // function_ref Foo.init(_:)
  %3 = function_ref @Foo_init : $@convention(method) <τ_0_0 where τ_0_0 : P> (@in τ_0_0, @owned Foo<τ_0_0>) -> @owned Foo<τ_0_0> 
  %4 = apply %3<T>(%0, %2) : $@convention(method) <τ_0_0 where τ_0_0 : P> (@in τ_0_0, @owned Foo<τ_0_0>) -> @owned Foo<τ_0_0> 
  return %4 : $Foo<T>
} // end sil function 'Foo_alloc_init'

// Foo.init(_:)
sil @Foo_init : $@convention(method) <T where T : P> (@in T, @owned Foo<T>) -> @owned Foo<T> {
bb0(%0 : $*T, %1 : $Foo<T>):
  %4 = alloc_stack $T
  copy_addr %0 to [initialization] %4 : $*T
  %6 = ref_element_addr %1 : $Foo<T>, #Foo.x
  copy_addr [take] %4 to [initialization] %6 : $*T
  dealloc_stack %4 : $*T
  %9 = alloc_stack $T
  copy_addr %0 to [initialization] %9 : $*T
  %11 = ref_element_addr %1 : $Foo<T>, #Foo.y
  copy_addr [take] %9 to [initialization] %11 : $*T
  dealloc_stack %9 : $*T
  destroy_addr %0 : $*T
  return %1 : $Foo<T>
} // end sil function 'Foo_init'

// P.foo()
sil [always_inline] @P_foo : $@convention(method) <Self where Self : P> (@in_guaranteed Self) -> () {
bb0(%0 : $*Self):
  // function_ref Foo.__allocating_init(_:)
  %2 = function_ref @Foo_alloc_init : $@convention(method) <τ_0_0 where τ_0_0 : P> (@in τ_0_0, @thick Foo<τ_0_0>.Type) -> @owned Foo<τ_0_0>
  %3 = metatype $@thick Foo<Self>.Type
  %4 = alloc_stack $Self 
  copy_addr %0 to [initialization] %4 : $*Self
  %6 = apply %2<Self>(%4, %3) : $@convention(method) <τ_0_0 where τ_0_0 : P> (@in τ_0_0, @thick Foo<τ_0_0>.Type) -> @owned Foo<τ_0_0>
  dealloc_stack %4 : $*Self 
  // function_ref use
  %9 = function_ref @use : $@convention(thin) <τ_0_0> (@in τ_0_0) -> () 
  %10 = ref_element_addr %6 : $Foo<Self>, #Foo.x 
  %11 = alloc_stack $Self
  copy_addr %10 to [initialization] %11 : $*Self
  %13 = apply %9<Self>(%11) : $@convention(thin) <τ_0_0> (@in τ_0_0) -> ()
  dealloc_stack %11 : $*Self
  // function_ref use
  %15 = function_ref @use : $@convention(thin) <τ_0_0> (@in τ_0_0) -> () 
  %16 = ref_element_addr %6 : $Foo<Self>, #Foo.y
  %17 = alloc_stack $Self
  copy_addr %16 to [initialization] %17 : $*Self
  %19 = apply %15<Self>(%17) : $@convention(thin) <τ_0_0> (@in τ_0_0) -> ()
  dealloc_stack %17 : $*Self
  strong_release %6 : $Foo<Self> 
  %22 = tuple ()
  return %22 : $()
} // end sil function 'P_foo'

// use
sil hidden_external @use : $@convention(thin) <τ_0_0> (@in τ_0_0) -> ()

// Check that everything besides the external function use is inlined into bar.
// It should contain alloc_ref and alloc_stack instructions using opened archetypes.
// CHECK-LABEL: sil @bar
// CHECK: open_existential{{.*}}C08045E0-2779-11E7-970E-A45E60E99281
// CHECK: alloc_stack{{.*}}C08045E0-2779-11E7-970E-A45E60E99281
// CHECK: alloc_ref{{.*}}C08045E0-2779-11E7-970E-A45E60E99281
// CHECK-NOT: function_ref @use
// CHECK: function_ref @use 
// CHECK-NOT: function_ref
// CHECK: dealloc_stack{{.*}}C08045E0-2779-11E7-970E-A45E60E99281
// CHECK: strong_release{{.*}}C08045E0-2779-11E7-970E-A45E60E99281
// CHECK: dealloc_ref{{.*}}C08045E0-2779-11E7-970E-A45E60E99281
// CHECK: end sil function 'bar' 
sil @bar : $@convention(thin) (@in P) -> () {
bb0(%0 : $*P):
  %2 = open_existential_addr immutable_access %0 : $*P to $*@opened("C08045E0-2779-11E7-970E-A45E60E99281") P
  // function_ref P.foo()
  %3 = function_ref @P_foo : $@convention(method) <τ_0_0 where τ_0_0 : P> (@in_guaranteed τ_0_0) -> ()
  %4 = apply %3<@opened("C08045E0-2779-11E7-970E-A45E60E99281") P>(%2) : $@convention(method) <τ_0_0 where τ_0_0 : P> (@in_guaranteed τ_0_0) -> ()
  destroy_addr %0 : $*P
  %6 = tuple ()
  return %6 : $()
} // end sil function 'bar'

// A helper function that does not use its arguments at all
sil @dont_use_arguments: $@convention(thin) (Int32) -> () {
bb0(%0 : $Int32):
  %1 = tuple ()
  return %1 : $()
}

// Check that dont_use_arguments is inlined into check_removal_of_unregistered_archetype_def
// and this does not lead to an "Opened archetype definition is not registered in
// SILFunction" assertion failure, that used to happen because the apply instruction
// was not aware of the opened archetype definition that becomes unused and gets removed
// after the inlining.
//
// CHECK-LABEL: sil @check_removal_of_unregistered_archetype_def
// CHECK-NOT: init_existential
// CHECK-NOT: open_existential
// CHECK-NOT: function_ref
// CHECK-NOT: apply
// CHECK: strong_release
// CHECK: end sil function 'check_removal_of_unregistered_archetype_def'
sil @check_removal_of_unregistered_archetype_def : $@convention(thin) (AnyObject) -> () {
bb0(%0 : $AnyObject):
  %1 = open_existential_ref %0 : $AnyObject to $@opened("2CAE06CE-5F10-11E4-AF13-C82A1428F987") AnyObject
  %2 = integer_literal $Builtin.Int32, 1
  %3 = struct $Int32(%2 : $Builtin.Int32)
  %4 = mark_dependence %3 : $Int32 on %1 : $@opened("2CAE06CE-5F10-11E4-AF13-C82A1428F987") AnyObject
  %5 = function_ref @dont_use_arguments : $@convention(thin) (Int32) -> ()
  %6 = apply %5(%4) : $@convention(thin) (Int32) -> ()
  strong_release %0 : $AnyObject
  %8 = tuple ()
  return %8 : $()
} // end sil function 'check_removal_of_unregistered_archetype_def'

// Check that even in case of unreacheable blocks the compiler does not hang
// in SILBuilder::addOpenedArchetypeOperands. rdar://problem/34602036

enum MyOptional<T> {
  case none
  case some(T)
}

class C {
  var this : MyOptional<C>
  init()
}

// CHECK-SIMPLIFY-CFG-LABEL: sil @test_infinite_loop_in_unreachable_block
// CHECK-SIMPLIFY-CFG: bb0
// CHECK-SIMPLIFY-CFG-NOT: bb1
// CHECK-SIMPLIFY-CFG: end sil function 'test_infinite_loop_in_unreachable_block'
sil @test_infinite_loop_in_unreachable_block : $@convention(method) (@guaranteed C) -> () {
bb0(%0 : $C):
  %1 = enum $MyOptional<C>, #MyOptional.some!enumelt.1, %0 : $C
  %2 = integer_literal $Builtin.Int64, 0 
  strong_retain %0 : $C
  release_value %1 : $MyOptional<C>
  %6 = integer_literal $Builtin.Int1, -1
  cond_br %6, bb5, bb1

bb1:
  %8 = enum $MyOptional<C>, #MyOptional.some!enumelt.1, %0 : $C
  strong_retain %0 : $C
  br bb2(%8 : $MyOptional<C>)

bb2(%11 : $MyOptional<C>):
  %12 = unchecked_enum_data %11 : $MyOptional<C>, #MyOptional.some!enumelt.1
  %13 = ref_element_addr %12 : $C, #C.this
  %14 = load %13 : $*MyOptional<C>
  switch_enum %14 : $MyOptional<C>, case #MyOptional.some!enumelt.1: bb3, case #MyOptional.none!enumelt: bb4

bb3(%16 : $C):
  retain_value %14 : $MyOptional<C>
  release_value %11 : $MyOptional<C>
  br bb2(%14 : $MyOptional<C>)

bb4:
  release_value %11 : $MyOptional<C>
  br bb5

bb5:
  %22 = tuple ()
  return %22 : $()
} // end sil function 'test_infinite_loop_in_unreachable_block'
