diff options
| author | bors <bors@rust-lang.org> | 2025-04-01 21:28:39 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2025-04-01 21:28:39 +0000 |
| commit | 9b7d5ac8180f70110e94f92ccbf8fa2263d24c73 (patch) | |
| tree | cce198e428fef23c04ff18ed73617b8bf8f80dc8 /tests/codegen/slice-last-elements-optimization.rs | |
| parent | e2014e876e3efaa69bf51c19579adb16c3df5f81 (diff) | |
| parent | 99826dd9c79a8603b0f88d0b091cc86d0dec523f (diff) | |
Auto merge of #139220 - matthiaskrgr:rollup-v1un5wz, r=matthiaskrgr
Rollup of 8 pull requests Successful merges: - #110406 (rustdoc-json: Add test for #[automatically_derived] attribute) - #138790 (Note potential but private items in show_candidates) - #139002 (Add release notes for 1.86.0) - #139022 (increment depth of nested obligations) - #139129 (Add tests for slice bounds check optimization) - #139188 (PassWrapper: adapt for llvm/llvm-project@94122d58fc77079a291a3d008914…) - #139193 (Feed HIR for by-move coroutine body def, since the inliner tries to read its attrs) - #139202 (Improve docs of ValTreeKind) r? `@ghost` `@rustbot` modify labels: rollup
Diffstat (limited to 'tests/codegen/slice-last-elements-optimization.rs')
| -rw-r--r-- | tests/codegen/slice-last-elements-optimization.rs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/tests/codegen/slice-last-elements-optimization.rs b/tests/codegen/slice-last-elements-optimization.rs new file mode 100644 index 00000000000..b90f91d7b17 --- /dev/null +++ b/tests/codegen/slice-last-elements-optimization.rs @@ -0,0 +1,37 @@ +//@ compile-flags: -Copt-level=3 +//@ only-x86_64 +//@ min-llvm-version: 20 +#![crate_type = "lib"] + +// This test verifies that LLVM 20 properly optimizes the bounds check +// when accessing the last few elements of a slice with proper conditions. +// Previously, this would generate an unreachable branch to +// slice_start_index_len_fail even when the bounds check was provably safe. + +// CHECK-LABEL: @last_four_initial( +#[no_mangle] +pub fn last_four_initial(s: &[u8]) -> &[u8] { + // Previously this would generate a branch to slice_start_index_len_fail + // that is unreachable. The LLVM 20 fix should eliminate this branch. + // CHECK-NOT: slice_start_index_len_fail + // CHECK-NOT: unreachable + let start = if s.len() <= 4 { 0 } else { s.len() - 4 }; + &s[start..] +} + +// CHECK-LABEL: @last_four_optimized( +#[no_mangle] +pub fn last_four_optimized(s: &[u8]) -> &[u8] { + // This version was already correctly optimized before the fix in LLVM 20. + // CHECK-NOT: slice_start_index_len_fail + // CHECK-NOT: unreachable + if s.len() <= 4 { &s[0..] } else { &s[s.len() - 4..] } +} + +// Just to verify we're correctly checking for the right thing +// CHECK-LABEL: @test_bounds_check_happens( +#[no_mangle] +pub fn test_bounds_check_happens(s: &[u8], i: usize) -> &[u8] { + // CHECK: slice_start_index_len_fail + &s[i..] +} |
