Skip to content

Commit 1ffa99d

Browse files
committed
Optimize copy_undef_mask() by lifting some loop invariant operations
This saves 4.5 seconds and takes the compile time down to 5.5 seconds.
1 parent 429bc8d commit 1ffa99d

File tree

1 file changed

+18
-9
lines changed

1 file changed

+18
-9
lines changed

src/librustc_mir/interpret/memory.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -883,17 +883,26 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'a, 'mir, 'tcx, M> {
883883
// The bits have to be saved locally before writing to dest in case src and dest overlap.
884884
assert_eq!(size.bytes() as usize as u64, size.bytes());
885885
let mut v = Vec::with_capacity(size.bytes() as usize);
886-
for i in 0..size.bytes() {
887-
let defined = self.get(src.alloc_id)?.undef_mask.get(src.offset + Size::from_bytes(i));
888-
v.push(defined);
886+
887+
{
888+
let src_allocation = self.get(src.alloc_id)?;
889+
for i in 0..size.bytes() {
890+
let defined = src_allocation.undef_mask.get(src.offset + Size::from_bytes(i));
891+
v.push(defined);
892+
}
889893
}
890-
for (i, defined) in v.into_iter().enumerate() {
891-
self.get_mut(dest.alloc_id)?.undef_mask.set(
892-
dest.offset +
893-
Size::from_bytes(i as u64),
894-
defined,
895-
);
894+
895+
{
896+
let dest_allocation = self.get_mut(dest.alloc_id)?;
897+
for (i, defined) in v.into_iter().enumerate() {
898+
dest_allocation.undef_mask.set(
899+
dest.offset +
900+
Size::from_bytes(i as u64),
901+
defined,
902+
);
903+
}
896904
}
905+
897906
Ok(())
898907
}
899908

0 commit comments

Comments
 (0)