The checks for `self.end() == usize::MAX` and `self.end() + 1 > slice.len()` can be replaced with `self.end() >= slice.len()`, since `self.end() < slice.len()` implies both `self.end() <= slice.len()` and `self.end() < usize::MAX`.
90 lines
2.2 KiB
Rust
90 lines
2.2 KiB
Rust
//@ compile-flags: -Copt-level=3
|
|
//@ min-llvm-version: 21
|
|
|
|
#![crate_type = "lib"]
|
|
|
|
use std::ops::{Range, RangeFrom, RangeInclusive, RangeTo, RangeToInclusive};
|
|
|
|
macro_rules! tests {
|
|
($range_ty:ty, $get_func_name:ident, $index_func_name:ident) => {
|
|
#[no_mangle]
|
|
pub fn $get_func_name(slice: &[u32], range: $range_ty) -> Option<&[u32]> {
|
|
slice.get(range)
|
|
}
|
|
|
|
#[no_mangle]
|
|
pub fn $index_func_name(slice: &[u32], range: $range_ty) -> &[u32] {
|
|
&slice[range]
|
|
}
|
|
};
|
|
}
|
|
|
|
// 2 comparisons required:
|
|
// end <= len && start <= end
|
|
|
|
// CHECK-LABEL: @get_range
|
|
// CHECK-COUNT-2: %{{.+}} = icmp
|
|
// CHECK-NOT: %{{.+}} = icmp
|
|
// CHECK: ret
|
|
|
|
// CHECK-LABEL: @index_range
|
|
// CHECK-COUNT-2: %{{.+}} = icmp
|
|
// CHECK-NOT: %{{.+}} = icmp
|
|
// CHECK: ret
|
|
tests!(Range<usize>, get_range, index_range);
|
|
|
|
// 2 comparisons required:
|
|
// end < len && start <= end + 1
|
|
|
|
// CHECK-LABEL: @get_range_inclusive
|
|
// CHECK-COUNT-2: %{{.+}} = icmp
|
|
// CHECK-NOT: %{{.+}} = icmp
|
|
// CHECK: ret
|
|
|
|
// CHECK-LABEL: @index_range_inclusive
|
|
// CHECK-COUNT-2: %{{.+}} = icmp
|
|
// CHECK-NOT: %{{.+}} = icmp
|
|
// CHECK: ret
|
|
tests!(RangeInclusive<usize>, get_range_inclusive, index_range_inclusive);
|
|
|
|
// 1 comparison required:
|
|
// end <= len
|
|
|
|
// CHECK-LABEL: @get_range_to
|
|
// CHECK-COUNT-1: %{{.+}} = icmp
|
|
// CHECK-NOT: %{{.+}} = icmp
|
|
// CHECK: ret
|
|
|
|
// CHECK-LABEL: @index_range_to
|
|
// CHECK-COUNT-1: %{{.+}} = icmp
|
|
// CHECK-NOT: %{{.+}} = icmp
|
|
// CHECK: ret
|
|
tests!(RangeTo<usize>, get_range_to, index_range_to);
|
|
|
|
// 1 comparison required:
|
|
// end < len
|
|
|
|
// CHECK-LABEL: @get_range_to_inclusive
|
|
// CHECK-COUNT-1: %{{.+}} = icmp
|
|
// CHECK-NOT: %{{.+}} = icmp
|
|
// CHECK: ret
|
|
|
|
// CHECK-LABEL: @index_range_to_inclusive
|
|
// CHECK-COUNT-1: %{{.+}} = icmp
|
|
// CHECK-NOT: %{{.+}} = icmp
|
|
// CHECK: ret
|
|
tests!(RangeToInclusive<usize>, get_range_to_inclusive, index_range_to_inclusive);
|
|
|
|
// 1 comparison required:
|
|
// start <= len
|
|
|
|
// CHECK-LABEL: @get_range_from
|
|
// CHECK-COUNT-1: %{{.+}} = icmp
|
|
// CHECK-NOT: %{{.+}} = icmp
|
|
// CHECK: ret
|
|
|
|
// CHECK-LABEL: @index_range_from
|
|
// CHECK-COUNT-1: %{{.+}} = icmp
|
|
// CHECK-NOT: %{{.+}} = icmp
|
|
// CHECK: ret
|
|
tests!(RangeFrom<usize>, get_range_from, index_range_from);
|