Skip to content

Commit 8f969ed

Browse files
committed
Optimize copy_undef_mask() to use one pass
This saves 0.5 seconds on the test compilation.
1 parent 1ffa99d commit 8f969ed

File tree

1 file changed

+8
-17
lines changed

1 file changed

+8
-17
lines changed

src/librustc_mir/interpret/memory.rs

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -882,25 +882,16 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'a, 'mir, 'tcx, M> {
882882
) -> EvalResult<'tcx> {
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());
885-
let mut v = Vec::with_capacity(size.bytes() as usize);
886885

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-
}
893-
}
886+
let undef_mask = self.get(src.alloc_id)?.undef_mask.clone();
887+
let dest_allocation = self.get_mut(dest.alloc_id)?;
894888

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-
}
889+
for i in 0..size.bytes() {
890+
let defined = undef_mask.get(src.offset + Size::from_bytes(i));
891+
dest_allocation.undef_mask.set(
892+
dest.offset + Size::from_bytes(i),
893+
defined
894+
);
904895
}
905896

906897
Ok(())

0 commit comments

Comments
 (0)