From 0783f4af9ecc21eaaad4ebeec00c80c7010c193a Mon Sep 17 00:00:00 2001 From: is57primenumber <58158444+is57primenumber@users.noreply.github.com> Date: Wed, 17 Dec 2025 02:30:19 +0900 Subject: [PATCH] add CSE optimization tests for iterating over slice --- tests/assembly-llvm/slice_cse_optimization.rs | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 tests/assembly-llvm/slice_cse_optimization.rs diff --git a/tests/assembly-llvm/slice_cse_optimization.rs b/tests/assembly-llvm/slice_cse_optimization.rs new file mode 100644 index 0000000000000..5ee253988fa3d --- /dev/null +++ b/tests/assembly-llvm/slice_cse_optimization.rs @@ -0,0 +1,102 @@ +//! Various iterating method over slice correctly optimized using common subexpression elimination. +//! Regression test for . +//@ assembly-output: emit-asm +//@ compile-flags: -O +//@ only-x86_64 + +#![crate_type = "lib"] +#[inline(never)] +#[unsafe(no_mangle)] +fn has_zero_index(xs: &[u8]) -> bool { + for i in 0..xs.len() { + if xs[i] == 0 { + return true; + } + } + false +} + +// CHECK-LABEL: foo_index +// CHECK: {{(movq|callq)}} {{\*?}}has_zero_index +// CHECK-NOT: {{(movq|callq)}} {{\*?}}has_zero_index +#[unsafe(no_mangle)] +fn foo_index(xs: &[u8]) { + println!("a0: {}", has_zero_index(xs)); + println!("b0: {}", has_zero_index(xs)); +} + +#[inline(never)] +#[unsafe(no_mangle)] +fn has_zero_for(xs: &[u8]) -> bool { + for x in xs { + if *x == 0 { + return true; + } + } + false +} + +// CHECK-LABEL: foo_for +// CHECK: {{(movq|callq)}} {{\*?}}has_zero_for +// CHECK-NOT: {{(movq|callq)}} {{\*?}}has_zero_for +#[unsafe(no_mangle)] +fn foo_for(xs: &[u8]) { + println!("a1: {}", has_zero_for(xs)); + println!("b1: {}", has_zero_for(xs)); +} + +#[inline(never)] +#[unsafe(no_mangle)] +fn has_zero_memchr(xs: &[u8]) -> bool { + xs.contains(&0) +} + +// CHECK-LABEL: foo_memchr +// CHECK: {{(movq|callq)}} {{\*?}}has_zero_memchr +// CHECK-NOT: {{(movq|callq)}} {{\*?}}has_zero_memchr +#[unsafe(no_mangle)] +fn foo_memchr(xs: &[u8]) { + println!("a2: {}", has_zero_memchr(xs)); + println!("b2: {}", has_zero_memchr(xs)); +} + +#[inline(never)] +#[unsafe(no_mangle)] +fn has_zero_iter(xs: &[u8]) -> bool { + xs.iter().any(|&x| x == 0) +} + +// CHECK-LABEL: foo_iter +// CHECK: {{(movq|callq)}} {{\*?}}has_zero_iter +// CHECK-NOT: {{(movq|callq)}} {{\*?}}has_zero_iter +#[unsafe(no_mangle)] +fn foo_iter(xs: &[u8]) { + println!("a3: {}", has_zero_iter(xs)); + println!("b3: {}", has_zero_iter(xs)); +} + +#[inline(never)] +#[unsafe(no_mangle)] +fn has_zero_ptr(xs: &[u8]) -> bool { + let range = xs.as_ptr_range(); + let mut start = range.start; + let end = range.end; + while start < end { + unsafe { + if *start == 0 { + return true; + } + start = start.add(1); + } + } + false +} + +// CHECK-LABEL: foo_ptr +// CHECK: {{(movq|callq)}} {{\*?}}has_zero_ptr +// CHECK-NOT: {{(movq|callq)}} {{\*?}}has_zero_ptr +#[unsafe(no_mangle)] +fn foo_ptr(xs: &[u8]) { + println!("a4: {}", has_zero_ptr(xs)); + println!("b4: {}", has_zero_ptr(xs)); +}