diff --git a/tests/codegen-llvm/issues/option-nonzero-zip-map-flatten-asm-perf-issue-81342.rs b/tests/codegen-llvm/issues/option-nonzero-zip-map-flatten-asm-perf-issue-81342.rs new file mode 100644 index 0000000000000..840769b7d4a46 --- /dev/null +++ b/tests/codegen-llvm/issues/option-nonzero-zip-map-flatten-asm-perf-issue-81342.rs @@ -0,0 +1,26 @@ +// Regression tests for https://github.com/rust-lang/rust/issues/81342 +// foo and bar should generate the same, efficient assembly code +//@ compile-flags: -O +#![crate_type = "lib"] + +use std::num::NonZeroUsize; + +// CHECK-LABEL: @foo +// CHECK-COUNT-2: icmp eq i{{[0-9]+}} %{{.*}}, 0 +// CHECK: or i1 +// CHECK: select +// CHECK-NOT: icmp +#[unsafe(no_mangle)] +pub fn foo(x: Option, y: Option) -> Option { + if let (Some(x2), Some(y2)) = (x, y) { NonZeroUsize::new(x2.get() + y2.get()) } else { None } +} + +// CHECK-LABEL: @bar +// CHECK-COUNT-2: icmp eq i{{[0-9]+}} %{{.*}}, 0 +// CHECK: or i1 +// CHECK: select +// CHECK-NOT: icmp +#[unsafe(no_mangle)] +pub fn bar(x: Option, y: Option) -> Option { + x.zip(y).map(|(x2, y2)| NonZeroUsize::new(x2.get() + y2.get())).flatten() +}