blob: beba4400dc54af749368befeba739038c5bc9b59 [file] [edit]
//@ compile-flags: -Copt-level=3
//@ only-64bit
#![crate_type = "lib"]
use std::num::NonZero;
use std::ptr::NonNull;
// CHECK-LABEL: nonnull ptr @read_unaligned_ptr(ptr{{.+}}%ptr)
#[no_mangle]
unsafe fn read_unaligned_ptr(ptr: *const NonNull<i16>) -> NonNull<i16> {
// CHECK: start:
// CHECK-NEXT: [[TEMP:%.+]] = load ptr, ptr %ptr, align 1
// CHECK-SAME: !nonnull
// CHECK-SAME: !noundef
// CHECK-NEXT: ret ptr [[TEMP]]
ptr.read_unaligned()
}
// CHECK-LABEL: range(i16 1, 0) i16 @read_unaligned_i16(ptr{{.+}}%ptr)
#[no_mangle]
unsafe fn read_unaligned_i16(ptr: *const NonZero<i16>) -> NonZero<i16> {
// CHECK: start:
// CHECK-NEXT: [[TEMP:%.+]] = load i16, ptr %ptr, align 1
// CHECK-NOT: !noundef
// CHECK-NOT: !range
// CHECK-NEXT: ret i16 [[TEMP]]
ptr.read_unaligned()
}
// CHECK-LABEL: void @typed_copy_unaligned_i32(ptr{{.+}}%src, ptr{{.+}}%dst)
#[no_mangle]
unsafe fn typed_copy_unaligned_i32(src: *const NonZero<i32>, dst: *mut NonZero<i32>) {
// CHECK: start:
// CHECK-NEXT: [[TEMP:%.+]] = load i32, ptr %src, align 1
// CHECK-NOT: !noundef
// CHECK-NOT: !range
// CHECK-NEXT: store i32 [[TEMP]], ptr %dst, align 1
// CHECK-NEXT: ret void
dst.write_unaligned(src.read_unaligned())
}
// CHECK-LABEL: void @write_unaligned_i64(ptr{{.+}}%ptr, i64{{.+}}%val)
#[no_mangle]
unsafe fn write_unaligned_i64(ptr: *mut NonZero<i64>, val: NonZero<i64>) {
// CHECK: start:
// CHECK-NEXT: store i64 %val, ptr %ptr, align 1
// CHECK-NEXT: ret void
ptr.write_unaligned(val)
}
#[repr(align(128))]
struct HugeBuffer([u64; 1 << 10]);
// CHECK-LABEL: void @read_unaligned_huge(ptr{{.+}}%_0, ptr{{.+}}%ptr)
#[no_mangle]
unsafe fn read_unaligned_huge(ptr: *const HugeBuffer) -> HugeBuffer {
// CHECK: start:
// CHECK-NEXT: call void @llvm.memcpy{{.+}} align 128 dereferenceable(8192) %_0, {{.+}} align 1 dereferenceable(8192) %ptr, i64 8192,
// CHECK-NEXT: ret void
ptr.read_unaligned()
}
// CHECK-LABEL: void @write_unaligned_huge(ptr{{.+}}%ptr, ptr{{.+}}%val)
#[no_mangle]
unsafe fn write_unaligned_huge(ptr: *mut HugeBuffer, val: HugeBuffer) {
// CHECK: start:
// CHECK-NEXT: call void @llvm.memcpy{{.+}} align 1 dereferenceable(8192) %ptr, {{.+}} align 128 dereferenceable(8192) %val, i64 8192,
// CHECK-NEXT: ret void
ptr.write_unaligned(val)
}