e4b9f86054
Ensure `ptr::read` gets all the same LLVM `load` metadata that dereferencing does I was looking into `array::IntoIter` optimization, and noticed that it wasn't annotating the loads with `noundef` for simple things like `array::IntoIter<i32, N>`. Trying to narrow it down, it seems that was because `MaybeUninit::assume_init_read` isn't marking the load as initialized (<https://rust.godbolt.org/z/Mxd8TPTnv>), which is unfortunate since that's basically its reason to exist. The root cause is that `ptr::read` is currently implemented via the *untyped* `copy_nonoverlapping`, and thus the `load` doesn't get any type-aware metadata: no `noundef`, no `!range`. This PR solves that by lowering `ptr::read(p)` to `copy *p` in MIR, for which the backends already do the right thing. Fortuitiously, this also improves the IR we give to LLVM for things like `mem::replace`, and fixes a couple of long-standing bugs where `ptr::read` on `Copy` types was worse than `*`ing them. Zulip conversation: <https://rust-lang.zulipchat.com/#narrow/stream/219381-t-libs/topic/Move.20array.3A.3AIntoIter.20to.20ManuallyDrop/near/341189936> cc `@erikdesjardins` `@JakobDegen` `@workingjubilee` `@the8472` Fixes #106369 Fixes #73258 |
||
---|---|---|
.. | ||
alloc | ||
array | ||
async_iter | ||
cell | ||
char | ||
cmp | ||
convert | ||
ffi | ||
fmt | ||
future | ||
hash | ||
intrinsics | ||
iter | ||
macros | ||
mem | ||
net | ||
num | ||
ops | ||
panic | ||
prelude | ||
ptr | ||
slice | ||
str | ||
sync | ||
task | ||
unicode | ||
any.rs | ||
arch.rs | ||
ascii.rs | ||
asserting.rs | ||
bool.rs | ||
borrow.rs | ||
cell.rs | ||
clone.rs | ||
cmp.rs | ||
default.rs | ||
error.md | ||
error.rs | ||
hint.rs | ||
internal_macros.rs | ||
intrinsics.rs | ||
lib.rs | ||
marker.rs | ||
option.rs | ||
panic.rs | ||
panicking.rs | ||
pin.rs | ||
primitive_docs.rs | ||
primitive.rs | ||
result.rs | ||
time.rs | ||
tuple.rs | ||
unit.rs |