|
| 1 | +//@ compile-flags: -Copt-level=3 -Zmerge-functions=disabled |
| 2 | + |
| 3 | +// The `derive(PartialEq)` on enums with field-less variants compares discriminants, |
| 4 | +// so make sure we emit that in some reasonable way. |
| 5 | + |
| 6 | +#![crate_type = "lib"] |
| 7 | +#![feature(core_intrinsics)] |
| 8 | +#![feature(ascii_char)] |
| 9 | + |
| 10 | +use std::ascii::Char as AC; |
| 11 | +use std::cmp::Ordering; |
| 12 | +use std::intrinsics::discriminant_value; |
| 13 | +use std::num::NonZero; |
| 14 | + |
| 15 | +#[unsafe(no_mangle)] |
| 16 | +pub fn opt_bool_eq(a: Option<bool>, b: Option<bool>) -> bool { |
| 17 | + // CHECK-LABEL: @opt_bool_eq( |
| 18 | + // CHECK: %[[A:.+]] = icmp ne i8 %a, 2 |
| 19 | + // CHECK: %[[B:.+]] = icmp eq i8 %b, 2 |
| 20 | + // CHECK: %[[R:.+]] = xor i1 %[[A]], %[[B]] |
| 21 | + // CHECK: ret i1 %[[R]] |
| 22 | + |
| 23 | + discriminant_value(&a) == discriminant_value(&b) |
| 24 | +} |
| 25 | + |
| 26 | +#[unsafe(no_mangle)] |
| 27 | +pub fn opt_ord_eq(a: Option<Ordering>, b: Option<Ordering>) -> bool { |
| 28 | + // CHECK-LABEL: @opt_ord_eq( |
| 29 | + // CHECK: %[[A:.+]] = icmp ne i8 %a, 2 |
| 30 | + // CHECK: %[[B:.+]] = icmp eq i8 %b, 2 |
| 31 | + // CHECK: %[[R:.+]] = xor i1 %[[A]], %[[B]] |
| 32 | + // CHECK: ret i1 %[[R]] |
| 33 | + |
| 34 | + discriminant_value(&a) == discriminant_value(&b) |
| 35 | +} |
| 36 | + |
| 37 | +#[unsafe(no_mangle)] |
| 38 | +pub fn opt_nz32_eq(a: Option<NonZero<u32>>, b: Option<NonZero<u32>>) -> bool { |
| 39 | + // CHECK-LABEL: @opt_nz32_eq( |
| 40 | + // CHECK: %[[A:.+]] = icmp ne i32 %a, 0 |
| 41 | + // CHECK: %[[B:.+]] = icmp eq i32 %b, 0 |
| 42 | + // CHECK: %[[R:.+]] = xor i1 %[[A]], %[[B]] |
| 43 | + // CHECK: ret i1 %[[R]] |
| 44 | + |
| 45 | + discriminant_value(&a) == discriminant_value(&b) |
| 46 | +} |
| 47 | + |
| 48 | +#[unsafe(no_mangle)] |
| 49 | +pub fn opt_ac_eq(a: Option<AC>, b: Option<AC>) -> bool { |
| 50 | + // CHECK-LABEL: @opt_ac_eq( |
| 51 | + // CHECK: %[[A:.+]] = icmp ne i8 %a, -128 |
| 52 | + // CHECK: %[[B:.+]] = icmp eq i8 %b, -128 |
| 53 | + // CHECK: %[[R:.+]] = xor i1 %[[A]], %[[B]] |
| 54 | + // CHECK: ret i1 %[[R]] |
| 55 | + |
| 56 | + discriminant_value(&a) == discriminant_value(&b) |
| 57 | +} |
| 58 | + |
| 59 | +pub enum Mid<T> { |
| 60 | + Before, |
| 61 | + Thing(T), |
| 62 | + After, |
| 63 | +} |
| 64 | + |
| 65 | +#[unsafe(no_mangle)] |
| 66 | +pub fn mid_bool_eq(a: Mid<bool>, b: Mid<bool>) -> bool { |
| 67 | + // CHECK-LABEL: @mid_bool_eq( |
| 68 | + // CHECK: %[[AS:.+]] = add nsw i8 %a, -2 |
| 69 | + // CHECK: %[[AT:.+]] = icmp ult i8 %[[AS]], 3 |
| 70 | + // CHECK: %[[AD:.+]] = select i1 %[[AT]], i8 %[[AS]], i8 1 |
| 71 | + // CHECK: %[[BS:.+]] = add nsw i8 %b, -2 |
| 72 | + // CHECK: %[[BT:.+]] = icmp ult i8 %[[BS]], 3 |
| 73 | + // CHECK: %[[BD:.+]] = select i1 %[[BT]], i8 %[[BS]], i8 1 |
| 74 | + // CHECK: %[[R:.+]] = icmp eq i8 %[[AD]], %[[BD]] |
| 75 | + // CHECK: ret i1 %[[R]] |
| 76 | + discriminant_value(&a) == discriminant_value(&b) |
| 77 | +} |
| 78 | + |
| 79 | +#[unsafe(no_mangle)] |
| 80 | +pub fn mid_ord_eq(a: Mid<Ordering>, b: Mid<Ordering>) -> bool { |
| 81 | + // CHECK-LABEL: @mid_ord_eq( |
| 82 | + // CHECK: %[[AS:.+]] = add nsw i8 %a, -2 |
| 83 | + // CHECK: %[[AT:.+]] = icmp ult i8 %[[AS]], 3 |
| 84 | + // CHECK: %[[AD:.+]] = select i1 %[[AT]], i8 %[[AS]], i8 1 |
| 85 | + // CHECK: %[[BS:.+]] = add nsw i8 %b, -2 |
| 86 | + // CHECK: %[[BT:.+]] = icmp ult i8 %[[BS]], 3 |
| 87 | + // CHECK: %[[BD:.+]] = select i1 %[[BT]], i8 %[[BS]], i8 1 |
| 88 | + // CHECK: %[[R:.+]] = icmp eq i8 %[[AD]], %[[BD]] |
| 89 | + // CHECK: ret i1 %[[R]] |
| 90 | + discriminant_value(&a) == discriminant_value(&b) |
| 91 | +} |
| 92 | + |
| 93 | +#[unsafe(no_mangle)] |
| 94 | +pub fn mid_nz32_eq(a: Mid<NonZero<u32>>, b: Mid<NonZero<u32>>) -> bool { |
| 95 | + // CHECK-LABEL: @mid_nz32_eq( |
| 96 | + // CHECK: %[[R:.+]] = icmp eq i32 %a.0, %b.0 |
| 97 | + // CHECK: ret i1 %[[R]] |
| 98 | + discriminant_value(&a) == discriminant_value(&b) |
| 99 | +} |
| 100 | + |
| 101 | +#[unsafe(no_mangle)] |
| 102 | +pub fn mid_ac_eq(a: Mid<AC>, b: Mid<AC>) -> bool { |
| 103 | + // CHECK-LABEL: @mid_ac_eq( |
| 104 | + // CHECK: %[[AS:.+]] = xor i8 %a, -128 |
| 105 | + // CHECK: %[[AT:.+]] = icmp ult i8 %[[AS]], 3 |
| 106 | + // CHECK: %[[AD:.+]] = select i1 %[[AT]], i8 %[[AS]], i8 1 |
| 107 | + // CHECK: %[[BS:.+]] = xor i8 %b, -128 |
| 108 | + // CHECK: %[[BT:.+]] = icmp ult i8 %[[BS]], 3 |
| 109 | + // CHECK: %[[BD:.+]] = select i1 %[[BT]], i8 %[[BS]], i8 1 |
| 110 | + // CHECK: %[[R:.+]] = icmp eq i8 %[[AD]], %[[BD]] |
| 111 | + // CHECK: ret i1 %[[R]] |
| 112 | + discriminant_value(&a) == discriminant_value(&b) |
| 113 | +} |
0 commit comments