mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
These were added in https://github.com/swiftlang/swift/pull/81375 (and several other follow-up PRs because we missed a few places) and are no longer needed.
109 lines
5.0 KiB
Plaintext
109 lines
5.0 KiB
Plaintext
// RUN: %target-swift-frontend -disable-debugger-shadow-copies -Xllvm -sil-disable-pass=mandatory-temp-rvalue-elimination -gnone -emit-ir %s | %FileCheck --check-prefix=CHECK --check-prefix=CHECK-%target-cpu %s -DINT=i%target-ptrsize
|
|
|
|
sil_stage canonical
|
|
|
|
import Builtin
|
|
|
|
sil @generic : $@convention(thin) <T> (@in T) -> () {
|
|
bb0(%x : $*T):
|
|
%y = alloc_stack $T
|
|
copy_addr %x to [init] %y : $*T
|
|
destroy_addr %y : $*T
|
|
dealloc_stack %y : $*T
|
|
destroy_addr %x : $*T
|
|
%0 = tuple ()
|
|
return %0 : $()
|
|
}
|
|
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @generic(ptr noalias %0, ptr %T) {{.*}} {
|
|
// Allocate it.
|
|
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr %T, {{(i32|i64)}} -1
|
|
// CHECK-NEXT: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
|
|
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
|
|
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
|
|
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
|
|
// CHECK-NEXT: [[SIZE_ADDR:%.*]] = getelementptr inbounds{{.*}} %swift.vwtable, ptr [[VWT]], i32 0, i32 8
|
|
// CHECK-NEXT: [[SIZE:%.*]] = load [[INT]], ptr [[SIZE_ADDR]]
|
|
// CHECK-NEXT: [[Y_ALLOCA:%.*]] = alloca i8, {{.*}} [[SIZE]], align 16
|
|
// CHECK-NEXT: call void @llvm.lifetime.start.p0({{(i32|i64)}} -1, ptr [[Y_ALLOCA]])
|
|
// Copy 'x' into 'y'.
|
|
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 2
|
|
// CHECK-NEXT: [[T4:%.*]] = load ptr, ptr [[T3]], align
|
|
// CHECK-arm64e-NEXT: ptrtoint ptr [[T3]] to i64
|
|
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
|
|
// CHECK-NEXT: [[Y:%.*]] = call ptr [[T4]](ptr noalias [[Y_ALLOCA]], ptr noalias [[X:%.*]], ptr %T)
|
|
// Destroy 'y'.
|
|
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 1
|
|
// CHECK-NEXT: [[T4:%.*]] = load ptr, ptr [[T3]], align
|
|
// CHECK-arm64e-NEXT: ptrtoint ptr [[T3]] to i64
|
|
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
|
|
// CHECK-NEXT: call void [[T4]](ptr noalias [[Y_ALLOCA]], ptr %T)
|
|
// Destroy 'x'.
|
|
// CHECK-NEXT: call void [[T4]](ptr noalias [[X]], ptr %T)
|
|
// CHECK-NEXT: call void @llvm.lifetime.end.p0({{(i32|i64)}} -1, ptr [[Y_ALLOCA]])
|
|
// Return.
|
|
// CHECK-NEXT: ret void
|
|
|
|
sil @generic_with_reuse : $@convention(thin) <T> (@in T) -> () {
|
|
bb0(%x : $*T):
|
|
%y = alloc_stack $T
|
|
copy_addr %x to [init] %y : $*T
|
|
destroy_addr %y : $*T
|
|
copy_addr [take] %x to [init] %y : $*T
|
|
destroy_addr %y : $*T
|
|
dealloc_stack %y : $*T
|
|
%0 = tuple ()
|
|
return %0 : $()
|
|
}
|
|
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @generic_with_reuse(ptr noalias %0, ptr %T) {{.*}} {
|
|
// Allocate it.
|
|
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr %T, {{(i32|i64)}} -1
|
|
// CHECK-NEXT: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
|
|
// CHECK-arm64e-NEXT: ptrtoint ptr [[VWT_ADDR]] to i64
|
|
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
|
|
// CHECK-arm64e: [[VWT:%.*]] = inttoptr i64 {{%.*}} to ptr
|
|
// CHECK-NEXT: [[SIZE_ADDR:%.*]] = getelementptr inbounds{{.*}} %swift.vwtable, ptr [[VWT]], i32 0, i32 8
|
|
// CHECK-NEXT: [[SIZE:%.*]] = load [[INT]], ptr [[SIZE_ADDR]]
|
|
// CHECK-NEXT: [[Y_ALLOCA:%.*]] = alloca i8, {{.*}} [[SIZE]], align 16
|
|
// CHECK-NEXT: call void @llvm.lifetime.start.p0({{(i32|i64)}} -1, ptr [[Y_ALLOCA]])
|
|
// Copy 'x' into 'y'.
|
|
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 2
|
|
// CHECK-NEXT: [[T4:%.*]] = load ptr, ptr [[T3]], align
|
|
// CHECK-arm64e-NEXT: ptrtoint ptr [[T3]] to i64
|
|
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
|
|
// CHECK-NEXT: [[Y:%.*]] = call ptr [[T4]](ptr noalias [[Y_ALLOCA]], ptr noalias [[X:%.*]], ptr %T)
|
|
// Destroy 'y'.
|
|
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 1
|
|
// CHECK-NEXT: [[T4:%.*]] = load ptr, ptr [[T3]], align
|
|
// CHECK-arm64e-NEXT: ptrtoint ptr [[T3]] to i64
|
|
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
|
|
// CHECK-NEXT: call void [[T4]](ptr noalias [[Y_ALLOCA]], ptr %T)
|
|
// Copy 'x' into 'y' again, this time as a take.
|
|
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 4
|
|
// CHECK-NEXT: [[T5:%.*]] = load ptr, ptr [[T3]], align
|
|
// CHECK-arm64e-NEXT: ptrtoint ptr [[T3]] to i64
|
|
// CHECK-arm64e-NEXT: call i64 @llvm.ptrauth.blend
|
|
// CHECK-NEXT: call ptr [[T5]](ptr noalias [[Y_ALLOCA]], ptr noalias [[X]], ptr %T)
|
|
// Destroy 'y'.
|
|
// CHECK-NEXT: call void [[T4]](ptr noalias [[Y_ALLOCA]], ptr %T)
|
|
// CHECK-NEXT: call void @llvm.lifetime.end.p0({{(i32|i64)}} -1, ptr [[Y_ALLOCA]])
|
|
// Return.
|
|
// CHECK-NEXT: ret void
|
|
|
|
sil @fixed_size : $@convention(thin) (@in Builtin.Int64) -> () {
|
|
bb0(%x : $*Builtin.Int64):
|
|
%y = alloc_stack $Builtin.Int64
|
|
copy_addr %x to [init] %y : $*Builtin.Int64
|
|
destroy_addr %y : $*Builtin.Int64
|
|
dealloc_stack %y : $*Builtin.Int64
|
|
destroy_addr %x : $*Builtin.Int64
|
|
%0 = tuple ()
|
|
return %0 : $()
|
|
}
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @fixed_size(ptr noalias captures(none) dereferenceable(8) %0)
|
|
// CHECK: [[XBUF:%.*]] = alloca i64
|
|
// CHECK-NEXT: call void @llvm.lifetime.start.p0({{(i32|i64)}} 8, ptr [[XBUF]])
|
|
// CHECK-NEXT: load
|
|
// CHECK-NEXT: store
|
|
// CHECK-NEXT: call void @llvm.lifetime.end.p0({{(i32|i64)}} 8, ptr [[XBUF]])
|
|
|