about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/tools/miri/bench-cargo-miri/slice-chunked/Cargo.lock7
-rw-r--r--src/tools/miri/bench-cargo-miri/slice-chunked/Cargo.toml8
-rw-r--r--src/tools/miri/bench-cargo-miri/slice-chunked/src/main.rs26
3 files changed, 41 insertions, 0 deletions
diff --git a/src/tools/miri/bench-cargo-miri/slice-chunked/Cargo.lock b/src/tools/miri/bench-cargo-miri/slice-chunked/Cargo.lock
new file mode 100644
index 00000000000..0f9e5db52d6
--- /dev/null
+++ b/src/tools/miri/bench-cargo-miri/slice-chunked/Cargo.lock
@@ -0,0 +1,7 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "slice-chunked"
+version = "0.1.0"
diff --git a/src/tools/miri/bench-cargo-miri/slice-chunked/Cargo.toml b/src/tools/miri/bench-cargo-miri/slice-chunked/Cargo.toml
new file mode 100644
index 00000000000..8fed6ad2f31
--- /dev/null
+++ b/src/tools/miri/bench-cargo-miri/slice-chunked/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "slice-chunked"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
diff --git a/src/tools/miri/bench-cargo-miri/slice-chunked/src/main.rs b/src/tools/miri/bench-cargo-miri/slice-chunked/src/main.rs
new file mode 100644
index 00000000000..b498c8bec75
--- /dev/null
+++ b/src/tools/miri/bench-cargo-miri/slice-chunked/src/main.rs
@@ -0,0 +1,26 @@
+//! This is a small example using slice::chunks, which creates a very large Tree Borrows tree.
+//! Thanks to ##3837, the GC now compacts the tree, so this test can be run in a reasonable time again.
+//! The actual code is adapted from tiny_skia, see https://github.com/RazrFalcon/tiny-skia/blob/master/src/pixmap.rs#L121
+//! To make this benchmark demonstrate the effectiveness, run with MIRIFLAGS="-Zmiri-tree-borrows -Zmiri-provenance-gc=100"
+
+const N: usize = 1000;
+
+fn input_vec() -> Vec<u8> {
+    vec![0; N]
+}
+
+fn main() {
+    let data_len = 2 * N;
+    let mut rgba_data = Vec::with_capacity(data_len);
+    let img_data = input_vec();
+    for slice in img_data.chunks(2) {
+        let gray = slice[0];
+        let alpha = slice[1];
+        rgba_data.push(gray);
+        rgba_data.push(gray);
+        rgba_data.push(gray);
+        rgba_data.push(alpha);
+    }
+
+    assert_eq!(rgba_data.len(), data_len);
+}