From fd2e542110d108cdd1d57791b403d4d4e5c0f4e4 Mon Sep 17 00:00:00 2001 From: DaniPopes <57450786+DaniPopes@users.noreply.github.com> Date: Sun, 12 Apr 2026 10:17:51 +0200 Subject: [PATCH] Add regression test for issue 144329 --- .../issue-144329-niched-option-check.rs | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 tests/codegen-llvm/issues/issue-144329-niched-option-check.rs diff --git a/tests/codegen-llvm/issues/issue-144329-niched-option-check.rs b/tests/codegen-llvm/issues/issue-144329-niched-option-check.rs new file mode 100644 index 000000000000..4f80608e7d34 --- /dev/null +++ b/tests/codegen-llvm/issues/issue-144329-niched-option-check.rs @@ -0,0 +1,64 @@ +//! Ensure that redundant null checks on `&mut T` from `Option<(_, &mut T)>` are eliminated. + +//@ compile-flags: -Copt-level=3 + +#![crate_type = "lib"] + +type T = [u64; 4]; + +// CHECK-LABEL: @f0( +#[no_mangle] +pub fn f0(stack: &mut Stack, f: fn(&T)) -> bool { + // CHECK-NOT: icmp eq ptr.*null.* + f_impl::<0>(stack, f) +} + +// CHECK-LABEL: @f1( +#[no_mangle] +pub fn f1(stack: &mut Stack, f: fn(&T)) -> bool { + // CHECK-NOT: icmp eq ptr.*null.* + f_impl::<1>(stack, f) +} + +// CHECK-LABEL: @f2( +#[no_mangle] +pub fn f2(stack: &mut Stack, f: fn(&T)) -> bool { + // CHECK-NOT: icmp eq ptr.*null.* + f_impl::<2>(stack, f) +} + +#[inline(always)] +fn f_impl(stack: &mut Stack, f: fn(&T)) -> bool { + let Some((a, b)) = stack.popn_top::() else { + return false; + }; + a.iter().for_each(f); + f(b); + true +} + +pub struct Stack { + data: Vec, +} + +impl Stack { + #[inline] + fn popn_top(&mut self) -> Option<([T; N], &mut T)> { + if self.data.len() < N + 1 { + return None; + } + unsafe { Some((self.popn_unchecked(), self.top_unchecked())) } + } + + unsafe fn popn_unchecked(&mut self) -> [T; N] { + core::array::from_fn(|_| unsafe { self.pop_unchecked() }) + } + + unsafe fn pop_unchecked(&mut self) -> T { + self.data.pop().unwrap_unchecked() + } + + unsafe fn top_unchecked(&mut self) -> &mut T { + self.data.last_mut().unwrap_unchecked() + } +}