Skip to content

Commit dee395e

Browse files
committed
patch: fix bench UB and decrease some sizes for Miri
1 parent 35768d0 commit dee395e

File tree

1 file changed

+47
-11
lines changed

1 file changed

+47
-11
lines changed

rust-src.diff

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ index aadb0dc9c40..64bce0ff8c0 100644
2323
assert_eq!(core::mem::size_of::<LeafNode<(), ()>>(), 16);
2424
assert_eq!(core::mem::size_of::<LeafNode<i64, i64>>(), 16 + CAPACITY * 2 * 8);
2525
diff --git a/library/alloc/src/collections/vec_deque/tests.rs b/library/alloc/src/collections/vec_deque/tests.rs
26-
index 1f2daef213c..ebd5bc72fc7 100644
26+
index 1f2daef213c..a103531a20f 100644
2727
--- a/library/alloc/src/collections/vec_deque/tests.rs
2828
+++ b/library/alloc/src/collections/vec_deque/tests.rs
2929
@@ -3,7 +3,6 @@
@@ -42,43 +42,79 @@ index 1f2daef213c..ebd5bc72fc7 100644
4242
fn bench_push_front_100(b: &mut test::Bencher) {
4343
let mut deq = VecDeque::with_capacity(101);
4444
b.iter(|| {
45-
@@ -29,7 +27,6 @@ fn bench_push_front_100(b: &mut test::Bencher) {
45+
@@ -29,12 +27,15 @@ fn bench_push_front_100(b: &mut test::Bencher) {
4646
}
4747

4848
#[bench]
4949
-#[cfg_attr(miri, ignore)] // isolated Miri does not support benchmarks
5050
fn bench_pop_back_100(b: &mut test::Bencher) {
51-
let mut deq = VecDeque::<i32>::with_capacity(101);
51+
- let mut deq = VecDeque::<i32>::with_capacity(101);
52+
+ let size = 100;
53+
+ let mut deq = VecDeque::<i32>::with_capacity(size+1);
54+
+ // We'll mess with private state to pretend like `deq` is filled.
55+
+ // Make sure the buffer is initialized so that we don't read uninit memory.
56+
+ unsafe { deq.ptr().write_bytes(0u8, size+1) };
5257

53-
@@ -43,7 +40,6 @@ fn bench_pop_back_100(b: &mut test::Bencher) {
58+
b.iter(|| {
59+
- deq.head = 100;
60+
+ deq.head = size;
61+
deq.tail = 0;
62+
while !deq.is_empty() {
63+
test::black_box(deq.pop_back());
64+
@@ -43,9 +44,9 @@ fn bench_pop_back_100(b: &mut test::Bencher) {
5465
}
5566

5667
#[bench]
5768
-#[cfg_attr(miri, ignore)] // isolated Miri does not support benchmarks
5869
fn bench_retain_whole_10000(b: &mut test::Bencher) {
59-
let v = (1..100000).collect::<VecDeque<u32>>();
70+
- let v = (1..100000).collect::<VecDeque<u32>>();
71+
+ let size = if cfg!(miri) { 1000 } else { 100000 };
72+
+ let v = (1..size).collect::<VecDeque<u32>>();
6073

61-
@@ -54,7 +50,6 @@ fn bench_retain_whole_10000(b: &mut test::Bencher) {
74+
b.iter(|| {
75+
let mut v = v.clone();
76+
@@ -54,9 +55,9 @@ fn bench_retain_whole_10000(b: &mut test::Bencher) {
6277
}
6378

6479
#[bench]
6580
-#[cfg_attr(miri, ignore)] // isolated Miri does not support benchmarks
6681
fn bench_retain_odd_10000(b: &mut test::Bencher) {
67-
let v = (1..100000).collect::<VecDeque<u32>>();
82+
- let v = (1..100000).collect::<VecDeque<u32>>();
83+
+ let size = if cfg!(miri) { 1000 } else { 100000 };
84+
+ let v = (1..size).collect::<VecDeque<u32>>();
6885

69-
@@ -65,7 +60,6 @@ fn bench_retain_odd_10000(b: &mut test::Bencher) {
86+
b.iter(|| {
87+
let mut v = v.clone();
88+
@@ -65,23 +66,26 @@ fn bench_retain_odd_10000(b: &mut test::Bencher) {
7089
}
7190

7291
#[bench]
7392
-#[cfg_attr(miri, ignore)] // isolated Miri does not support benchmarks
7493
fn bench_retain_half_10000(b: &mut test::Bencher) {
75-
let v = (1..100000).collect::<VecDeque<u32>>();
94+
- let v = (1..100000).collect::<VecDeque<u32>>();
95+
+ let size = if cfg!(miri) { 1000 } else { 100000 };
96+
+ let v = (1..size).collect::<VecDeque<u32>>();
7697

77-
@@ -76,7 +70,6 @@ fn bench_retain_half_10000(b: &mut test::Bencher) {
98+
b.iter(|| {
99+
let mut v = v.clone();
100+
- v.retain(|x| *x > 50000)
101+
+ v.retain(|x| *x > size/2)
102+
})
78103
}
79104

80105
#[bench]
81106
-#[cfg_attr(miri, ignore)] // isolated Miri does not support benchmarks
82107
fn bench_pop_front_100(b: &mut test::Bencher) {
83-
let mut deq = VecDeque::<i32>::with_capacity(101);
108+
- let mut deq = VecDeque::<i32>::with_capacity(101);
109+
+ let size = 100;
110+
+ let mut deq = VecDeque::<i32>::with_capacity(size+1);
111+
+ // We'll mess with private state to pretend like `deq` is filled.
112+
+ // Make sure the buffer is initialized so that we don't read uninit memory.
113+
+ unsafe { deq.ptr().write_bytes(0u8, size+1) };
84114

115+
b.iter(|| {
116+
- deq.head = 100;
117+
+ deq.head = size;
118+
deq.tail = 0;
119+
while !deq.is_empty() {
120+
test::black_box(deq.pop_front());

0 commit comments

Comments
 (0)