Skip to content

Commit d956b30

Browse files
committed
More codegen tests for enum discriminants
1 parent 1bc5618 commit d956b30

File tree

1 file changed

+113
-0
lines changed

1 file changed

+113
-0
lines changed
+113
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
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

Comments
 (0)