Skip to content

Commit 4d2bab8

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 4d2bab8

File tree

2 files changed

+160
-0
lines changed

2 files changed

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

0 commit comments

Comments
 (0)