// RUN: %target-sil-opt -enable-sil-verify-all -remove-pins %s | FileCheck %s

sil_stage canonical

import Swift
import SwiftShims
import Builtin

/////////////
// Utility //
/////////////

struct MyArrayBuffer {
  var storage : Builtin.NativeObject
}

struct MyInt {}
class MyClass {}

struct MyArray<T>{
  var buffer : MyArrayBuffer
}

sil [_semantics "array.make_mutable"] @make_mutable : $@convention(method) (@inout MyArray<MyInt>) -> Bool

sil [_semantics "array.get_count"] @get_count : $@convention(method) (@guaranteed MyArray<MyInt>) -> ()

sil [_semantics "array.make_mutable"] @make_mutable_class : $@convention(method) (@inout MyArray<MyClass>) -> Bool

sil [_semantics "array.get_count"] @get_count_class : $@convention(method) (@guaranteed MyArray<MyClass>) -> ()

sil @user : $@convention(thin) (Builtin.NativeObject) -> Bool

///////////
// Tests //
///////////

// CHECK-LABEL: sil @remove_pins
// CHECK-NOT: strong_pin
// CHECK-NOT: strong_unpin
// CHECK: return

sil @remove_pins : $@convention(thin) (@guaranteed Builtin.NativeObject) -> () {
bb0(%0 : $Builtin.NativeObject):
  %1 = strong_pin %0 : $Builtin.NativeObject
  strong_unpin %1 : $Optional<Builtin.NativeObject>
  %2 = tuple()
  return %2 : $()
}

// CHECK-LABEL: sil @dont_remove_pins
// CHECK: strong_pin
// CHECK: strong_release
// CHECK: strong_unpin
// CHECK: return

sil @dont_remove_pins : $@convention(thin) (@guaranteed Builtin.NativeObject) -> () {
bb0(%0 : $Builtin.NativeObject):
  %1 = strong_pin %0 : $Builtin.NativeObject
  strong_release %0 : $Builtin.NativeObject
  strong_unpin %1 : $Optional<Builtin.NativeObject>
  %2 = tuple()
  return %2 : $()
}

/// Due to the usage pattern of the array's uniquing there will always be a
/// guarding make_mutable across the second access of a non-structural
/// modification sequence.

// CHECK-LABEL: sil @remove_pins_across_make_mutable
// CHECK: [[MAKE_MUTABLE:%.*]] = function_ref @make_mutable
// CHECK: apply [[MAKE_MUTABLE]]
// CHECK-NOT: strong_pin
// CHECK: apply [[MAKE_MUTABLE]]
// CHECK-NOT: strong_unpin
// CHECK: return

sil @remove_pins_across_make_mutable : $@convention(thin) (@inout MyArray<MyInt>) -> () {
bb0(%0 : $*MyArray<MyInt>):
  %1 = load %0: $*MyArray<MyInt>
  %2 = struct_extract %1 : $MyArray<MyInt>, #MyArray.buffer
  %3 = struct_extract %2 : $MyArrayBuffer, #MyArrayBuffer.storage
  %4 = function_ref @make_mutable : $@convention(method) (@inout MyArray<MyInt>) -> Bool
  %5 = apply %4(%0) : $@convention(method) (@inout MyArray<MyInt>) -> Bool
  %6 = strong_pin %3 : $Builtin.NativeObject
  %7 = apply %4(%0) : $@convention(method) (@inout MyArray<MyInt>) -> Bool
  strong_unpin %6 : $Optional<Builtin.NativeObject>
  %8 = tuple()
  return %8 : $()
}

// CHECK-LABEL: sil @remove_pins_across_make_mutable_class
// CHECK: [[MAKE_MUTABLE:%.*]] = function_ref @make_mutable_class
// CHECK: apply [[MAKE_MUTABLE]]
// CHECK-NOT: strong_pin
// CHECK: apply [[MAKE_MUTABLE]]
// CHECK-NOT: strong_unpin
// CHECK: return

sil @remove_pins_across_make_mutable_class : $@convention(thin) (@inout MyArray<MyClass>) -> () {
bb0(%0 : $*MyArray<MyClass>):
  %1 = load %0: $*MyArray<MyClass>
  %2 = struct_extract %1 : $MyArray<MyClass>, #MyArray.buffer
  %3 = struct_extract %2 : $MyArrayBuffer, #MyArrayBuffer.storage
  %4 = function_ref @make_mutable_class : $@convention(method) (@inout MyArray<MyClass>) -> Bool
  %5 = apply %4(%0) : $@convention(method) (@inout MyArray<MyClass>) -> Bool
  %6 = strong_pin %3 : $Builtin.NativeObject
  %7 = apply %4(%0) : $@convention(method) (@inout MyArray<MyClass>) -> Bool
  strong_unpin %6 : $Optional<Builtin.NativeObject>
  %8 = tuple()
  return %8 : $()
}

// CHECK-LABEL: sil @dont_remove_pins_across_pin_read
// CHECK: strong_pin
// CHECK: is_unique_or_pinned
// CHECK: strong_unpin

sil @dont_remove_pins_across_pin_read : $@convention(thin) (@inout MyArray<MyInt>) -> Builtin.Int1 {
bb0(%0 : $*MyArray<MyInt>):
  %1 = load %0: $*MyArray<MyInt>
  %2 = struct_element_addr %0 : $*MyArray<MyInt>, #MyArray.buffer
  %3 = struct_element_addr %2 : $*MyArrayBuffer, #MyArrayBuffer.storage
  %4 = struct_extract %1 : $MyArray<MyInt>, #MyArray.buffer
  %5 = struct_extract %4 : $MyArrayBuffer, #MyArrayBuffer.storage
  %6 = strong_pin %5 : $Builtin.NativeObject
  %7 = is_unique_or_pinned %3 : $*Builtin.NativeObject
  strong_unpin %6 : $Optional<Builtin.NativeObject>
  return %7 : $Builtin.Int1
}

// CHECK-LABEL: sil @remove_pins_with_inert_rcidentity_uses : $@convention(thin) (@inout MyArray<MyInt>) -> () {
// CHECK-NOT: strong_pin
// CHECK-NOT: strong_unpin
sil @remove_pins_with_inert_rcidentity_uses : $@convention(thin) (@inout MyArray<MyInt>) -> () {
bb0(%0 : $*MyArray<MyInt>):
  %1 = load %0: $*MyArray<MyInt>
  %2 = struct_extract %1 : $MyArray<MyInt>, #MyArray.buffer
  %3 = struct_extract %2 : $MyArrayBuffer, #MyArrayBuffer.storage
  %4 = unchecked_trivial_bit_cast %3 : $Builtin.NativeObject to $UnsafePointer<HeapObject>
  %6 = strong_pin %3 : $Builtin.NativeObject
  %7 = integer_literal $Builtin.Int1, 0
  %8 = tuple(%6 : $Optional<Builtin.NativeObject>, %7 : $Builtin.Int1)
  %9 = tuple_extract %8 : $(Optional<Builtin.NativeObject>, Builtin.Int1), 0
  strong_unpin %9 : $Optional<Builtin.NativeObject>
  %9999 = tuple()
  return %9999 : $()
}

