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