b2c717fa33
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>`. Turned out to be a more general problem as `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. This PR lowers `ptr::read(p)` to `copy *p` in MIR, which fortuitiously also improves the IR we give to LLVM for things like `mem::replace`.
28 lines
1.5 KiB
Diff
28 lines
1.5 KiB
Diff
- // MIR for `read_via_copy_primitive` before LowerIntrinsics
|
|
+ // MIR for `read_via_copy_primitive` after LowerIntrinsics
|
|
|
|
fn read_via_copy_primitive(_1: &i32) -> i32 {
|
|
debug r => _1; // in scope 0 at $DIR/lower_intrinsics.rs:+0:32: +0:33
|
|
let mut _0: i32; // return place in scope 0 at $DIR/lower_intrinsics.rs:+0:44: +0:47
|
|
let mut _2: *const i32; // in scope 0 at $DIR/lower_intrinsics.rs:+1:46: +1:47
|
|
scope 1 {
|
|
}
|
|
|
|
bb0: {
|
|
StorageLive(_2); // scope 1 at $DIR/lower_intrinsics.rs:+1:46: +1:47
|
|
_2 = &raw const (*_1); // scope 1 at $DIR/lower_intrinsics.rs:+1:46: +1:47
|
|
- _0 = read_via_copy::<i32>(move _2) -> bb1; // scope 1 at $DIR/lower_intrinsics.rs:+1:14: +1:48
|
|
- // mir::Constant
|
|
- // + span: $DIR/lower_intrinsics.rs:85:14: 85:45
|
|
- // + literal: Const { ty: unsafe extern "rust-intrinsic" fn(*const i32) -> i32 {read_via_copy::<i32>}, val: Value(<ZST>) }
|
|
+ _0 = (*_2); // scope 1 at $DIR/lower_intrinsics.rs:+1:14: +1:48
|
|
+ goto -> bb1; // scope 1 at $DIR/lower_intrinsics.rs:+1:14: +1:48
|
|
}
|
|
|
|
bb1: {
|
|
StorageDead(_2); // scope 1 at $DIR/lower_intrinsics.rs:+1:47: +1:48
|
|
return; // scope 0 at $DIR/lower_intrinsics.rs:+2:2: +2:2
|
|
}
|
|
}
|
|
|