// CHECK-LABEL: sil @cant_remove_pins_with_escaping_rcidentity_use : $@convention(thin) (@inout MyArray<MyInt>) -> Bool {
// CHECK: strong_pin
// CHECK: strong_unpin
sil @cant_remove_pins_with_escaping_rcidentity_use : $@convention(thin) (@inout MyArray<MyInt>) -> Bool {
bb0(%0 : $*MyArray<MyInt>):
  %1 = load %0: $*MyArray<MyInt>
  %4 = struct_extract %1 : $MyArray<MyInt>, #MyArray.buffer
  %5 = struct_extract %4 : $MyArrayBuffer, #MyArrayBuffer.storage
  %6 = strong_pin %5 : $Builtin.NativeObject
  %7 = integer_literal $Builtin.Int1, 0
  %8 = tuple(%6 : $Optional<Builtin.NativeObject>, %7 : $Builtin.Int1)
  %9 = tuple_extract %8 : $(Optional<Builtin.NativeObject>, Builtin.Int1), 0
  strong_unpin %9 : $Optional<Builtin.NativeObject>
  %11 = unchecked_enum_data %6 : $Optional<Builtin.NativeObject>, #Optional.some!enumelt.1
  %12 = function_ref @user : $@convention(thin) (Builtin.NativeObject) -> Bool
  %13 = apply %12(%11) : $@convention(thin) (Builtin.NativeObject) -> Bool
  return %13 : $Bool
}

// Make sure we ignore the uses of %10 and %12.
//
// This is safe to do since the value we are extracting has nothing to do really
// with the RCIdentity of the tuple we are extracting from.

// CHECK-LABEL: sil @remove_pins_with_inert_rcidentity_uses3 : $@convention(thin) (@inout MyArray<MyInt>) -> (Builtin.Int1, Builtin.Int1) {
// CHECK-NOT: strong_pin
// CHECK-NOT: strong_unpin
sil @remove_pins_with_inert_rcidentity_uses3 : $@convention(thin) (@inout MyArray<MyInt>) -> (Builtin.Int1, Builtin.Int1) {
bb0(%0 : $*MyArray<MyInt>):
  %1 = load %0: $*MyArray<MyInt>
  %2 = struct_extract %1 : $MyArray<MyInt>, #MyArray.buffer
  %3 = struct_extract %2 : $MyArrayBuffer, #MyArrayBuffer.storage
  %4 = unchecked_trivial_bit_cast %3 : $Builtin.NativeObject to $UnsafePointer<HeapObject>
  %6 = strong_pin %3 : $Builtin.NativeObject
  %7 = integer_literal $Builtin.Int1, 0
  %8 = tuple(%6 : $Optional<Builtin.NativeObject>, %7 : $Builtin.Int1)
  %9 = tuple_extract %8 : $(Optional<Builtin.NativeObject>, Builtin.Int1), 0
  %10 = tuple_extract %8 : $(Optional<Builtin.NativeObject>, Builtin.Int1), 1
  strong_unpin %9 : $Optional<Builtin.NativeObject>  
  %11 = tuple_extract %8 : $(Optional<Builtin.NativeObject>, Builtin.Int1), 1
  %12 = tuple(%10 : $Builtin.Int1, %11 : $Builtin.Int1)
  return %12 : $(Builtin.Int1, Builtin.Int1)
}

// CHECK-LABEL: sil @do_not_remove_pins_non_inert_rcidentity_uses : $@convention(thin) (@inout MyArray<MyInt>) -> Bool {
// CHECK: strong_pin
// CHECK: strong_unpin
sil @do_not_remove_pins_non_inert_rcidentity_uses : $@convention(thin) (@inout MyArray<MyInt>) -> Bool {
bb0(%0 : $*MyArray<MyInt>):
  %1 = load %0: $*MyArray<MyInt>
  %2 = struct_extract %1 : $MyArray<MyInt>, #MyArray.buffer
  %3 = struct_extract %2 : $MyArrayBuffer, #MyArrayBuffer.storage
  %4 = unchecked_trivial_bit_cast %3 : $Builtin.NativeObject to $UnsafePointer<HeapObject>
  %6 = strong_pin %3 : $Builtin.NativeObject
  %7 = integer_literal $Builtin.Int1, 0
  %8 = tuple(%6 : $Optional<Builtin.NativeObject>, %7 : $Builtin.Int1)
  %9 = tuple_extract %8 : $(Optional<Builtin.NativeObject>, Builtin.Int1), 0
  strong_unpin %9 : $Optional<Builtin.NativeObject>
  %10 = unchecked_ref_cast %9 : $Optional<Builtin.NativeObject> to $Builtin.NativeObject
  %11 = function_ref @user : $@convention(thin) (Builtin.NativeObject) -> Bool
  %12 = apply %11(%10) : $ @convention(thin) (Builtin.NativeObject) -> Bool
  return %12 : $Bool
}

