| //@ 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); |