// RUN: %target-swift-frontend %s -emit-ir | FileCheck %s

// REQUIRES: CPU=x86_64

sil_stage canonical

import Builtin
import Swift

struct BigStruct {
  var x, y, z, w : Int
}

sil @alloc_small : $(@inout Builtin.UnsafeValueBuffer, Int) -> () {
entry(%b : $*Builtin.UnsafeValueBuffer, %v : $Int):
  %0 = alloc_value_buffer $Int in %b : $*Builtin.UnsafeValueBuffer
  store %v to %0 : $*Int
  %r = tuple ()
  return %r : $()
}
// CHECK-LABEL: define{{( protected)?}} void @alloc_small([24 x i8]* nocapture dereferenceable({{.*}}), i64)
// CHECK-NEXT: entry:
// CHECK-NEXT: [[T0:%.*]] = bitcast [24 x i8]* %0 to %Si*
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds %Si, %Si* [[T0]], i32 0, i32 0
// CHECK-NEXT: store i64 %1, i64* [[T2]], align 8
// CHECK-NEXT: ret void

sil @project_small : $(@inout Builtin.UnsafeValueBuffer, Int) -> () {
entry(%b : $*Builtin.UnsafeValueBuffer, %v : $Int):
  %0 = project_value_buffer $Int in %b : $*Builtin.UnsafeValueBuffer
  store %v to %0 : $*Int
  %r = tuple ()
  return %r : $()
}
// CHECK-LABEL: define{{( protected)?}} void @project_small([24 x i8]* nocapture dereferenceable({{.*}}), i64)
// CHECK-NEXT: entry:
// CHECK-NEXT: [[T0:%.*]] = bitcast [24 x i8]* %0 to %Si*
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds %Si, %Si* [[T0]], i32 0, i32 0
// CHECK-NEXT: store i64 %1, i64* [[T2]], align 8
// CHECK-NEXT: ret void

sil @dealloc_small : $(@inout Builtin.UnsafeValueBuffer) -> () {
entry(%b : $*Builtin.UnsafeValueBuffer):
  dealloc_value_buffer $Int in %b : $*Builtin.UnsafeValueBuffer
  %r = tuple ()
  return %r : $()
}
// CHECK-LABEL: define{{( protected)?}} void @dealloc_small([24 x i8]* nocapture dereferenceable({{.*}}))
// CHECK-NEXT: entry:
// CHECK-NEXT: ret void

sil @alloc_big : $(@inout Builtin.UnsafeValueBuffer, BigStruct) -> () {
entry(%b : $*Builtin.UnsafeValueBuffer, %v : $BigStruct):
  %0 = alloc_value_buffer $BigStruct in %b : $*Builtin.UnsafeValueBuffer
  store %v to %0 : $*BigStruct
  %r = tuple ()
  return %r : $()
}
// CHECK-LABEL: define{{( protected)?}} void @alloc_big([24 x i8]* nocapture dereferenceable({{.*}}), %V13value_buffers9BigStruct* noalias nocapture dereferenceable({{.*}}))
// CHECK-NEXT: entry:
// CHECK: [[SLOT0:%.*]] = load i64
// CHECK: [[SLOT1:%.*]] = load i64
// CHECK: [[SLOT2:%.*]] = load i64
// CHECK: [[SLOT3:%.*]] = load i64
// CHECK-NEXT: [[T0:%.*]] = call noalias i8* @rt_swift_slowAlloc(i64 32, i64 7)
// CHECK-NEXT: [[T1:%.*]] = bitcast [24 x i8]* %0 to i8**
// CHECK-NEXT: store i8* [[T0]], i8** [[T1]], align 8
// CHECK-NEXT: [[ADDR:%.*]] = bitcast i8* [[T0]] to %V13value_buffers9BigStruct*
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %V13value_buffers9BigStruct, %V13value_buffers9BigStruct* [[ADDR]], i32 0, i32 0
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds %Si, %Si* [[T0]], i32 0, i32 0
// CHECK-NEXT: store i64 [[SLOT0]], i64* [[T1]], align 8
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %V13value_buffers9BigStruct, %V13value_buffers9BigStruct* [[ADDR]], i32 0, i32 1
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds %Si, %Si* [[T0]], i32 0, i32 0
// CHECK-NEXT: store i64 [[SLOT1]], i64* [[T1]], align 8
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %V13value_buffers9BigStruct, %V13value_buffers9BigStruct* [[ADDR]], i32 0, i32 2
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds %Si, %Si* [[T0]], i32 0, i32 0
// CHECK-NEXT: store i64 [[SLOT2]], i64* [[T1]], align 8
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %V13value_buffers9BigStruct, %V13value_buffers9BigStruct* [[ADDR]], i32 0, i32 3
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds %Si, %Si* [[T0]], i32 0, i32 0
// CHECK-NEXT: store i64 [[SLOT3]], i64* [[T1]], align 8
// CHECK-NEXT: ret void

