@@ -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