@@ -91,18 +91,23 @@ pub enum Mid<T> {
91
91
pub fn mid_bool_eq_discr ( a : Mid < bool > , b : Mid < bool > ) -> bool {
92
92
// CHECK-LABEL: @mid_bool_eq_discr(
93
93
94
- // CHECK: %[[A_REL_DISCR:.+]] = add nsw i8 %a, -2
95
- // CHECK: %[[A_IS_NICHE:.+]] = icmp samesign ugt i8 %a, 1
96
- // CHECK: %[[A_NOT_HOLE:.+]] = icmp ne i8 %[[A_REL_DISCR]], 1
94
+ // CHECK: %[[A_NOT_HOLE:.+]] = icmp ne i8 %a, 3
97
95
// CHECK: tail call void @llvm.assume(i1 %[[A_NOT_HOLE]])
98
- // CHECK: %[[A_DISCR:.+]] = select i1 %[[A_IS_NICHE]], i8 %[[A_REL_DISCR]], i8 1
96
+ // LLVM20: %[[A_REL_DISCR:.+]] = add nsw i8 %a, -2
97
+ // CHECK: %[[A_IS_NICHE:.+]] = icmp samesign ugt i8 %a, 1
98
+ // LLVM20: %[[A_DISCR:.+]] = select i1 %[[A_IS_NICHE]], i8 %[[A_REL_DISCR]], i8 1
99
99
100
- // CHECK: %[[B_REL_DISCR:.+]] = add nsw i8 %b, -2
101
- // CHECK: %[[B_IS_NICHE:.+]] = icmp samesign ugt i8 %b, 1
102
- // CHECK: %[[B_NOT_HOLE:.+]] = icmp ne i8 %[[B_REL_DISCR]], 1
100
+ // CHECK: %[[B_NOT_HOLE:.+]] = icmp ne i8 %b, 3
103
101
// CHECK: tail call void @llvm.assume(i1 %[[B_NOT_HOLE]])
104
- // CHECK: %[[B_DISCR:.+]] = select i1 %[[B_IS_NICHE]], i8 %[[B_REL_DISCR]], i8 1
102
+ // LLVM20: %[[B_REL_DISCR:.+]] = add nsw i8 %b, -2
103
+ // CHECK: %[[B_IS_NICHE:.+]] = icmp samesign ugt i8 %b, 1
104
+ // LLVM20: %[[B_DISCR:.+]] = select i1 %[[B_IS_NICHE]], i8 %[[B_REL_DISCR]], i8 1
105
+
106
+ // LLVM21: %[[A_MOD_DISCR:.+]] = select i1 %[[A_IS_NICHE]], i8 %a, i8 3
107
+ // LLVM21: %[[B_MOD_DISCR:.+]] = select i1 %[[B_IS_NICHE]], i8 %b, i8 3
105
108
109
+ // LLVM20: %[[R:.+]] = icmp eq i8 %[[A_DISCR]], %[[B_DISCR]]
110
+ // LLVM21: %[[R:.+]] = icmp eq i8 %[[A_MOD_DISCR]], %[[B_MOD_DISCR]]
106
111
// CHECK: ret i1 %[[R]]
107
112
discriminant_value ( & a) == discriminant_value ( & b)
108
113
}
@@ -111,19 +116,23 @@ pub fn mid_bool_eq_discr(a: Mid<bool>, b: Mid<bool>) -> bool {
111
116
pub fn mid_ord_eq_discr ( a : Mid < Ordering > , b : Mid < Ordering > ) -> bool {
112
117
// CHECK-LABEL: @mid_ord_eq_discr(
113
118
114
- // CHECK: %[[A_REL_DISCR:.+]] = add nsw i8 %a, -2
115
- // CHECK: %[[A_IS_NICHE:.+]] = icmp sgt i8 %a, 1
116
- // CHECK: %[[A_NOT_HOLE:.+]] = icmp ne i8 %[[A_REL_DISCR]], 1
119
+ // CHECK: %[[A_NOT_HOLE:.+]] = icmp ne i8 %a, 3
117
120
// CHECK: tail call void @llvm.assume(i1 %[[A_NOT_HOLE]])
118
- // CHECK: %[[A_DISCR:.+]] = select i1 %[[A_IS_NICHE]], i8 %[[A_REL_DISCR]], i8 1
121
+ // LLVM20: %[[A_REL_DISCR:.+]] = add nsw i8 %a, -2
122
+ // CHECK: %[[A_IS_NICHE:.+]] = icmp sgt i8 %a, 1
123
+ // LLVM20: %[[A_DISCR:.+]] = select i1 %[[A_IS_NICHE]], i8 %[[A_REL_DISCR]], i8 1
119
124
120
- // CHECK: %[[B_REL_DISCR:.+]] = add nsw i8 %b, -2
121
- // CHECK: %[[B_IS_NICHE:.+]] = icmp sgt i8 %b, 1
122
- // CHECK: %[[B_NOT_HOLE:.+]] = icmp ne i8 %[[B_REL_DISCR]], 1
125
+ // CHECK: %[[B_NOT_HOLE:.+]] = icmp ne i8 %b, 3
123
126
// CHECK: tail call void @llvm.assume(i1 %[[B_NOT_HOLE]])
124
- // CHECK: %[[B_DISCR:.+]] = select i1 %[[B_IS_NICHE]], i8 %[[B_REL_DISCR]], i8 1
127
+ // LLVM20: %[[B_REL_DISCR:.+]] = add nsw i8 %b, -2
128
+ // CHECK: %[[B_IS_NICHE:.+]] = icmp sgt i8 %b, 1
129
+ // LLVM20: %[[B_DISCR:.+]] = select i1 %[[B_IS_NICHE]], i8 %[[B_REL_DISCR]], i8 1
125
130
126
- // CHECK: %[[R:.+]] = icmp eq i8 %[[A_DISCR]], %[[B_DISCR]]
131
+ // LLVM21: %[[A_MOD_DISCR:.+]] = select i1 %[[A_IS_NICHE]], i8 %a, i8 3
132
+ // LLVM21: %[[B_MOD_DISCR:.+]] = select i1 %[[B_IS_NICHE]], i8 %b, i8 3
133
+
134
+ // LLVM20: %[[R:.+]] = icmp eq i8 %[[A_DISCR]], %[[B_DISCR]]
135
+ // LLVM21: %[[R:.+]] = icmp eq i8 %[[A_MOD_DISCR]], %[[B_MOD_DISCR]]
127
136
// CHECK: ret i1 %[[R]]
128
137
discriminant_value ( & a) == discriminant_value ( & b)
129
138
}
@@ -140,16 +149,16 @@ pub fn mid_nz32_eq_discr(a: Mid<NonZero<u32>>, b: Mid<NonZero<u32>>) -> bool {
140
149
pub fn mid_ac_eq_discr ( a : Mid < AC > , b : Mid < AC > ) -> bool {
141
150
// CHECK-LABEL: @mid_ac_eq_discr(
142
151
143
- // LLVM20: %[[A_REL_DISCR:.+]] = xor i8 %a, -128
144
- // CHECK: %[[A_IS_NICHE:.+]] = icmp slt i8 %a, 0
145
152
// CHECK: %[[A_NOT_HOLE:.+]] = icmp ne i8 %a, -127
146
153
// CHECK: tail call void @llvm.assume(i1 %[[A_NOT_HOLE]])
154
+ // LLVM20: %[[A_REL_DISCR:.+]] = xor i8 %a, -128
155
+ // CHECK: %[[A_IS_NICHE:.+]] = icmp slt i8 %a, 0
147
156
// LLVM20: %[[A_DISCR:.+]] = select i1 %[[A_IS_NICHE]], i8 %[[A_REL_DISCR]], i8 1
148
157
149
- // LLVM20: %[[B_REL_DISCR:.+]] = xor i8 %b, -128
150
- // CHECK: %[[B_IS_NICHE:.+]] = icmp slt i8 %b, 0
151
158
// CHECK: %[[B_NOT_HOLE:.+]] = icmp ne i8 %b, -127
152
159
// CHECK: tail call void @llvm.assume(i1 %[[B_NOT_HOLE]])
160
+ // LLVM20: %[[B_REL_DISCR:.+]] = xor i8 %b, -128
161
+ // CHECK: %[[B_IS_NICHE:.+]] = icmp slt i8 %b, 0
153
162
// LLVM20: %[[B_DISCR:.+]] = select i1 %[[B_IS_NICHE]], i8 %[[B_REL_DISCR]], i8 1
154
163
155
164
// LLVM21: %[[A_DISCR:.+]] = select i1 %[[A_IS_NICHE]], i8 %a, i8 -127
@@ -166,21 +175,25 @@ pub fn mid_ac_eq_discr(a: Mid<AC>, b: Mid<AC>) -> bool {
166
175
pub fn mid_giant_eq_discr ( a : Mid < Giant > , b : Mid < Giant > ) -> bool {
167
176
// CHECK-LABEL: @mid_giant_eq_discr(
168
177
178
+ // CHECK: %[[A_NOT_HOLE:.+]] = icmp ne i128 %a, 6
179
+ // CHECK: tail call void @llvm.assume(i1 %[[A_NOT_HOLE]])
169
180
// CHECK: %[[A_TRUNC:.+]] = trunc nuw nsw i128 %a to i64
170
- // CHECK : %[[A_REL_DISCR:.+]] = add nsw i64 %[[A_TRUNC]], -5
181
+ // LLVM20 : %[[A_REL_DISCR:.+]] = add nsw i64 %[[A_TRUNC]], -5
171
182
// CHECK: %[[A_IS_NICHE:.+]] = icmp samesign ugt i128 %a, 4
172
- // CHECK: %[[A_NOT_HOLE:.+]] = icmp ne i64 %[[A_REL_DISCR]], 1
173
- // CHECK: tail call void @llvm.assume(i1 %[[A_NOT_HOLE]])
174
- // CHECK: %[[A_DISCR:.+]] = select i1 %[[A_IS_NICHE]], i64 %[[A_REL_DISCR]], i64 1
183
+ // LLVM20: %[[A_DISCR:.+]] = select i1 %[[A_IS_NICHE]], i64 %[[A_REL_DISCR]], i64 1
175
184
185
+ // CHECK: %[[B_NOT_HOLE:.+]] = icmp ne i128 %b, 6
186
+ // CHECK: tail call void @llvm.assume(i1 %[[B_NOT_HOLE]])
176
187
// CHECK: %[[B_TRUNC:.+]] = trunc nuw nsw i128 %b to i64
177
- // CHECK : %[[B_REL_DISCR:.+]] = add nsw i64 %[[B_TRUNC]], -5
188
+ // LLVM20 : %[[B_REL_DISCR:.+]] = add nsw i64 %[[B_TRUNC]], -5
178
189
// CHECK: %[[B_IS_NICHE:.+]] = icmp samesign ugt i128 %b, 4
179
- // CHECK: %[[B_NOT_HOLE:.+]] = icmp ne i64 %[[B_REL_DISCR]], 1
180
- // CHECK: tail call void @llvm.assume(i1 %[[B_NOT_HOLE]])
181
- // CHECK: %[[B_DISCR:.+]] = select i1 %[[B_IS_NICHE]], i64 %[[B_REL_DISCR]], i64 1
190
+ // LLVM20: %[[B_DISCR:.+]] = select i1 %[[B_IS_NICHE]], i64 %[[B_REL_DISCR]], i64 1
191
+
192
+ // LLVM21: %[[A_MODIFIED_TAG:.+]] = select i1 %[[A_IS_NICHE]], i64 %[[A_TRUNC]], i64 6
193
+ // LLVM21: %[[B_MODIFIED_TAG:.+]] = select i1 %[[B_IS_NICHE]], i64 %[[B_TRUNC]], i64 6
194
+ // LLVM21: %[[R:.+]] = icmp eq i64 %[[A_MODIFIED_TAG]], %[[B_MODIFIED_TAG]]
182
195
183
- // CHECK : %[[R:.+]] = icmp eq i64 %[[A_DISCR]], %[[B_DISCR]]
196
+ // LLVM20 : %[[R:.+]] = icmp eq i64 %[[A_DISCR]], %[[B_DISCR]]
184
197
// CHECK: ret i1 %[[R]]
185
198
discriminant_value ( & a) == discriminant_value ( & b)
186
199
}
0 commit comments