// 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, v, u : 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{{( dllexport)?}}{{( protected)?}} swiftcc void @alloc_small([24 x i8]* nocapture dereferenceable({{.*}}) %0, i64 %1) // CHECK-NEXT: entry: // CHECK-NEXT: [[T0:%.*]] = bitcast [24 x i8]* %0 to %TSi* // CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds %TSi, %TSi* [[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{{( dllexport)?}}{{( protected)?}} swiftcc void @project_small([24 x i8]* nocapture dereferenceable({{.*}}) %0, i64 %1) // CHECK-NEXT: entry: // CHECK-NEXT: [[T0:%.*]] = bitcast [24 x i8]* %0 to %TSi* // CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds %TSi, %TSi* [[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{{( dllexport)?}}{{( protected)?}} swiftcc void @dealloc_small([24 x i8]* nocapture dereferenceable({{.*}}) %0) // 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{{( dllexport)?}}{{( protected)?}} swiftcc void @alloc_big([24 x i8]* nocapture dereferenceable({{.*}}) %0, %T13value_buffers9BigStructV* noalias nocapture dereferenceable({{.*}}) %1) // CHECK-NEXT: entry: // CHECK-NEXT: [[T0:%.*]] = call noalias i8* @swift_slowAlloc(i64 48, 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 %T13value_buffers9BigStructV* // CHECK-NEXT: [[PARAM1:%.*]] = bitcast %T13value_buffers9BigStructV* [[ADDR]] to i8* // CHECK-NEXT: [[PARAM2:%.*]] = bitcast %T13value_buffers9BigStructV* %1 to i8* // CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[PARAM1]], i8* align 8 [[PARAM2]], i64 48, i1 false) // 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{{( dllexport)?}}{{( protected)?}} swiftcc void @project_big([24 x i8]* nocapture dereferenceable({{.*}}) %0, %T13value_buffers9BigStructV* noalias nocapture dereferenceable({{.*}}) %1) // CHECK-NEXT: entry: // CHECK-NEXT: [[T0:%.*]] = bitcast [24 x i8]* %0 to %T13value_buffers9BigStructV** // CHECK-NEXT: [[ADDR:%.*]] = load %T13value_buffers9BigStructV*, %T13value_buffers9BigStructV** [[T0]], align 8 // CHECK-NEXT: [[PARAM1:%.*]] = bitcast %T13value_buffers9BigStructV* [[ADDR]] to i8* // CHECK-NEXT: [[PARAM2:%.*]] = bitcast %T13value_buffers9BigStructV* %1 to i8* // CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[PARAM1]], i8* align 8 [[PARAM2]], i64 48, i1 false) // 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{{( dllexport)?}}{{( protected)?}} swiftcc void @dealloc_big([24 x i8]* nocapture dereferenceable({{.*}}) %0) // 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 @swift_slowDealloc(i8* [[ADDR]], i64 48, i64 7) // CHECK-NEXT: ret void