]> git.lizzy.rs Git - rust.git/commitdiff
Optimize `copy_undef_mask()` to use one pass
authorWesley Wiser <wwiser@gmail.com>
Sat, 30 Jun 2018 02:26:15 +0000 (22:26 -0400)
committerWesley Wiser <wwiser@gmail.com>
Sat, 30 Jun 2018 02:26:15 +0000 (22:26 -0400)
This saves 0.5 seconds on the test compilation.

src/librustc_mir/interpret/memory.rs

index 49ad4b49b88b70520ff0a3a9af7f8c5e3db97299..2f961ef9d97822189cf3e2e0de22c7db77e8b04f 100644 (file)
@@ -882,25 +882,16 @@ fn copy_undef_mask(
     ) -> EvalResult<'tcx> {
         // The bits have to be saved locally before writing to dest in case src and dest overlap.
         assert_eq!(size.bytes() as usize as u64, size.bytes());
-        let mut v = Vec::with_capacity(size.bytes() as usize);
 
-        {
-            let src_allocation = self.get(src.alloc_id)?;
-            for i in 0..size.bytes() {
-                let defined = src_allocation.undef_mask.get(src.offset + Size::from_bytes(i));
-                v.push(defined);
-            }
-        }
+        let undef_mask = self.get(src.alloc_id)?.undef_mask.clone();
+        let dest_allocation = self.get_mut(dest.alloc_id)?;
 
-        {
-            let dest_allocation = self.get_mut(dest.alloc_id)?;
-            for (i, defined) in v.into_iter().enumerate() {
-                dest_allocation.undef_mask.set(
-                    dest.offset +
-                        Size::from_bytes(i as u64),
-                    defined,
-                );
-            }
+        for i in 0..size.bytes() {
+            let defined = undef_mask.get(src.offset + Size::from_bytes(i));
+            dest_allocation.undef_mask.set(
+                dest.offset + Size::from_bytes(i),
+                defined
+            );
         }
 
         Ok(())