| //@ 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) |
| } |