Skip to content

Commit e1622e1

Browse files
committed
[InstCombine] Add tests for trunc nuw/nsw in icmp (NFC)
1 parent bd9fdce commit e1622e1

File tree

1 file changed

+325
-0
lines changed

1 file changed

+325
-0
lines changed

llvm/test/Transforms/InstCombine/icmp-of-trunc-ext.ll

Lines changed: 325 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,3 +268,328 @@ define i1 @icmp_trunc_x_zext_y_fail_multiuse(i32 %x, i8 %y) {
268268
%r = icmp ule i16 %x16, %y16
269269
ret i1 %r
270270
}
271+
272+
define i1 @trunc_unsigned_nuw(i16 %x, i16 %y) {
273+
; CHECK-LABEL: @trunc_unsigned_nuw(
274+
; CHECK-NEXT: [[XT:%.*]] = trunc nuw i16 [[X:%.*]] to i8
275+
; CHECK-NEXT: [[YT:%.*]] = trunc nuw i16 [[Y:%.*]] to i8
276+
; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[XT]], [[YT]]
277+
; CHECK-NEXT: ret i1 [[C]]
278+
;
279+
%xt = trunc nuw i16 %x to i8
280+
%yt = trunc nuw i16 %y to i8
281+
%c = icmp ult i8 %xt, %yt
282+
ret i1 %c
283+
}
284+
285+
define i1 @trunc_unsigned_nsw(i16 %x, i16 %y) {
286+
; CHECK-LABEL: @trunc_unsigned_nsw(
287+
; CHECK-NEXT: [[XT:%.*]] = trunc nsw i16 [[X:%.*]] to i8
288+
; CHECK-NEXT: [[YT:%.*]] = trunc nsw i16 [[Y:%.*]] to i8
289+
; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[XT]], [[YT]]
290+
; CHECK-NEXT: ret i1 [[C]]
291+
;
292+
%xt = trunc nsw i16 %x to i8
293+
%yt = trunc nsw i16 %y to i8
294+
%c = icmp ult i8 %xt, %yt
295+
ret i1 %c
296+
}
297+
298+
define i1 @trunc_unsigned_both(i16 %x, i16 %y) {
299+
; CHECK-LABEL: @trunc_unsigned_both(
300+
; CHECK-NEXT: [[XT:%.*]] = trunc nuw nsw i16 [[X:%.*]] to i8
301+
; CHECK-NEXT: [[YT:%.*]] = trunc nuw nsw i16 [[Y:%.*]] to i8
302+
; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[XT]], [[YT]]
303+
; CHECK-NEXT: ret i1 [[C]]
304+
;
305+
%xt = trunc nuw nsw i16 %x to i8
306+
%yt = trunc nuw nsw i16 %y to i8
307+
%c = icmp ult i8 %xt, %yt
308+
ret i1 %c
309+
}
310+
311+
define i1 @trunc_unsigned_either(i16 %x, i16 %y) {
312+
; CHECK-LABEL: @trunc_unsigned_either(
313+
; CHECK-NEXT: [[XT:%.*]] = trunc nuw i16 [[X:%.*]] to i8
314+
; CHECK-NEXT: [[YT:%.*]] = trunc nsw i16 [[Y:%.*]] to i8
315+
; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[XT]], [[YT]]
316+
; CHECK-NEXT: ret i1 [[C]]
317+
;
318+
%xt = trunc nuw i16 %x to i8
319+
%yt = trunc nsw i16 %y to i8
320+
%c = icmp ult i8 %xt, %yt
321+
ret i1 %c
322+
}
323+
324+
define i1 @trunc_signed_nuw(i16 %x, i16 %y) {
325+
; CHECK-LABEL: @trunc_signed_nuw(
326+
; CHECK-NEXT: [[XT:%.*]] = trunc nuw i16 [[X:%.*]] to i8
327+
; CHECK-NEXT: [[YT:%.*]] = trunc nuw i16 [[Y:%.*]] to i8
328+
; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[XT]], [[YT]]
329+
; CHECK-NEXT: ret i1 [[C]]
330+
;
331+
%xt = trunc nuw i16 %x to i8
332+
%yt = trunc nuw i16 %y to i8
333+
%c = icmp slt i8 %xt, %yt
334+
ret i1 %c
335+
}
336+
337+
define i1 @trunc_signed_nsw(i16 %x, i16 %y) {
338+
; CHECK-LABEL: @trunc_signed_nsw(
339+
; CHECK-NEXT: [[XT:%.*]] = trunc nsw i16 [[X:%.*]] to i8
340+
; CHECK-NEXT: [[YT:%.*]] = trunc nsw i16 [[Y:%.*]] to i8
341+
; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[XT]], [[YT]]
342+
; CHECK-NEXT: ret i1 [[C]]
343+
;
344+
%xt = trunc nsw i16 %x to i8
345+
%yt = trunc nsw i16 %y to i8
346+
%c = icmp slt i8 %xt, %yt
347+
ret i1 %c
348+
}
349+
350+
define i1 @trunc_signed_both(i16 %x, i16 %y) {
351+
; CHECK-LABEL: @trunc_signed_both(
352+
; CHECK-NEXT: [[XT:%.*]] = trunc nuw nsw i16 [[X:%.*]] to i8
353+
; CHECK-NEXT: [[YT:%.*]] = trunc nuw nsw i16 [[Y:%.*]] to i8
354+
; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[XT]], [[YT]]
355+
; CHECK-NEXT: ret i1 [[C]]
356+
;
357+
%xt = trunc nuw nsw i16 %x to i8
358+
%yt = trunc nuw nsw i16 %y to i8
359+
%c = icmp slt i8 %xt, %yt
360+
ret i1 %c
361+
}
362+
363+
define i1 @trunc_signed_either(i16 %x, i16 %y) {
364+
; CHECK-LABEL: @trunc_signed_either(
365+
; CHECK-NEXT: [[XT:%.*]] = trunc nuw i16 [[X:%.*]] to i8
366+
; CHECK-NEXT: [[YT:%.*]] = trunc nsw i16 [[Y:%.*]] to i8
367+
; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[XT]], [[YT]]
368+
; CHECK-NEXT: ret i1 [[C]]
369+
;
370+
%xt = trunc nuw i16 %x to i8
371+
%yt = trunc nsw i16 %y to i8
372+
%c = icmp slt i8 %xt, %yt
373+
ret i1 %c
374+
}
375+
376+
define i1 @trunc_equality_nuw(i16 %x, i16 %y) {
377+
; CHECK-LABEL: @trunc_equality_nuw(
378+
; CHECK-NEXT: [[XT:%.*]] = trunc nuw i16 [[X:%.*]] to i8
379+
; CHECK-NEXT: [[YT:%.*]] = trunc nuw i16 [[Y:%.*]] to i8
380+
; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[XT]], [[YT]]
381+
; CHECK-NEXT: ret i1 [[C]]
382+
;
383+
%xt = trunc nuw i16 %x to i8
384+
%yt = trunc nuw i16 %y to i8
385+
%c = icmp eq i8 %xt, %yt
386+
ret i1 %c
387+
}
388+
389+
define i1 @trunc_equality_nsw(i16 %x, i16 %y) {
390+
; CHECK-LABEL: @trunc_equality_nsw(
391+
; CHECK-NEXT: [[XT:%.*]] = trunc nsw i16 [[X:%.*]] to i8
392+
; CHECK-NEXT: [[YT:%.*]] = trunc nsw i16 [[Y:%.*]] to i8
393+
; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[XT]], [[YT]]
394+
; CHECK-NEXT: ret i1 [[C]]
395+
;
396+
%xt = trunc nsw i16 %x to i8
397+
%yt = trunc nsw i16 %y to i8
398+
%c = icmp eq i8 %xt, %yt
399+
ret i1 %c
400+
}
401+
402+
define i1 @trunc_equality_both(i16 %x, i16 %y) {
403+
; CHECK-LABEL: @trunc_equality_both(
404+
; CHECK-NEXT: [[XT:%.*]] = trunc nuw nsw i16 [[X:%.*]] to i8
405+
; CHECK-NEXT: [[YT:%.*]] = trunc nuw nsw i16 [[Y:%.*]] to i8
406+
; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[XT]], [[YT]]
407+
; CHECK-NEXT: ret i1 [[C]]
408+
;
409+
%xt = trunc nuw nsw i16 %x to i8
410+
%yt = trunc nuw nsw i16 %y to i8
411+
%c = icmp eq i8 %xt, %yt
412+
ret i1 %c
413+
}
414+
415+
define i1 @trunc_equality_either(i16 %x, i16 %y) {
416+
; CHECK-LABEL: @trunc_equality_either(
417+
; CHECK-NEXT: [[XT:%.*]] = trunc nuw i16 [[X:%.*]] to i8
418+
; CHECK-NEXT: [[YT:%.*]] = trunc nsw i16 [[Y:%.*]] to i8
419+
; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[XT]], [[YT]]
420+
; CHECK-NEXT: ret i1 [[C]]
421+
;
422+
%xt = trunc nuw i16 %x to i8
423+
%yt = trunc nsw i16 %y to i8
424+
%c = icmp eq i8 %xt, %yt
425+
ret i1 %c
426+
}
427+
428+
define i1 @trunc_unsigned_nuw_zext(i32 %x, i8 %y) {
429+
; CHECK-LABEL: @trunc_unsigned_nuw_zext(
430+
; CHECK-NEXT: [[XT:%.*]] = trunc nuw i32 [[X:%.*]] to i16
431+
; CHECK-NEXT: [[YE:%.*]] = zext i8 [[Y:%.*]] to i16
432+
; CHECK-NEXT: [[C:%.*]] = icmp ult i16 [[XT]], [[YE]]
433+
; CHECK-NEXT: ret i1 [[C]]
434+
;
435+
%xt = trunc nuw i32 %x to i16
436+
%ye = zext i8 %y to i16
437+
%c = icmp ult i16 %xt, %ye
438+
ret i1 %c
439+
}
440+
441+
define i1 @trunc_unsigned_nuw_sext(i32 %x, i8 %y) {
442+
; CHECK-LABEL: @trunc_unsigned_nuw_sext(
443+
; CHECK-NEXT: [[XT:%.*]] = trunc nuw i32 [[X:%.*]] to i16
444+
; CHECK-NEXT: [[YE:%.*]] = sext i8 [[Y:%.*]] to i16
445+
; CHECK-NEXT: [[C:%.*]] = icmp ult i16 [[XT]], [[YE]]
446+
; CHECK-NEXT: ret i1 [[C]]
447+
;
448+
%xt = trunc nuw i32 %x to i16
449+
%ye = sext i8 %y to i16
450+
%c = icmp ult i16 %xt, %ye
451+
ret i1 %c
452+
}
453+
454+
define i1 @trunc_unsigned_nsw_zext(i32 %x, i8 %y) {
455+
; CHECK-LABEL: @trunc_unsigned_nsw_zext(
456+
; CHECK-NEXT: [[XT:%.*]] = trunc nsw i32 [[X:%.*]] to i16
457+
; CHECK-NEXT: [[YE:%.*]] = zext i8 [[Y:%.*]] to i16
458+
; CHECK-NEXT: [[C:%.*]] = icmp ult i16 [[XT]], [[YE]]
459+
; CHECK-NEXT: ret i1 [[C]]
460+
;
461+
%xt = trunc nsw i32 %x to i16
462+
%ye = zext i8 %y to i16
463+
%c = icmp ult i16 %xt, %ye
464+
ret i1 %c
465+
}
466+
467+
define i1 @trunc_unsigned_nsw_sext(i32 %x, i8 %y) {
468+
; CHECK-LABEL: @trunc_unsigned_nsw_sext(
469+
; CHECK-NEXT: [[XT:%.*]] = trunc nsw i32 [[X:%.*]] to i16
470+
; CHECK-NEXT: [[YE:%.*]] = sext i8 [[Y:%.*]] to i16
471+
; CHECK-NEXT: [[C:%.*]] = icmp ult i16 [[XT]], [[YE]]
472+
; CHECK-NEXT: ret i1 [[C]]
473+
;
474+
%xt = trunc nsw i32 %x to i16
475+
%ye = sext i8 %y to i16
476+
%c = icmp ult i16 %xt, %ye
477+
ret i1 %c
478+
}
479+
480+
define i1 @trunc_signed_nsw_sext(i32 %x, i8 %y) {
481+
; CHECK-LABEL: @trunc_signed_nsw_sext(
482+
; CHECK-NEXT: [[XT:%.*]] = trunc nsw i32 [[X:%.*]] to i16
483+
; CHECK-NEXT: [[YE:%.*]] = sext i8 [[Y:%.*]] to i16
484+
; CHECK-NEXT: [[C:%.*]] = icmp slt i16 [[XT]], [[YE]]
485+
; CHECK-NEXT: ret i1 [[C]]
486+
;
487+
%xt = trunc nsw i32 %x to i16
488+
%ye = sext i8 %y to i16
489+
%c = icmp slt i16 %xt, %ye
490+
ret i1 %c
491+
}
492+
493+
define i1 @trunc_signed_nsw_zext(i32 %x, i8 %y) {
494+
; CHECK-LABEL: @trunc_signed_nsw_zext(
495+
; CHECK-NEXT: [[XT:%.*]] = trunc nsw i32 [[X:%.*]] to i16
496+
; CHECK-NEXT: [[YE:%.*]] = zext i8 [[Y:%.*]] to i16
497+
; CHECK-NEXT: [[C:%.*]] = icmp slt i16 [[XT]], [[YE]]
498+
; CHECK-NEXT: ret i1 [[C]]
499+
;
500+
%xt = trunc nsw i32 %x to i16
501+
%ye = zext i8 %y to i16
502+
%c = icmp slt i16 %xt, %ye
503+
ret i1 %c
504+
}
505+
506+
define i1 @trunc_signed_nuw_sext(i32 %x, i8 %y) {
507+
; CHECK-LABEL: @trunc_signed_nuw_sext(
508+
; CHECK-NEXT: [[XT:%.*]] = trunc nuw i32 [[X:%.*]] to i16
509+
; CHECK-NEXT: [[YE:%.*]] = sext i8 [[Y:%.*]] to i16
510+
; CHECK-NEXT: [[C:%.*]] = icmp slt i16 [[XT]], [[YE]]
511+
; CHECK-NEXT: ret i1 [[C]]
512+
;
513+
%xt = trunc nuw i32 %x to i16
514+
%ye = sext i8 %y to i16
515+
%c = icmp slt i16 %xt, %ye
516+
ret i1 %c
517+
}
518+
519+
define i1 @trunc_signed_nuw_zext(i32 %x, i8 %y) {
520+
; CHECK-LABEL: @trunc_signed_nuw_zext(
521+
; CHECK-NEXT: [[XT:%.*]] = trunc nuw i32 [[X:%.*]] to i16
522+
; CHECK-NEXT: [[YE:%.*]] = zext i8 [[Y:%.*]] to i16
523+
; CHECK-NEXT: [[C:%.*]] = icmp slt i16 [[XT]], [[YE]]
524+
; CHECK-NEXT: ret i1 [[C]]
525+
;
526+
%xt = trunc nuw i32 %x to i16
527+
%ye = zext i8 %y to i16
528+
%c = icmp slt i16 %xt, %ye
529+
ret i1 %c
530+
}
531+
532+
define i1 @trunc_equality_nuw_zext(i32 %x, i8 %y) {
533+
; CHECK-LABEL: @trunc_equality_nuw_zext(
534+
; CHECK-NEXT: [[XT:%.*]] = trunc nuw i32 [[X:%.*]] to i16
535+
; CHECK-NEXT: [[YE:%.*]] = zext i8 [[Y:%.*]] to i16
536+
; CHECK-NEXT: [[C:%.*]] = icmp ne i16 [[XT]], [[YE]]
537+
; CHECK-NEXT: ret i1 [[C]]
538+
;
539+
%xt = trunc nuw i32 %x to i16
540+
%ye = zext i8 %y to i16
541+
%c = icmp ne i16 %xt, %ye
542+
ret i1 %c
543+
}
544+
545+
define i1 @trunc_equality_nuw_sext(i32 %x, i8 %y) {
546+
; CHECK-LABEL: @trunc_equality_nuw_sext(
547+
; CHECK-NEXT: [[XT:%.*]] = trunc nuw i32 [[X:%.*]] to i16
548+
; CHECK-NEXT: [[YE:%.*]] = sext i8 [[Y:%.*]] to i16
549+
; CHECK-NEXT: [[C:%.*]] = icmp ne i16 [[XT]], [[YE]]
550+
; CHECK-NEXT: ret i1 [[C]]
551+
;
552+
%xt = trunc nuw i32 %x to i16
553+
%ye = sext i8 %y to i16
554+
%c = icmp ne i16 %xt, %ye
555+
ret i1 %c
556+
}
557+
558+
define i1 @trunc_equality_nsw_zext(i32 %x, i8 %y) {
559+
; CHECK-LABEL: @trunc_equality_nsw_zext(
560+
; CHECK-NEXT: [[XT:%.*]] = trunc nsw i32 [[X:%.*]] to i16
561+
; CHECK-NEXT: [[YE:%.*]] = zext i8 [[Y:%.*]] to i16
562+
; CHECK-NEXT: [[C:%.*]] = icmp ne i16 [[XT]], [[YE]]
563+
; CHECK-NEXT: ret i1 [[C]]
564+
;
565+
%xt = trunc nsw i32 %x to i16
566+
%ye = zext i8 %y to i16
567+
%c = icmp ne i16 %xt, %ye
568+
ret i1 %c
569+
}
570+
571+
define i1 @trunc_equality_nsw_sext(i32 %x, i8 %y) {
572+
; CHECK-LABEL: @trunc_equality_nsw_sext(
573+
; CHECK-NEXT: [[XT:%.*]] = trunc nsw i32 [[X:%.*]] to i16
574+
; CHECK-NEXT: [[YE:%.*]] = sext i8 [[Y:%.*]] to i16
575+
; CHECK-NEXT: [[C:%.*]] = icmp ne i16 [[XT]], [[YE]]
576+
; CHECK-NEXT: ret i1 [[C]]
577+
;
578+
%xt = trunc nsw i32 %x to i16
579+
%ye = sext i8 %y to i16
580+
%c = icmp ne i16 %xt, %ye
581+
ret i1 %c
582+
}
583+
584+
define i1 @trunc_equality_both_sext(i32 %x, i8 %y) {
585+
; CHECK-LABEL: @trunc_equality_both_sext(
586+
; CHECK-NEXT: [[XT:%.*]] = trunc nuw nsw i32 [[X:%.*]] to i16
587+
; CHECK-NEXT: [[YE:%.*]] = sext i8 [[Y:%.*]] to i16
588+
; CHECK-NEXT: [[C:%.*]] = icmp ne i16 [[XT]], [[YE]]
589+
; CHECK-NEXT: ret i1 [[C]]
590+
;
591+
%xt = trunc nuw nsw i32 %x to i16
592+
%ye = sext i8 %y to i16
593+
%c = icmp ne i16 %xt, %ye
594+
ret i1 %c
595+
}

0 commit comments

Comments
 (0)