// Make sure that we properly ignore guaranteed retain, releases.
//
// Discussion: We pattern match very closely for now by whenever we see a
// release, checking if the previous instruction was a guaranteed array semantic
// call with guaranteed self and the instruction before that a retain on self
// again. In such a case, we ignore the release.
//
// CHECK-LABEL: sil @pins_and_guaranteed_self : $@convention(thin) (@inout MyArray<MyInt>) -> () {
// CHECK: bb0
// CHECK-NOT: strong_pin
// CHECK-NOT: strong_unpin
// CHECK: bb1
// CHECK: strong_pin
// CHECK: strong_unpin
sil @pins_and_guaranteed_self : $@convention(thin) (@inout MyArray<MyInt>) -> () {
bb0(%0 : $*MyArray<MyInt>):
  %1 = load %0: $*MyArray<MyInt>
  %2 = struct_extract %1 : $MyArray<MyInt>, #MyArray.buffer
  %3 = struct_extract %2 : $MyArrayBuffer, #MyArrayBuffer.storage
  %4 = unchecked_trivial_bit_cast %3 : $Builtin.NativeObject to $UnsafePointer<HeapObject>
  %6 = function_ref @get_count : $@convention(method) (@guaranteed MyArray<MyInt>) -> ()
  %7 = strong_pin %3 : $Builtin.NativeObject
  retain_value %1 : $MyArray<MyInt>
  apply %6(%1) : $@convention(method) (@guaranteed MyArray<MyInt>) -> ()
  release_value %1 : $MyArray<MyInt>
  strong_unpin %7 : $Optional<Builtin.NativeObject>

  // We take advantage of pins being single BB here.
  br bb1

bb1:
  %8 = strong_pin %3 : $Builtin.NativeObject
  retain_value %1 : $MyArray<MyInt>
  apply %6(%1) : $@convention(method) (@guaranteed MyArray<MyInt>) -> ()
  apply %6(%1) : $@convention(method) (@guaranteed MyArray<MyInt>) -> ()
  release_value %1 : $MyArray<MyInt>
  strong_unpin %8 : $Optional<Builtin.NativeObject>

  %9999 = tuple()
  return %9999 : $()
}

// Arrays that could be backed by an NSArray may call NSArray methods which
// might have arbitrary side effects including a release on the array.

// CHECK-LABEL: sil @pins_and_guaranteed_self_class
// CHECK: bb0({{.*}}):
// CHECK: strong_pin
// CHECK: strong_unpin
// CHECK: br bb1
// CHECK: bb1:
// CHECK: strong_pin
// CHECK: strong_unpin
// CHECK: return

