]> git.lizzy.rs Git - rust.git/commitdiff
Optimize `copy_undef_mask()` by lifting some loop invariant operations
authorWesley Wiser <wwiser@gmail.com>
Sat, 30 Jun 2018 00:22:35 +0000 (20:22 -0400)
committerWesley Wiser <wwiser@gmail.com>
Sat, 30 Jun 2018 00:22:35 +0000 (20:22 -0400)
This saves 4.5 seconds and takes the compile time down to 5.5 seconds.

src/librustc_mir/interpret/memory.rs

index 7a547c406a92b465d7e5f3e32c112b19642b6583..49ad4b49b88b70520ff0a3a9af7f8c5e3db97299 100644 (file)
@@ -883,17 +883,26 @@ fn copy_undef_mask(
         // 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);
-        for i in 0..size.bytes() {
-            let defined = self.get(src.alloc_id)?.undef_mask.get(src.offset + Size::from_bytes(i));
-            v.push(defined);
+
+        {
+            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);
+            }
         }
-        for (i, defined) in v.into_iter().enumerate() {
-            self.get_mut(dest.alloc_id)?.undef_mask.set(
-                dest.offset +
-                    Size::from_bytes(i as u64),
-                defined,
-            );
+
+        {
+            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,
+                );
+            }
         }
+
         Ok(())
     }