@@ -89,13 +89,13 @@ pub fn mid_bool_eq_discr(a: Mid<bool>, b: Mid<bool>) -> bool {
89
89
// CHECK-LABEL: @mid_bool_eq_discr(
90
90
91
91
// CHECK: %[[A_REL_DISCR:.+]] = add nsw i8 %a, -2
92
- // CHECK: %[[A_IS_NICHE:.+]] = icmp ult i8 %[[A_REL_DISCR]], 3
92
+ // CHECK: %[[A_IS_NICHE:.+]] = icmp samesign ugt i8 %a, 1
93
93
// CHECK: %[[A_NOT_HOLE:.+]] = icmp ne i8 %[[A_REL_DISCR]], 1
94
94
// CHECK: tail call void @llvm.assume(i1 %[[A_NOT_HOLE]])
95
95
// CHECK: %[[A_DISCR:.+]] = select i1 %[[A_IS_NICHE]], i8 %[[A_REL_DISCR]], i8 1
96
96
97
97
// CHECK: %[[B_REL_DISCR:.+]] = add nsw i8 %b, -2
98
- // CHECK: %[[B_IS_NICHE:.+]] = icmp ult i8 %[[B_REL_DISCR]], 3
98
+ // CHECK: %[[B_IS_NICHE:.+]] = icmp samesign ugt i8 %b, 1
99
99
// CHECK: %[[B_NOT_HOLE:.+]] = icmp ne i8 %[[B_REL_DISCR]], 1
100
100
// CHECK: tail call void @llvm.assume(i1 %[[B_NOT_HOLE]])
101
101
// CHECK: %[[B_DISCR:.+]] = select i1 %[[B_IS_NICHE]], i8 %[[B_REL_DISCR]], i8 1
@@ -109,13 +109,13 @@ pub fn mid_ord_eq_discr(a: Mid<Ordering>, b: Mid<Ordering>) -> bool {
109
109
// CHECK-LABEL: @mid_ord_eq_discr(
110
110
111
111
// CHECK: %[[A_REL_DISCR:.+]] = add nsw i8 %a, -2
112
- // CHECK: %[[A_IS_NICHE:.+]] = icmp ult i8 %[[A_REL_DISCR]], 3
112
+ // CHECK: %[[A_IS_NICHE:.+]] = icmp sgt i8 %a, 1
113
113
// CHECK: %[[A_NOT_HOLE:.+]] = icmp ne i8 %[[A_REL_DISCR]], 1
114
114
// CHECK: tail call void @llvm.assume(i1 %[[A_NOT_HOLE]])
115
115
// CHECK: %[[A_DISCR:.+]] = select i1 %[[A_IS_NICHE]], i8 %[[A_REL_DISCR]], i8 1
116
116
117
117
// CHECK: %[[B_REL_DISCR:.+]] = add nsw i8 %b, -2
118
- // CHECK: %[[B_IS_NICHE:.+]] = icmp ult i8 %[[B_REL_DISCR]], 3
118
+ // CHECK: %[[B_IS_NICHE:.+]] = icmp sgt i8 %b, 1
119
119
// CHECK: %[[B_NOT_HOLE:.+]] = icmp ne i8 %[[B_REL_DISCR]], 1
120
120
// CHECK: tail call void @llvm.assume(i1 %[[B_NOT_HOLE]])
121
121
// CHECK: %[[B_DISCR:.+]] = select i1 %[[B_IS_NICHE]], i8 %[[B_REL_DISCR]], i8 1
@@ -138,13 +138,13 @@ pub fn mid_ac_eq_discr(a: Mid<AC>, b: Mid<AC>) -> bool {
138
138
// CHECK-LABEL: @mid_ac_eq_discr(
139
139
140
140
// CHECK: %[[A_REL_DISCR:.+]] = xor i8 %a, -128
141
- // CHECK: %[[A_IS_NICHE:.+]] = icmp ult i8 %[[A_REL_DISCR]], 3
141
+ // CHECK: %[[A_IS_NICHE:.+]] = icmp slt i8 %a, 0
142
142
// CHECK: %[[A_NOT_HOLE:.+]] = icmp ne i8 %a, -127
143
143
// CHECK: tail call void @llvm.assume(i1 %[[A_NOT_HOLE]])
144
144
// CHECK: %[[A_DISCR:.+]] = select i1 %[[A_IS_NICHE]], i8 %[[A_REL_DISCR]], i8 1
145
145
146
146
// CHECK: %[[B_REL_DISCR:.+]] = xor i8 %b, -128
147
- // CHECK: %[[B_IS_NICHE:.+]] = icmp ult i8 %[[B_REL_DISCR]], 3
147
+ // CHECK: %[[B_IS_NICHE:.+]] = icmp slt i8 %b, 0
148
148
// CHECK: %[[B_NOT_HOLE:.+]] = icmp ne i8 %b, -127
149
149
// CHECK: tail call void @llvm.assume(i1 %[[B_NOT_HOLE]])
150
150
// CHECK: %[[B_DISCR:.+]] = select i1 %[[B_IS_NICHE]], i8 %[[B_REL_DISCR]], i8 1
@@ -160,17 +160,17 @@ pub fn mid_ac_eq_discr(a: Mid<AC>, b: Mid<AC>) -> bool {
160
160
pub fn mid_giant_eq_discr ( a : Mid < Giant > , b : Mid < Giant > ) -> bool {
161
161
// CHECK-LABEL: @mid_giant_eq_discr(
162
162
163
- // CHECK: %[[A_REL_DISCR_WIDE :.+]] = add nsw i128 %a, -5
164
- // CHECK: %[[A_REL_DISCR:.+]] = trunc nsw i128 %[[A_REL_DISCR_WIDE]] to i64
165
- // CHECK: %[[A_IS_NICHE:.+]] = icmp ult i128 %[[A_REL_DISCR_WIDE]], 3
166
- // CHECK: %[[A_NOT_HOLE:.+]] = icmp ne i128 %[[A_REL_DISCR_WIDE ]], 1
163
+ // CHECK: %[[A_TRUNC :.+]] = trunc nuw nsw i128 %a to i64
164
+ // CHECK: %[[A_REL_DISCR:.+]] = add nsw i64 %[[A_TRUNC]], -5
165
+ // CHECK: %[[A_IS_NICHE:.+]] = icmp samesign ugt i128 %a, 4
166
+ // CHECK: %[[A_NOT_HOLE:.+]] = icmp ne i64 %[[A_REL_DISCR ]], 1
167
167
// CHECK: tail call void @llvm.assume(i1 %[[A_NOT_HOLE]])
168
168
// CHECK: %[[A_DISCR:.+]] = select i1 %[[A_IS_NICHE]], i64 %[[A_REL_DISCR]], i64 1
169
169
170
- // CHECK: %[[B_REL_DISCR_WIDE :.+]] = add nsw i128 %b, -5
171
- // CHECK: %[[B_REL_DISCR:.+]] = trunc nsw i128 %[[B_REL_DISCR_WIDE]] to i64
172
- // CHECK: %[[B_IS_NICHE:.+]] = icmp ult i128 %[[B_REL_DISCR_WIDE]], 3
173
- // CHECK: %[[B_NOT_HOLE:.+]] = icmp ne i128 %[[B_REL_DISCR_WIDE ]], 1
170
+ // CHECK: %[[B_TRUNC :.+]] = trunc nuw nsw i128 %b to i64
171
+ // CHECK: %[[B_REL_DISCR:.+]] = add nsw i64 %[[B_TRUNC]], -5
172
+ // CHECK: %[[B_IS_NICHE:.+]] = icmp samesign ugt i128 %b, 4
173
+ // CHECK: %[[B_NOT_HOLE:.+]] = icmp ne i64 %[[B_REL_DISCR ]], 1
174
174
// CHECK: tail call void @llvm.assume(i1 %[[B_NOT_HOLE]])
175
175
// CHECK: %[[B_DISCR:.+]] = select i1 %[[B_IS_NICHE]], i64 %[[B_REL_DISCR]], i64 1
176
176
@@ -181,23 +181,19 @@ pub fn mid_giant_eq_discr(a: Mid<Giant>, b: Mid<Giant>) -> bool {
181
181
182
182
// In niche-encoded enums, testing for the untagged variant should optimize to a
183
183
// straight-forward comparison looking for the natural range of the payload value.
184
- // FIXME: A bunch don't, though.
185
184
186
185
#[ unsafe( no_mangle) ]
187
186
pub fn mid_bool_is_thing ( a : Mid < bool > ) -> bool {
188
187
// CHECK-LABEL: @mid_bool_is_thing(
189
-
190
- // CHECK: %[[REL_DISCR:.+]] = add nsw i8 %a, -2
191
- // CHECK: %[[R:.+]] = icmp ugt i8 %[[REL_DISCR]], 2
188
+ // CHECK: %[[R:.+]] = icmp samesign ult i8 %a, 2
192
189
// CHECK: ret i1 %[[R]]
193
190
discriminant_value ( & a) == 1
194
191
}
195
192
196
193
#[ unsafe( no_mangle) ]
197
194
pub fn mid_ord_is_thing ( a : Mid < Ordering > ) -> bool {
198
195
// CHECK-LABEL: @mid_ord_is_thing(
199
- // CHECK: %[[REL_DISCR:.+]] = add nsw i8 %a, -2
200
- // CHECK: %[[R:.+]] = icmp ugt i8 %[[REL_DISCR]], 2
196
+ // CHECK: %[[R:.+]] = icmp slt i8 %a, 2
201
197
// CHECK: ret i1 %[[R]]
202
198
discriminant_value ( & a) == 1
203
199
}
@@ -221,11 +217,7 @@ pub fn mid_ac_is_thing(a: Mid<AC>) -> bool {
221
217
#[ unsafe( no_mangle) ]
222
218
pub fn mid_giant_is_thing ( a : Mid < Giant > ) -> bool {
223
219
// CHECK-LABEL: @mid_giant_is_thing(
224
- // CHECK: %[[REL_DISCR_WIDE:.+]] = add nsw i128 %a, -5
225
- // CHECK: %[[REL_DISCR:.+]] = trunc nsw i128 %[[REL_DISCR_WIDE]] to i64
226
- // CHECK: %[[NOT_NICHE:.+]] = icmp ugt i128 %[[REL_DISCR_WIDE]], 2
227
- // CHECK: %[[IS_MID_VARIANT:.+]] = icmp eq i64 %[[REL_DISCR]], 1
228
- // CHECK: %[[R:.+]] = select i1 %[[NOT_NICHE]], i1 true, i1 %[[IS_MID_VARIANT]]
220
+ // CHECK: %[[R:.+]] = icmp samesign ult i128 %a, 5
229
221
// CHECK: ret i1 %[[R]]
230
222
discriminant_value ( & a) == 1
231
223
}
0 commit comments