blob: 28f155209d15a3c61d3ac68b8cae629347444521 [file] [log] [blame]
; RUN: %swift-llvm-opt -swift-stack-promotion -stack-promotion-limit=100 %s | FileCheck %s
target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-apple-macosx10.9"
%swift.type = type { i64 }
%objc_object = type opaque
%swift.refcounted = type { %swift.type*, i32, i32 }
%BufferStorageType = type <{ %swift.refcounted }>
; CHECK-LABEL: define{{( protected)?}} void @promote_buffer()
; CHECK: [[B:%.+]] = alloca i8, i32 48, align 8
; CHECK: [[M:%.+]] = call %swift.type* @get_buffer_metadata()
; CHECK: [[BC:%.+]] = bitcast i8* [[B]] to %objc_object*
; CHECK: [[I:%.+]] = call %objc_object* @swift_initStackObject(%swift.type* [[M]], %objc_object* [[BC]])
; CHECK: [[BC2:%.+]] = bitcast %objc_object* [[I]] to i8*
; CHECK: call void @llvm.lifetime.end(i64 -1, i8* [[BC2]])
; CHECK: ret void
define void @promote_buffer() {
entry:
%0 = call %swift.type* @get_buffer_metadata()
%1 = call %objc_object* @swift_bufferAllocateOnStack(%swift.type* %0, i64 48, i64 7)
call void @swift_bufferDeallocateFromStack(%objc_object* %1)
ret void
}
; CHECK-LABEL: define{{( protected)?}} void @promote_buffer_with_devirtualized_release()
; CHECK: [[B:%.+]] = alloca i8, i32 48, align 8
; CHECK: [[M:%.+]] = call %swift.type* @get_buffer_metadata()
; CHECK: [[BC:%.+]] = bitcast i8* [[B]] to %objc_object*
; CHECK: [[I:%.+]] = call %objc_object* @swift_initStackObject(%swift.type* [[M]], %objc_object* [[BC]])
; CHECK-NOT: call
; CHECK: [[BC2:%.+]] = bitcast %objc_object* [[I]] to i8*
; CHECK-NOT: call
; CHECK: call void @llvm.lifetime.end(i64 -1, i8* [[BC2]])
; CHECK-NOT: call
; CHECK: ret void
define void @promote_buffer_with_devirtualized_release() {
entry:
%0 = call %swift.type* @get_buffer_metadata()
%1 = call %objc_object* @swift_bufferAllocateOnStack(%swift.type* %0, i64 48, i64 7)
%2 = bitcast %objc_object* %1 to %BufferStorageType*
call void bitcast (void (%swift.refcounted*)* @swift_setDeallocating to void (%BufferStorageType*)*)(%BufferStorageType* %2)
%3 = bitcast %BufferStorageType* %2 to %swift.refcounted*
call void @swift_deallocClassInstance(%swift.refcounted* %3, i64 48, i64 7)
call void @swift_bufferDeallocateFromStack(%objc_object* %1)
ret void
}
; CHECK-LABEL: define{{( protected)?}} void @promote_buffer_with_devirtualized_release_and_non_trivial_deinit()
; CHECK: [[B:%.+]] = alloca i8, i32 48, align 8
; CHECK: [[M:%.+]] = call %swift.type* @get_buffer_metadata()
; CHECK: [[BC:%.+]] = bitcast i8* [[B]] to %objc_object*
; CHECK: [[I:%.+]] = call %objc_object* @swift_initStackObject(%swift.type* [[M]], %objc_object* [[BC]])
; CHECK: [[BC2:%.+]] = bitcast %objc_object* [[I]] to %BufferStorageType
; CHECK-NEXT: call {{.*}}@swift_setDeallocating {{.*}}({{.*}} [[BC2]])
; CHECK-NEXT: call void @unknown_deinit(%BufferStorageType* [[BC2]])
; CHECK-NOT: call
; CHECK: [[BC3:%.+]] = bitcast %objc_object* [[I]] to i8*
; CHECK-NEXT: call void @llvm.lifetime.end(i64 -1, i8* [[BC3]])
; CHECK-NOT: call
; CHECK: ret void
define void @promote_buffer_with_devirtualized_release_and_non_trivial_deinit() {
entry:
%0 = call %swift.type* @get_buffer_metadata()
%1 = call %objc_object* @swift_bufferAllocateOnStack(%swift.type* %0, i64 48, i64 7)
%2 = bitcast %objc_object* %1 to %BufferStorageType*
call void bitcast (void (%swift.refcounted*)* @swift_setDeallocating to void (%BufferStorageType*)*)(%BufferStorageType* %2)
call void @unknown_deinit(%BufferStorageType* %2)
%3 = bitcast %BufferStorageType* %2 to %swift.refcounted*
call void @swift_deallocClassInstance(%swift.refcounted* %3, i64 48, i64 7)
call void @swift_bufferDeallocateFromStack(%objc_object* %1)
ret void
}
; CHECK-LABEL: define{{( protected)?}} void @dont_promote_buffer_exceeding_limit()
; CHECK: [[M:%.+]] = call %swift.type* @get_buffer_metadata()
; CHECK: call %objc_object* @swift_bufferAllocate(%swift.type* [[M]], i64 48, i64 7)
; CHECK-NEXT: ret void
define void @dont_promote_buffer_exceeding_limit() {
entry:
%0 = alloca i8, i32 128, align 8
%1 = call %swift.type* @get_buffer_metadata()
%2 = call %objc_object* @swift_bufferAllocateOnStack(%swift.type* %1, i64 48, i64 7)
call void @swift_bufferDeallocateFromStack(%objc_object* %2)
ret void
}
declare %swift.type* @get_buffer_metadata()
declare %objc_object* @swift_bufferAllocateOnStack(%swift.type*, i64, i64)
declare void @swift_bufferDeallocateFromStack(%objc_object*)
declare void @swift_setDeallocating(%swift.refcounted*)
declare void @swift_deallocClassInstance(%swift.refcounted*, i64, i64)
declare void @unknown_deinit(%BufferStorageType*)