sil @project_big : $(@inout Builtin.UnsafeValueBuffer, BigStruct) -> () {
entry(%b : $*Builtin.UnsafeValueBuffer, %v : $BigStruct):
  %0 = project_value_buffer $BigStruct in %b : $*Builtin.UnsafeValueBuffer
  store %v to %0 : $*BigStruct
  %r = tuple ()
  return %r : $()
}
// CHECK-LABEL: define{{( protected)?}} void @project_big([24 x i8]* nocapture dereferenceable({{.*}}), %V13value_buffers9BigStruct* noalias nocapture dereferenceable({{.*}}))
// CHECK-NEXT: entry:
// CHECK: [[SLOT0:%.*]] = load i64
// CHECK: [[SLOT1:%.*]] = load i64
// CHECK: [[SLOT2:%.*]] = load i64
// CHECK: [[SLOT3:%.*]] = load i64
// CHECK-NEXT: [[T0:%.*]] = bitcast [24 x i8]* %0 to %V13value_buffers9BigStruct**
// CHECK-NEXT: [[ADDR:%.*]] = load %V13value_buffers9BigStruct*, %V13value_buffers9BigStruct** [[T0]], align 8
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %V13value_buffers9BigStruct, %V13value_buffers9BigStruct* [[ADDR]], i32 0, i32 0
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds %Si, %Si* [[T0]], i32 0, i32 0
// CHECK-NEXT: store i64 [[SLOT0]], i64* [[T1]], align 8
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %V13value_buffers9BigStruct, %V13value_buffers9BigStruct* [[ADDR]], i32 0, i32 1
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds %Si, %Si* [[T0]], i32 0, i32 0
// CHECK-NEXT: store i64 [[SLOT1]], i64* [[T1]], align 8
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %V13value_buffers9BigStruct, %V13value_buffers9BigStruct* [[ADDR]], i32 0, i32 2
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds %Si, %Si* [[T0]], i32 0, i32 0
// CHECK-NEXT: store i64 [[SLOT2]], i64* [[T1]], align 8
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %V13value_buffers9BigStruct, %V13value_buffers9BigStruct* [[ADDR]], i32 0, i32 3
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds %Si, %Si* [[T0]], i32 0, i32 0
// CHECK-NEXT: store i64 [[SLOT3]], i64* [[T1]], align 8
// CHECK-NEXT: ret void

sil @dealloc_big : $(@inout Builtin.UnsafeValueBuffer) -> () {
entry(%b : $*Builtin.UnsafeValueBuffer):
  dealloc_value_buffer $BigStruct in %b : $*Builtin.UnsafeValueBuffer
  %r = tuple ()
  return %r : $()
}
// CHECK-LABEL: define{{( protected)?}} void @dealloc_big([24 x i8]* nocapture dereferenceable({{.*}}))
// CHECK-NEXT: entry:
// CHECK-NEXT: [[T0:%.*]] = bitcast [24 x i8]* %0 to i8**
// CHECK-NEXT: [[ADDR:%.*]] = load i8*, i8** [[T0]], align 8
// CHECK-NEXT: call void @rt_swift_slowDealloc(i8* [[ADDR]], i64 32, i64 7)
// CHECK-NEXT: ret void
