Skip to content

Commit 8f259ad

Browse files
author
Lukas Markeffsky
committed
add codegen test
1 parent b670293 commit 8f259ad

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed

tests/codegen/vecdeque-drain.rs

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// Check that draining at the front or back doesn't copy memory.
2+
3+
// compile-flags: -O
4+
// ignore-debug: the debug assertions get in the way
5+
6+
#![crate_type = "lib"]
7+
8+
use std::collections::VecDeque;
9+
10+
// CHECK-LABEL: @clear
11+
// CHECK-NOT: call
12+
// CHECK-NOT: br
13+
// CHECK: getelementptr inbounds
14+
// CHECK-NEXT: {{call void @llvm.memset|store}}
15+
// CHECK-NEXT: ret void
16+
#[no_mangle]
17+
pub fn clear(v: &mut VecDeque<i32>) {
18+
v.drain(..);
19+
}
20+
21+
// CHECK-LABEL: @truncate
22+
// CHECK-NOT: call
23+
// CHECK: br
24+
// CHECK-NOT: call
25+
// CHECK: br
26+
// CHECK-NOT: call
27+
// CHECK: br
28+
// CHECK-NOT: call
29+
// CHECK: br
30+
// CHECK-NOT: call
31+
// CHECK-NOT: br
32+
// CHECK: ret void
33+
#[no_mangle]
34+
pub fn truncate(v: &mut VecDeque<i32>, n: usize) {
35+
if n < v.len() {
36+
v.drain(n..);
37+
}
38+
}
39+
40+
// CHECK-LABEL: @advance
41+
// CHECK-NOT: call
42+
// CHECK: br
43+
// CHECK-NOT: call
44+
// CHECK: br
45+
// CHECK-NOT: call
46+
// CHECK: br
47+
// CHECK-NOT: call
48+
// CHECK: br
49+
// CHECK-NOT: call
50+
// CHECK: br
51+
// CHECK-NOT: call
52+
// CHECK-NOT: br
53+
// CHECK: ret void
54+
#[no_mangle]
55+
pub fn advance(v: &mut VecDeque<i32>, n: usize) {
56+
if n < v.len() {
57+
v.drain(..n);
58+
} else {
59+
v.clear();
60+
}
61+
}
62+
63+
// CHECK-LABEL: @remove
64+
// CHECK: call
65+
// CHECK: ret void
66+
#[no_mangle]
67+
pub fn remove(v: &mut VecDeque<i32>, a: usize, b: usize) {
68+
v.drain(a..b);
69+
}

0 commit comments

Comments
 (0)