sil @pins_and_guaranteed_self_class : $@convention(thin) (@inout MyArray<MyClass>) -> () {
bb0(%0 : $*MyArray<MyClass>):
  %1 = load %0: $*MyArray<MyClass>
  %2 = struct_extract %1 : $MyArray<MyClass>, #MyArray.buffer
  %3 = struct_extract %2 : $MyArrayBuffer, #MyArrayBuffer.storage
  %4 = unchecked_trivial_bit_cast %3 : $Builtin.NativeObject to $UnsafePointer<HeapObject>
  %6 = function_ref @get_count_class : $@convention(method) (@guaranteed MyArray<MyClass>) -> ()
  %7 = strong_pin %3 : $Builtin.NativeObject
  retain_value %1 : $MyArray<MyClass>
  apply %6(%1) : $@convention(method) (@guaranteed MyArray<MyClass>) -> ()
  release_value %1 : $MyArray<MyClass>
  strong_unpin %7 : $Optional<Builtin.NativeObject>

  // We take advantage of pins being single BB here.
  br bb1

bb1:
  %8 = strong_pin %3 : $Builtin.NativeObject
  retain_value %1 : $MyArray<MyClass>
  apply %6(%1) : $@convention(method) (@guaranteed MyArray<MyClass>) -> ()
  apply %6(%1) : $@convention(method) (@guaranteed MyArray<MyClass>) -> ()
  release_value %1 : $MyArray<MyClass>
  strong_unpin %8 : $Optional<Builtin.NativeObject>

  %9999 = tuple()
  return %9999 : $()
}

// CHECK: sil @remove_pins_mark_dependence
// CHECK-NOT: strong_pin
// CHECK-NOT: strong_unpin
// CHECK: return

sil @remove_pins_mark_dependence : $@convention(thin) (@inout MyArray<MyInt>, MyInt) -> () {
bb0(%0 : $*MyArray<MyInt>, %1 : $MyInt):
  %2 = integer_literal $Builtin.Word, 16
  %3 = load %0 : $*MyArray<MyInt>
  %4 = struct_extract %3 : $MyArray<MyInt>, #MyArray.buffer
  %5 = struct_extract %4 : $MyArrayBuffer, #MyArrayBuffer.storage
  %6 = unchecked_trivial_bit_cast %5 : $Builtin.NativeObject to $Builtin.RawPointer
  %7 = index_raw_pointer %6 : $Builtin.RawPointer, %2 : $Builtin.Word
  %8 = strong_pin %5 : $Builtin.NativeObject
  %9 = pointer_to_address %7 : $Builtin.RawPointer to [strict] $*MyInt
  %10 = integer_literal $Builtin.Word, 2
  %11 = index_addr %9 : $*MyInt, %10 : $Builtin.Word
  %12 = mark_dependence %11 : $*MyInt on %8 : $Optional<Builtin.NativeObject>
  store %1 to %12 : $*MyInt
  strong_unpin %8 : $Optional<Builtin.NativeObject>
  %15 = tuple ()
  return %15 : $()
}

// CHECK: sil @dont_remove_pins_mark_dependence
// CHECK: strong_pin
// CHECK: strong_unpin
// CHECK: return

sil @dont_remove_pins_mark_dependence : $@convention(thin) (@inout MyArray<MyInt>, MyInt, Optional<Builtin.NativeObject>) -> () {
bb0(%0 : $*MyArray<MyInt>, %1 : $MyInt, %16 : $Optional<Builtin.NativeObject>):
  %2 = integer_literal $Builtin.Word, 16
  %3 = load %0 : $*MyArray<MyInt>
  %4 = struct_extract %3 : $MyArray<MyInt>, #MyArray.buffer
  %5 = struct_extract %4 : $MyArrayBuffer, #MyArrayBuffer.storage
  %6 = unchecked_trivial_bit_cast %5 : $Builtin.NativeObject to $Builtin.RawPointer
  %7 = index_raw_pointer %6 : $Builtin.RawPointer, %2 : $Builtin.Word
  %8 = strong_pin %5 : $Builtin.NativeObject
  %9 = pointer_to_address %7 : $Builtin.RawPointer to [strict] $*MyInt
  %10 = integer_literal $Builtin.Word, 2
  %11 = index_addr %9 : $*MyInt, %10 : $Builtin.Word
  %12 = mark_dependence %8 : $Optional<Builtin.NativeObject> on %16 : $Optional<Builtin.NativeObject>
  strong_unpin %8 : $Optional<Builtin.NativeObject>
  %15 = tuple ()
  return %15 : $()
}
