Skip to content

Commit 346e5b0

Browse files
committed
Precommit tests for SliceIndex method codegen
Add a `codegen-llvm` test to check the number of `icmp` instrucitons generated for each `SliceIndex` method on the various range types. This will be updated in the next commit when `SliceIndex::get` is optimized for `RangeInclusive`.
1 parent c6efb90 commit 346e5b0

File tree

2 files changed

+158
-0
lines changed

2 files changed

+158
-0
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
//@ compile-flags: -Copt-level=3
2+
3+
#![crate_type = "lib"]
4+
5+
use std::ops::{Range, RangeFrom, RangeInclusive, RangeTo, RangeToInclusive};
6+
7+
macro_rules! tests {
8+
($range_ty:ty, $get_func_name:ident, $index_func_name:ident) => {
9+
#[no_mangle]
10+
pub fn $get_func_name(slice: &[u32], range: $range_ty) -> Option<&[u32]> {
11+
slice.get(range)
12+
}
13+
14+
#[no_mangle]
15+
pub fn $index_func_name(slice: &[u32], range: $range_ty) -> &[u32] {
16+
&slice[range]
17+
}
18+
};
19+
}
20+
21+
// 2 comparisons required: (range.end < slice.len()) && (range.start <= range.end)
22+
// CHECK-LABEL: @get_range
23+
// CHECK-COUNT-2: %{{.+}} = icmp
24+
// CHECK-NOT: %{{.+}} = icmp
25+
// CHECK: ret
26+
27+
// 2 comparisons required: (range.end < slice.len()) && (range.start <= range.end)
28+
// CHECK-LABEL: @index_range
29+
// CHECK-COUNT-2: %{{.+}} = icmp
30+
// CHECK-NOT: %{{.+}} = icmp
31+
// CHECK: ret
32+
tests!(Range<usize>, get_range, index_range);
33+
34+
// 1 comparison required: (range.end < slice.len())
35+
// CHECK-LABEL: @get_range_to
36+
// CHECK-COUNT-1: %{{.+}} = icmp
37+
// CHECK-NOT: %{{.+}} = icmp
38+
// CHECK: ret
39+
40+
// 1 comparison required: (range.end < slice.len())
41+
// CHECK-LABEL: @index_range_to
42+
// CHECK-COUNT-1: %{{.+}} = icmp
43+
// CHECK-NOT: %{{.+}} = icmp
44+
// CHECK: ret
45+
tests!(RangeTo<usize>, get_range_to, index_range_to);
46+
47+
// 1 comparison required: (range.start <= slice.len())
48+
// CHECK-LABEL: @get_range_from
49+
// CHECK-COUNT-1: %{{.+}} = icmp
50+
// CHECK-NOT: %{{.+}} = icmp
51+
// CHECK: ret
52+
53+
// 1 comparison required: (range.start <= slice.len())
54+
// CHECK-LABEL: @index_range_from
55+
// CHECK-COUNT-1: %{{.+}} = icmp
56+
// CHECK-NOT: %{{.+}} = icmp
57+
// CHECK: ret
58+
tests!(RangeFrom<usize>, get_range_from, index_range_from);
59+
60+
// 3 comparisons required: (range.end != usize::MAX) && (range.end < slice.len()) && (range.start <= range.end + 1)
61+
// CHECK-LABEL: @get_range_inclusive
62+
// CHECK-COUNT-3: %{{.+}} = icmp
63+
// CHECK-NOT: %{{.+}} = icmp
64+
// CHECK: ret
65+
66+
// 2 comparisons required: (range.end < slice.len()) && (range.start <= range.end + 1)
67+
// CHECK-LABEL: @index_range_inclusive
68+
// CHECK-COUNT-2: %{{.+}} = icmp
69+
// CHECK-NOT: %{{.+}} = icmp
70+
// CHECK: ret
71+
tests!(RangeInclusive<usize>, get_range_inclusive, index_range_inclusive);
72+
73+
// 2 comparisons required: (range.end != usize::MAX) && (range.end < slice.len())
74+
// CHECK-LABEL: @get_range_to_inclusive
75+
// CHECK-COUNT-2: %{{.+}} = icmp
76+
// CHECK-NOT: %{{.+}} = icmp
77+
// CHECK: ret
78+
79+
// 1 comparison required: (range.end < slice.len())
80+
// CHECK-LABEL: @index_range_to_inclusive
81+
// CHECK-COUNT-1: %{{.+}} = icmp
82+
// CHECK-NOT: %{{.+}} = icmp
83+
// CHECK: ret
84+
tests!(RangeToInclusive<usize>, get_range_to_inclusive, index_range_to_inclusive);
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
//@ compile-flags: -Copt-level=3
2+
3+
#![crate_type = "lib"]
4+
5+
use std::ops::{Range, RangeFrom, RangeInclusive, RangeTo, RangeToInclusive};
6+
7+
macro_rules! tests {
8+
($range_ty:ty, $get_func_name:ident, $index_func_name:ident) => {
9+
#[no_mangle]
10+
pub fn $get_func_name(slice: &str, range: $range_ty) -> Option<&str> {
11+
slice.get(range)
12+
}
13+
14+
#[no_mangle]
15+
pub fn $index_func_name(slice: &str, range: $range_ty) -> &str {
16+
&slice[range]
17+
}
18+
};
19+
}
20+
21+
// CHECK-LABEL: @get_range
22+
// CHECK-COUNT-9: %{{.+}} = icmp
23+
// CHECK-NOT: %{{.+}} = icmp
24+
// CHECK: ret
25+
26+
// CHECK-LABEL: @index_range
27+
// CHECK-COUNT-9: %{{.+}} = icmp
28+
// CHECK-NOT: %{{.+}} = icmp
29+
// CHECK: ret
30+
tests!(Range<usize>, get_range, index_range);
31+
32+
// CHECK-LABEL: @get_range_to
33+
// CHECK-COUNT-4: %{{.+}} = icmp
34+
// CHECK-NOT: %{{.+}} = icmp
35+
// CHECK: ret
36+
37+
// CHECK-LABEL: @index_range_to
38+
// CHECK-COUNT-4: %{{.+}} = icmp
39+
// CHECK-NOT: %{{.+}} = icmp
40+
// CHECK: ret
41+
tests!(RangeTo<usize>, get_range_to, index_range_to);
42+
43+
// CHECK-LABEL: @get_range_from
44+
// CHECK-COUNT-4: %{{.+}} = icmp
45+
// CHECK-NOT: %{{.+}} = icmp
46+
// CHECK: ret
47+
48+
// CHECK-LABEL: @index_range_from
49+
// CHECK-COUNT-4: %{{.+}} = icmp
50+
// CHECK-NOT: %{{.+}} = icmp
51+
// CHECK: ret
52+
tests!(RangeFrom<usize>, get_range_from, index_range_from);
53+
54+
// CHECK-LABEL: @get_range_inclusive
55+
// CHECK-COUNT-9: %{{.+}} = icmp
56+
// CHECK-NOT: %{{.+}} = icmp
57+
// CHECK: ret
58+
59+
// CHECK-LABEL: @index_range_inclusive
60+
// CHECK-COUNT-9: %{{.+}} = icmp
61+
// CHECK-NOT: %{{.+}} = icmp
62+
// CHECK: ret
63+
tests!(RangeInclusive<usize>, get_range_inclusive, index_range_inclusive);
64+
65+
// CHECK-LABEL: @get_range_to_inclusive
66+
// CHECK-COUNT-4: %{{.+}} = icmp
67+
// CHECK-NOT: %{{.+}} = icmp
68+
// CHECK: ret
69+
70+
// CHECK-LABEL: @index_range_to_inclusive
71+
// CHECK-COUNT-4: %{{.+}} = icmp
72+
// CHECK-NOT: %{{.+}} = icmp
73+
// CHECK: ret
74+
tests!(RangeToInclusive<usize>, get_range_to_inclusive, index_range_to_inclusive);

0 commit comments

Comments
 (0)