@@ -171,3 +171,151 @@ define i1 @xor_icmp_ptr(ptr %c, ptr %d) {
171
171
ret i1 %xor
172
172
}
173
173
174
+ ; Tests from PR70928
175
+ define i1 @xor_icmp_true_signed (i32 %a ) {
176
+ ; CHECK-LABEL: @xor_icmp_true_signed(
177
+ ; CHECK-NEXT: ret i1 true
178
+ ;
179
+ %cmp = icmp sgt i32 %a , 5
180
+ %cmp1 = icmp slt i32 %a , 6
181
+ %cmp3 = xor i1 %cmp , %cmp1
182
+ ret i1 %cmp3
183
+ }
184
+ define i1 @xor_icmp_true_signed_multiuse1 (i32 %a ) {
185
+ ; CHECK-LABEL: @xor_icmp_true_signed_multiuse1(
186
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 5
187
+ ; CHECK-NEXT: call void @use(i1 [[CMP]])
188
+ ; CHECK-NEXT: ret i1 true
189
+ ;
190
+ %cmp = icmp sgt i32 %a , 5
191
+ call void @use (i1 %cmp )
192
+ %cmp1 = icmp slt i32 %a , 6
193
+ %cmp3 = xor i1 %cmp , %cmp1
194
+ ret i1 %cmp3
195
+ }
196
+ define i1 @xor_icmp_true_signed_multiuse2 (i32 %a ) {
197
+ ; CHECK-LABEL: @xor_icmp_true_signed_multiuse2(
198
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 5
199
+ ; CHECK-NEXT: call void @use(i1 [[CMP]])
200
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[A]], 6
201
+ ; CHECK-NEXT: call void @use(i1 [[CMP1]])
202
+ ; CHECK-NEXT: ret i1 true
203
+ ;
204
+ %cmp = icmp sgt i32 %a , 5
205
+ call void @use (i1 %cmp )
206
+ %cmp1 = icmp slt i32 %a , 6
207
+ call void @use (i1 %cmp1 )
208
+ %cmp3 = xor i1 %cmp , %cmp1
209
+ ret i1 %cmp3
210
+ }
211
+ define i1 @xor_icmp_true_signed_commuted (i32 %a ) {
212
+ ; CHECK-LABEL: @xor_icmp_true_signed_commuted(
213
+ ; CHECK-NEXT: ret i1 true
214
+ ;
215
+ %cmp = icmp sgt i32 %a , 5
216
+ %cmp1 = icmp slt i32 %a , 6
217
+ %cmp3 = xor i1 %cmp1 , %cmp
218
+ ret i1 %cmp3
219
+ }
220
+ define i1 @xor_icmp_true_unsigned (i32 %a ) {
221
+ ; CHECK-LABEL: @xor_icmp_true_unsigned(
222
+ ; CHECK-NEXT: ret i1 true
223
+ ;
224
+ %cmp = icmp ugt i32 %a , 5
225
+ %cmp1 = icmp ult i32 %a , 6
226
+ %cmp3 = xor i1 %cmp , %cmp1
227
+ ret i1 %cmp3
228
+ }
229
+ define i1 @xor_icmp_to_ne (i32 %a ) {
230
+ ; CHECK-LABEL: @xor_icmp_to_ne(
231
+ ; CHECK-NEXT: [[CMP3:%.*]] = icmp ne i32 [[A:%.*]], 5
232
+ ; CHECK-NEXT: ret i1 [[CMP3]]
233
+ ;
234
+ %cmp = icmp sgt i32 %a , 4
235
+ %cmp1 = icmp slt i32 %a , 6
236
+ %cmp3 = xor i1 %cmp , %cmp1
237
+ ret i1 %cmp3
238
+ }
239
+ define i1 @xor_icmp_to_ne_multiuse1 (i32 %a ) {
240
+ ; CHECK-LABEL: @xor_icmp_to_ne_multiuse1(
241
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 4
242
+ ; CHECK-NEXT: call void @use(i1 [[CMP]])
243
+ ; CHECK-NEXT: [[CMP3:%.*]] = icmp ne i32 [[A]], 5
244
+ ; CHECK-NEXT: ret i1 [[CMP3]]
245
+ ;
246
+ %cmp = icmp sgt i32 %a , 4
247
+ call void @use (i1 %cmp )
248
+ %cmp1 = icmp slt i32 %a , 6
249
+ %cmp3 = xor i1 %cmp , %cmp1
250
+ ret i1 %cmp3
251
+ }
252
+ define i1 @xor_icmp_to_icmp_add (i32 %a ) {
253
+ ; CHECK-LABEL: @xor_icmp_to_icmp_add(
254
+ ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[A:%.*]], -6
255
+ ; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i32 [[TMP1]], -2
256
+ ; CHECK-NEXT: ret i1 [[CMP3]]
257
+ ;
258
+ %cmp = icmp sgt i32 %a , 3
259
+ %cmp1 = icmp slt i32 %a , 6
260
+ %cmp3 = xor i1 %cmp , %cmp1
261
+ ret i1 %cmp3
262
+ }
263
+ ; Negative tests
264
+ ; The result of ConstantRange::difference is not exact.
265
+ define i1 @xor_icmp_invalid_range (i8 %x0 ) {
266
+ ; CHECK-LABEL: @xor_icmp_invalid_range(
267
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X0:%.*]], -5
268
+ ; CHECK-NEXT: [[OR_COND:%.*]] = icmp ne i8 [[TMP1]], 0
269
+ ; CHECK-NEXT: ret i1 [[OR_COND]]
270
+ ;
271
+ %cmp = icmp eq i8 %x0 , 0
272
+ %cmp4 = icmp ne i8 %x0 , 4
273
+ %or.cond = xor i1 %cmp , %cmp4
274
+ ret i1 %or.cond
275
+ }
276
+ define i1 @xor_icmp_to_ne_multiuse2 (i32 %a ) {
277
+ ; CHECK-LABEL: @xor_icmp_to_ne_multiuse2(
278
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 4
279
+ ; CHECK-NEXT: call void @use(i1 [[CMP]])
280
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[A]], 6
281
+ ; CHECK-NEXT: call void @use(i1 [[CMP1]])
282
+ ; CHECK-NEXT: [[CMP3:%.*]] = xor i1 [[CMP]], [[CMP1]]
283
+ ; CHECK-NEXT: ret i1 [[CMP3]]
284
+ ;
285
+ %cmp = icmp sgt i32 %a , 4
286
+ call void @use (i1 %cmp )
287
+ %cmp1 = icmp slt i32 %a , 6
288
+ call void @use (i1 %cmp1 )
289
+ %cmp3 = xor i1 %cmp , %cmp1
290
+ ret i1 %cmp3
291
+ }
292
+ define i1 @xor_icmp_to_icmp_add_multiuse1 (i32 %a ) {
293
+ ; CHECK-LABEL: @xor_icmp_to_icmp_add_multiuse1(
294
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 3
295
+ ; CHECK-NEXT: call void @use(i1 [[CMP]])
296
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[A]], 6
297
+ ; CHECK-NEXT: [[CMP3:%.*]] = xor i1 [[CMP]], [[CMP1]]
298
+ ; CHECK-NEXT: ret i1 [[CMP3]]
299
+ ;
300
+ %cmp = icmp sgt i32 %a , 3
301
+ call void @use (i1 %cmp )
302
+ %cmp1 = icmp slt i32 %a , 6
303
+ %cmp3 = xor i1 %cmp , %cmp1
304
+ ret i1 %cmp3
305
+ }
306
+ define i1 @xor_icmp_to_icmp_add_multiuse2 (i32 %a ) {
307
+ ; CHECK-LABEL: @xor_icmp_to_icmp_add_multiuse2(
308
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 3
309
+ ; CHECK-NEXT: call void @use(i1 [[CMP]])
310
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[A]], 6
311
+ ; CHECK-NEXT: call void @use(i1 [[CMP1]])
312
+ ; CHECK-NEXT: [[CMP3:%.*]] = xor i1 [[CMP]], [[CMP1]]
313
+ ; CHECK-NEXT: ret i1 [[CMP3]]
314
+ ;
315
+ %cmp = icmp sgt i32 %a , 3
316
+ call void @use (i1 %cmp )
317
+ %cmp1 = icmp slt i32 %a , 6
318
+ call void @use (i1 %cmp1 )
319
+ %cmp3 = xor i1 %cmp , %cmp1
320
+ ret i1 %cmp3
321
+ }
0 commit comments