| //@ compile-flags: -O -Zmir-opt-level=2 | |
| //@ ignore-std-debug-assertions (there's one in `ptr::read`) | |
| #![crate_type = "lib"] | |
| // EMIT_MIR unaligned.unaligned_copy_manual.runtime-optimized.after.mir | |
| pub unsafe fn unaligned_copy_manual(src: *const u128, dst: *mut u128) { | |
| #[repr(packed)] | |
| struct Packed<T>(T); | |
| // CHECK-LABEL: fn unaligned_copy_manual(_1: *const u128, _2: *mut u128) -> () | |
| // CHECK: [[SRCU:_.+]] = copy _1 as *const unaligned_copy_manual::Packed<u128> (PtrToPtr); | |
| // CHECK: [[DSTU:_.+]] = copy _2 as *mut unaligned_copy_manual::Packed<u128> (PtrToPtr); | |
| // CHECK: [[TEMP:_.+]] = copy ((*[[SRCU]]).0: u128); | |
| // ((*[[DSTU]]).0: u128) = move [[TEMP]]; | |
| let src = src.cast::<Packed<u128>>(); | |
| let dst = dst.cast::<Packed<u128>>(); | |
| unsafe { (*dst).0 = (*src).0 }; | |
| } | |
| // EMIT_MIR unaligned.unaligned_copy_generic.runtime-optimized.after.mir | |
| pub unsafe fn unaligned_copy_generic<T>(src: *const T, dst: *mut T) { | |
| // CHECK-LABEL: fn unaligned_copy_generic( | |
| // CHECK: debug src => _1; | |
| // CHECK: debug dst => _2; | |
| // CHECK: debug val => [[VAL:_.+]]; | |
| // CHECK: [[SRC_P:_.+]] = copy _1 as *const {{.+}}::Unaligned<T> (PtrToPtr); | |
| // CHECK: [[PACKED1:_.+]] = copy (*[[SRC_P]]); | |
| // CHECK: [[VAL]] = copy [[PACKED1]] as T (Transmute); | |
| // CHECK: [[DST_P:_.+]] = copy _2 as *mut {{.+}}::Unaligned<T> (PtrToPtr); | |
| // CHECK: [[PACKED2:_.+]] = {{.+}}::Unaligned::<T>(copy [[VAL]]); | |
| // CHECK: (*[[DST_P]]) = copy [[PACKED2]]; | |
| // CHECK-NOT: copy_nonoverlapping | |
| // CHECK-NOT: drop | |
| unsafe { | |
| let val = std::ptr::read_unaligned(src); | |
| std::ptr::write_unaligned(dst, val); | |
| } | |
| } |