mirror of
https://github.com/rust-lang/rust.git
synced 2026-07-17 13:16:20 -04:00
72 lines
2.3 KiB
Rust
72 lines
2.3 KiB
Rust
//@ 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)
|
|
}
|