blob: 06bcf66e03227001c58aa9323b05c602cdd6926f [file] [log] [blame]
// RUN: %target-swift-frontend %s -emit-ir | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize
import Swift
class C {}
sil_vtable C {}
struct POD {
var x: Int
}
struct BitwiseTakable {
var x: C
}
struct SomeWeak {
var x: C
weak var y: C?
}
// CHECK-LABEL: @_TWVV21array_value_witnesses3POD =
// CHECK-NOT: @_TwXxV21array_value_witnesses3POD
// CHECK: @__swift_noop_void_return
// CHECK-NOT: @_TwCcV21array_value_witnesses3POD
// CHECK-32: @__swift_memcpy_array4_4
// CHECK-64: @__swift_memcpy_array8_8
// CHECK-NOT: @_TwTtV21array_value_witnesses3POD
// CHECK-32: @__swift_memmove_array4_4
// CHECK-64: @__swift_memmove_array8_8
// CHECK-NOT: @_TwtTV21array_value_witnesses3POD
// CHECK-32: @__swift_memmove_array4_4
// CHECK-64: @__swift_memmove_array8_8
// CHECK-LABEL: @_TWVV21array_value_witnesses14BitwiseTakable =
// CHECK: @_TwXxV21array_value_witnesses14BitwiseTakable
// CHECK: @_TwCcV21array_value_witnesses14BitwiseTakable
// CHECK-NOT: @_TwTtV21array_value_witnesses14BitwiseTakable
// CHECK-32: @__swift_memmove_array4_4
// CHECK-64: @__swift_memmove_array8_8
// CHECK-NOT: @_TwtTV21array_value_witnesses14BitwiseTakable
// CHECK-32: @__swift_memmove_array4_4
// CHECK-64: @__swift_memmove_array8_8
// CHECK-LABEL: @_TWVV21array_value_witnesses8SomeWeak =
// CHECK: @_TwXxV21array_value_witnesses8SomeWeak
// CHECK: @_TwCcV21array_value_witnesses8SomeWeak
// CHECK: @_TwTtV21array_value_witnesses8SomeWeak
// CHECK: @_TwtTV21array_value_witnesses8SomeWeak
// CHECK-LABEL: define linkonce_odr hidden void @_TwXxV21array_value_witnesses8SomeWeak
// CHECK: (%swift.opaque* [[ARRAY_PTR:%.*]], [[WORD:i[0-9]+]] [[COUNT:%.*]], %swift.type* %SomeWeak) {{.*}} {
// CHECK: [[BEGIN:%.*]] = bitcast %swift.opaque* [[ARRAY_PTR]] to [[SOMEWEAK:%V21array_value_witnesses8SomeWeak]]*
// CHECK: br label %iter
// CHECK: iter:
// CHECK: [[I:%.*]] = phi [[WORD]] [ [[COUNT]], %entry ], [ [[DEC:%.*]], %loop ]
// CHECK: [[CURRENT:%.*]] = phi [[SOMEWEAK]]* [ [[BEGIN]], %entry ], [ [[NEXT:%.*]], %loop ]
// CHECK: [[DONE:%.*]] = icmp eq [[WORD]] [[I]], 0
// CHECK: br i1 [[DONE]], label %exit, label %loop
// CHECK: loop:
// CHECK: [[WEAK:%.*]] = getelementptr inbounds [[SOMEWEAK]], [[SOMEWEAK]]* [[CURRENT]], i32 0, i32 1
// CHECK: call void @swift_weakDestroy(%swift.weak* [[WEAK]])
// CHECK: [[DEC]] = sub [[WORD]] [[I]], 1
// CHECK: [[NEXT]] = getelementptr inbounds [[SOMEWEAK]], [[SOMEWEAK]]* [[CURRENT]], [[WORD]] 1
// CHECK: br label %iter
// CHECK: exit:
// CHECK: ret
// CHECK-LABEL: define linkonce_odr hidden %swift.opaque* @_TwCcV21array_value_witnesses8SomeWeak
// CHECK: (%swift.opaque* [[DEST_PTR:%.*]], %swift.opaque* [[SRC_PTR:%.*]], [[WORD:i[0-9]+]] [[COUNT:%.*]], %swift.type* %SomeWeak) {{.*}} {
// CHECK: [[DEST_BEGIN:%.*]] = bitcast %swift.opaque* [[DEST_PTR]] to [[SOMEWEAK]]*
// CHECK: [[SRC_BEGIN:%.*]] = bitcast %swift.opaque* [[SRC_PTR]] to [[SOMEWEAK]]*
// CHECK: br label %iter
// CHECK: iter:
// CHECK: [[I:%.*]] = phi [[WORD]] [ [[COUNT]], %entry ], [ [[DEC:%.*]], %loop ]
// CHECK: [[DEST_CURRENT:%.*]] = phi [[SOMEWEAK]]* [ [[DEST_BEGIN]], %entry ], [ [[DEST_NEXT:%.*]], %loop ]
// CHECK: [[SRC_CURRENT:%.*]] = phi [[SOMEWEAK]]* [ [[SRC_BEGIN]], %entry ], [ [[SRC_NEXT:%.*]], %loop ]
// CHECK: [[DONE:%.*]] = icmp eq [[WORD]] [[I]], 0
// CHECK: br i1 [[DONE]], label %exit, label %loop
// CHECK: loop:
// CHECK: [[DEST_WEAK:%.*]] = getelementptr inbounds [[SOMEWEAK]], [[SOMEWEAK]]* [[DEST_CURRENT]], i32 0, i32 1
// CHECK: [[SRC_WEAK:%.*]] = getelementptr inbounds [[SOMEWEAK]], [[SOMEWEAK]]* [[SRC_CURRENT]], i32 0, i32 1
// CHECK: call void @swift_weakCopyInit(%swift.weak* [[DEST_WEAK]], %swift.weak* [[SRC_WEAK]])
// CHECK: [[DEC]] = sub [[WORD]] [[I]], 1
// CHECK: [[DEST_NEXT]] = getelementptr inbounds [[SOMEWEAK]], [[SOMEWEAK]]* [[DEST_CURRENT]], [[WORD]] 1
// CHECK: [[SRC_NEXT]] = getelementptr inbounds [[SOMEWEAK]], [[SOMEWEAK]]* [[SRC_CURRENT]], [[WORD]] 1
// CHECK: br label %iter
// CHECK: exit:
// CHECK: ret
// CHECK-LABEL: define linkonce_odr hidden %swift.opaque* @_TwTtV21array_value_witnesses8SomeWeak
// CHECK: (%swift.opaque* [[DEST_PTR:%.*]], %swift.opaque* [[SRC_PTR:%.*]], [[WORD:i[0-9]+]] [[COUNT:%.*]], %swift.type* %SomeWeak) {{.*}} {
// CHECK: [[DEST_BEGIN:%.*]] = bitcast %swift.opaque* [[DEST_PTR]] to [[SOMEWEAK]]*
// CHECK: [[SRC_BEGIN:%.*]] = bitcast %swift.opaque* [[SRC_PTR]] to [[SOMEWEAK]]*
// CHECK: br label %iter
// CHECK: iter:
// CHECK: [[I:%.*]] = phi [[WORD]] [ [[COUNT]], %entry ], [ [[DEC:%.*]], %loop ]
// CHECK: [[DEST_CURRENT:%.*]] = phi [[SOMEWEAK]]* [ [[DEST_BEGIN]], %entry ], [ [[DEST_NEXT:%.*]], %loop ]
// CHECK: [[SRC_CURRENT:%.*]] = phi [[SOMEWEAK]]* [ [[SRC_BEGIN]], %entry ], [ [[SRC_NEXT:%.*]], %loop ]
// CHECK: [[DONE:%.*]] = icmp eq [[WORD]] [[I]], 0
// CHECK: br i1 [[DONE]], label %exit, label %loop
// CHECK: loop:
// CHECK: [[DEST_WEAK:%.*]] = getelementptr inbounds [[SOMEWEAK]], [[SOMEWEAK]]* [[DEST_CURRENT]], i32 0, i32 1
// CHECK: [[SRC_WEAK:%.*]] = getelementptr inbounds [[SOMEWEAK]], [[SOMEWEAK]]* [[SRC_CURRENT]], i32 0, i32 1
// CHECK: call void @swift_weakTakeInit(%swift.weak* [[DEST_WEAK]], %swift.weak* [[SRC_WEAK]])
// CHECK: [[DEC]] = sub [[WORD]] [[I]], 1
// CHECK: [[DEST_NEXT]] = getelementptr inbounds [[SOMEWEAK]], [[SOMEWEAK]]* [[DEST_CURRENT]], [[WORD]] 1
// CHECK: [[SRC_NEXT]] = getelementptr inbounds [[SOMEWEAK]], [[SOMEWEAK]]* [[SRC_CURRENT]], [[WORD]] 1
// CHECK: br label %iter
// CHECK: exit:
// CHECK: ret
// CHECK-LABEL: define linkonce_odr hidden %swift.opaque* @_TwtTV21array_value_witnesses8SomeWeak
// CHECK: (%swift.opaque* [[DEST_PTR:%.*]], %swift.opaque* [[SRC_PTR:%.*]], [[WORD:i[0-9]+]] [[COUNT:%.*]], %swift.type* %SomeWeak) {{.*}} {
// CHECK: [[DEST_BEGIN:%.*]] = bitcast %swift.opaque* [[DEST_PTR]] to [[SOMEWEAK]]*
// CHECK: [[SRC_BEGIN:%.*]] = bitcast %swift.opaque* [[SRC_PTR]] to [[SOMEWEAK]]*
// CHECK: [[DEST_END:%.*]] = getelementptr inbounds [[SOMEWEAK]], [[SOMEWEAK]]* [[DEST_BEGIN]], [[WORD]] [[COUNT]]
// CHECK: [[SRC_END:%.*]] = getelementptr inbounds [[SOMEWEAK]], [[SOMEWEAK]]* [[SRC_BEGIN]], [[WORD]] [[COUNT]]
// CHECK: br label %iter
// CHECK: iter:
// CHECK: [[I:%.*]] = phi [[WORD]] [ [[COUNT]], %entry ], [ [[DEC:%.*]], %loop ]
// CHECK: [[DEST_PREV:%.*]] = phi [[SOMEWEAK]]* [ [[DEST_END]], %entry ], [ [[DEST_CURRENT:%.*]], %loop ]
// CHECK: [[SRC_PREV:%.*]] = phi [[SOMEWEAK]]* [ [[SRC_END]], %entry ], [ [[SRC_CURRENT:%.*]], %loop ]
// CHECK: [[DONE:%.*]] = icmp eq [[WORD]] [[I]], 0
// CHECK: br i1 [[DONE]], label %exit, label %loop
// CHECK: loop:
// CHECK: [[DEST_CURRENT]] = getelementptr inbounds [[SOMEWEAK]], [[SOMEWEAK]]* [[DEST_PREV]], [[WORD]] -1
// CHECK: [[SRC_CURRENT]] = getelementptr inbounds [[SOMEWEAK]], [[SOMEWEAK]]* [[SRC_PREV]], [[WORD]] -1
// CHECK: [[DEST_WEAK:%.*]] = getelementptr inbounds [[SOMEWEAK]], [[SOMEWEAK]]* [[DEST_CURRENT]], i32 0, i32 1
// CHECK: [[SRC_WEAK:%.*]] = getelementptr inbounds [[SOMEWEAK]], [[SOMEWEAK]]* [[SRC_CURRENT]], i32 0, i32 1
// CHECK: call void @swift_weakTakeInit(%swift.weak* [[DEST_WEAK]], %swift.weak* [[SRC_WEAK]])
// CHECK: [[DEC]] = sub [[WORD]] [[I]], 1
// CHECK: br label %iter
// CHECK: exit:
// CHECK: ret