Auto merge of #109035 - scottmcm:ptr-read-should-know-undef, r=WaffleLapkin,JakobDegen
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: <341189936
>
cc `@erikdesjardins` `@JakobDegen` `@workingjubilee` `@the8472`
Fixes #106369
Fixes #73258
This commit is contained in:
commit
e4b9f86054
17 changed files with 358 additions and 48 deletions
|
@ -1153,6 +1153,7 @@ symbols! {
|
|||
read_enum_variant_arg,
|
||||
read_struct,
|
||||
read_struct_field,
|
||||
read_via_copy,
|
||||
readonly,
|
||||
realloc,
|
||||
reason,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue