| //@ min-llvm-version: 21 |
| //@ compile-flags: -Copt-level=3 -Zmerge-functions=disabled |
| //! Tests that matching + eq on `Option<FieldlessEnum>` produces a simple compare with no branching |
| |
| #![crate_type = "lib"] |
| |
| #[derive(PartialEq)] |
| pub enum TwoNum { |
| A, |
| B, |
| } |
| |
| #[derive(PartialEq)] |
| pub enum ThreeNum { |
| A, |
| B, |
| C, |
| } |
| |
| // CHECK-LABEL: @match_two |
| #[no_mangle] |
| pub fn match_two(a: Option<TwoNum>, b: Option<TwoNum>) -> bool { |
| // CHECK-NEXT: start: |
| // CHECK-NEXT: icmp eq i8 |
| // CHECK-NEXT: ret |
| match (a, b) { |
| (Some(x), Some(y)) => x == y, |
| (Some(_), None) => false, |
| (None, Some(_)) => false, |
| (None, None) => true, |
| } |
| } |
| |
| // CHECK-LABEL: @match_three |
| #[no_mangle] |
| pub fn match_three(a: Option<ThreeNum>, b: Option<ThreeNum>) -> bool { |
| // CHECK-NEXT: start: |
| // CHECK-NEXT: icmp eq |
| // CHECK-NEXT: ret |
| match (a, b) { |
| (Some(x), Some(y)) => x == y, |
| (Some(_), None) => false, |
| (None, Some(_)) => false, |
| (None, None) => true, |
| } |
| } |
| |
| // CHECK-LABEL: @match_two_ref |
| #[no_mangle] |
| pub fn match_two_ref(a: &Option<TwoNum>, b: &Option<TwoNum>) -> bool { |
| // CHECK-NEXT: start: |
| // CHECK-NEXT: load i8 |
| // CHECK-NEXT: load i8 |
| // CHECK-NEXT: icmp eq i8 |
| // CHECK-NEXT: ret |
| match (a, b) { |
| (Some(x), Some(y)) => x == y, |
| (Some(_), None) => false, |
| (None, Some(_)) => false, |
| (None, None) => true, |
| } |
| } |
| |
| // CHECK-LABEL: @match_three_ref |
| #[no_mangle] |
| pub fn match_three_ref(a: &Option<ThreeNum>, b: &Option<ThreeNum>) -> bool { |
| // CHECK-NEXT: start: |
| // CHECK-NEXT: load i8 |
| // CHECK-NEXT: load i8 |
| // CHECK-NEXT: icmp eq |
| // CHECK-NEXT: ret |
| match (a, b) { |
| (Some(x), Some(y)) => x == y, |
| (Some(_), None) => false, |
| (None, Some(_)) => false, |
| (None, None) => true, |
| } |
| } |