| //! Various iterating method over slice correctly optimized using common subexpression elimination. | |
| //! Checks function has memory(argmem: read) attribute. | |
| //! Regression test for <https://github.com/rust-lang/rust/issues/119573>. | |
| //@ compile-flags: -O | |
| #![crate_type = "lib"] | |
| // CHECK-LABEL: @has_zero_iter | |
| // CHECK-SAME: #[[ATTR:[0-9]+]] | |
| #[inline(never)] | |
| #[unsafe(no_mangle)] | |
| pub fn has_zero_iter(xs: &[u8]) -> bool { | |
| xs.iter().any(|&x| x == 0) | |
| } | |
| // CHECK-LABEL: @has_zero_ptr | |
| // CHECK-SAME: #[[ATTR]] | |
| #[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: @has_zero_for | |
| // CHECK-SAME: #[[ATTR]] | |
| #[inline(never)] | |
| #[unsafe(no_mangle)] | |
| fn has_zero_for(xs: &[u8]) -> bool { | |
| for x in xs { | |
| if *x == 0 { | |
| return true; | |
| } | |
| } | |
| false | |
| } | |
| // CHECK: attributes #[[ATTR]] = { {{.*}}memory(argmem: read){{.*}} } |