Skip to content

Commit f29c7b6

Browse files
committed
Precommit test 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 f464759 commit f29c7b6

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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+
// CHECK-LABEL: @get_range
22+
// CHECK-COUNT-2: icmp
23+
// 2 comparisons required: (range.end < slice.len()) && (range.start <= range.end)
24+
// CHECK-LABEL: @index_range
25+
// CHECK-COUNT-2: icmp
26+
// 2 comparisons required: (range.end < slice.len()) && (range.start <= range.end)
27+
tests!(Range<usize>, get_range, index_range);
28+
29+
// CHECK-LABEL: @get_range_to
30+
// CHECK-COUNT-1: icmp
31+
// 1 comparison required: (range.end < slice.len())
32+
// CHECK-LABEL: @index_range_to
33+
// CHECK-COUNT-1: icmp
34+
// 1 comparison required: (range.end < slice.len())
35+
tests!(RangeTo<usize>, get_range_to, index_range_to);
36+
37+
// CHECK-LABEL: @get_range_from
38+
// CHECK-COUNT-1: icmp
39+
// 1 comparison required: (range.start <= slice.len())
40+
// CHECK-LABEL: @index_range_from
41+
// CHECK-COUNT-1: icmp
42+
// 1 comparison required: (range.start <= slice.len())
43+
tests!(RangeFrom<usize>, get_range_from, index_range_from);
44+
45+
// CHECK-LABEL: @get_range_inclusive
46+
// CHECK-COUNT-3: icmp
47+
// 3 comparisons required: (range.end != usize::MAX) && (range.end < slice.len()) && (range.start <= range.end + 1)
48+
// CHECK-LABEL: @index_range_inclusive
49+
// CHECK-COUNT-2: icmp
50+
// 2 comparisons required: (range.end < slice.len()) && (range.start <= range.end + 1)
51+
tests!(RangeInclusive<usize>, get_range_inclusive, index_range_inclusive);
52+
53+
// CHECK-LABEL: @get_range_to_inclusive
54+
// CHECK-COUNT-2: icmp
55+
// 2 comparisons required: (range.end != usize::MAX) && (range.end < slice.len())
56+
// CHECK-LABEL: @index_range_to_inclusive
57+
// CHECK-COUNT-1: icmp
58+
// 1 comparison required: (range.end < slice.len())
59+
tests!(RangeToInclusive<usize>, get_range_to_inclusive, index_range_to_inclusive);

0 commit comments

Comments
 (0)