@@ -400,3 +400,214 @@ define i1 @nonzero_reduce_or_fail(<2 x i8> %xx) {
400400 %r = icmp eq i8 %v , 0
401401 ret i1 %r
402402}
403+
404+ define i1 @src_x_add_x_eq_0 (i8 %x ) {
405+ ; CHECK-LABEL: @src_x_add_x_eq_0(
406+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
407+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X_EQ_0]] to i8
408+ ; CHECK-NEXT: [[V:%.*]] = add i8 [[X]], [[Y]]
409+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
410+ ; CHECK-NEXT: ret i1 [[R]]
411+ ;
412+ %x_eq_0 = icmp eq i8 %x , 0
413+ %y = zext i1 %x_eq_0 to i8
414+ %v = add i8 %x , %y
415+ %r = icmp eq i8 %v , 0
416+ ret i1 %r
417+ }
418+
419+ define i1 @src_x_add_x_eq_1_fail (i8 %x ) {
420+ ; CHECK-LABEL: @src_x_add_x_eq_1_fail(
421+ ; CHECK-NEXT: [[X_EQ_1:%.*]] = icmp eq i8 [[X:%.*]], 1
422+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X_EQ_1]] to i8
423+ ; CHECK-NEXT: [[V:%.*]] = add i8 [[X]], [[Y]]
424+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
425+ ; CHECK-NEXT: ret i1 [[R]]
426+ ;
427+ %x_eq_1 = icmp eq i8 %x , 1
428+ %y = zext i1 %x_eq_1 to i8
429+ %v = add i8 %x , %y
430+ %r = icmp eq i8 %v , 0
431+ ret i1 %r
432+ }
433+
434+ define i1 @src_x_or_x_eq_0 (i8 %x ) {
435+ ; CHECK-LABEL: @src_x_or_x_eq_0(
436+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
437+ ; CHECK-NEXT: [[Y:%.*]] = sext i1 [[X_EQ_0]] to i8
438+ ; CHECK-NEXT: [[V:%.*]] = or i8 [[X]], [[Y]]
439+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
440+ ; CHECK-NEXT: ret i1 [[R]]
441+ ;
442+ %x_eq_0 = icmp eq i8 %x , 0
443+ %y = sext i1 %x_eq_0 to i8
444+ %v = or i8 %x , %y
445+ %r = icmp eq i8 %v , 0
446+ ret i1 %r
447+ }
448+
449+ define i1 @src_x_or_x_sle_0_fail (i8 %x ) {
450+ ; CHECK-LABEL: @src_x_or_x_sle_0_fail(
451+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp sle i8 [[X:%.*]], 0
452+ ; CHECK-NEXT: [[Y:%.*]] = sext i1 [[X_EQ_0]] to i8
453+ ; CHECK-NEXT: [[V:%.*]] = or i8 [[X]], [[Y]]
454+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
455+ ; CHECK-NEXT: ret i1 [[R]]
456+ ;
457+ %x_eq_0 = icmp sle i8 %x , 0
458+ %y = sext i1 %x_eq_0 to i8
459+ %v = or i8 %x , %y
460+ %r = icmp eq i8 %v , 0
461+ ret i1 %r
462+ }
463+
464+ define i1 @src_x_xor_x_eq_0 (i8 %x ) {
465+ ; CHECK-LABEL: @src_x_xor_x_eq_0(
466+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
467+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X_EQ_0]] to i8
468+ ; CHECK-NEXT: [[V:%.*]] = xor i8 [[X]], [[Y]]
469+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
470+ ; CHECK-NEXT: ret i1 [[R]]
471+ ;
472+ %x_eq_0 = icmp eq i8 %x , 0
473+ %y = zext i1 %x_eq_0 to i8
474+ %v = xor i8 %x , %y
475+ %r = icmp eq i8 %v , 0
476+ ret i1 %r
477+ }
478+
479+ define i1 @src_x_xor_x_ne_0_fail (i8 %x ) {
480+ ; CHECK-LABEL: @src_x_xor_x_ne_0_fail(
481+ ; CHECK-NEXT: [[X_NE_0:%.*]] = icmp ne i8 [[X:%.*]], 0
482+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X_NE_0]] to i8
483+ ; CHECK-NEXT: [[V:%.*]] = xor i8 [[X]], [[Y]]
484+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
485+ ; CHECK-NEXT: ret i1 [[R]]
486+ ;
487+ %x_ne_0 = icmp ne i8 %x , 0
488+ %y = zext i1 %x_ne_0 to i8
489+ %v = xor i8 %x , %y
490+ %r = icmp eq i8 %v , 0
491+ ret i1 %r
492+ }
493+
494+ define i1 @src_x_sub0_x_eq_0 (i8 %x ) {
495+ ; CHECK-LABEL: @src_x_sub0_x_eq_0(
496+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
497+ ; CHECK-NEXT: [[Y:%.*]] = sext i1 [[X_EQ_0]] to i8
498+ ; CHECK-NEXT: [[V:%.*]] = sub i8 [[X]], [[Y]]
499+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
500+ ; CHECK-NEXT: ret i1 [[R]]
501+ ;
502+ %x_eq_0 = icmp eq i8 %x , 0
503+ %y = sext i1 %x_eq_0 to i8
504+ %v = sub i8 %x , %y
505+ %r = icmp eq i8 %v , 0
506+ ret i1 %r
507+ }
508+
509+ define i1 @src_x_sub0_z_eq_0_fail (i8 %x , i8 %z ) {
510+ ; CHECK-LABEL: @src_x_sub0_z_eq_0_fail(
511+ ; CHECK-NEXT: [[Z_EQ_0:%.*]] = icmp eq i8 [[Z:%.*]], 0
512+ ; CHECK-NEXT: [[Y:%.*]] = sext i1 [[Z_EQ_0]] to i8
513+ ; CHECK-NEXT: [[V:%.*]] = sub i8 [[X:%.*]], [[Y]]
514+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
515+ ; CHECK-NEXT: ret i1 [[R]]
516+ ;
517+ %z_eq_0 = icmp eq i8 %z , 0
518+ %y = sext i1 %z_eq_0 to i8
519+ %v = sub i8 %x , %y
520+ %r = icmp eq i8 %v , 0
521+ ret i1 %r
522+ }
523+
524+ define i1 @src_x_sub1_x_eq_0 (i8 %x ) {
525+ ; CHECK-LABEL: @src_x_sub1_x_eq_0(
526+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
527+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X_EQ_0]] to i8
528+ ; CHECK-NEXT: [[V:%.*]] = sub i8 [[Y]], [[X]]
529+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
530+ ; CHECK-NEXT: ret i1 [[R]]
531+ ;
532+ %x_eq_0 = icmp eq i8 %x , 0
533+ %y = zext i1 %x_eq_0 to i8
534+ %v = sub i8 %y , %x
535+ %r = icmp eq i8 %v , 0
536+ ret i1 %r
537+ }
538+
539+ define i1 @src_x_sub1_x_eq_0_or_fail (i8 %x , i1 %c1 ) {
540+ ; CHECK-LABEL: @src_x_sub1_x_eq_0_or_fail(
541+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
542+ ; CHECK-NEXT: [[X_EQ_0_OR:%.*]] = or i1 [[X_EQ_0]], [[C1:%.*]]
543+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X_EQ_0_OR]] to i8
544+ ; CHECK-NEXT: [[V:%.*]] = sub i8 [[Y]], [[X]]
545+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
546+ ; CHECK-NEXT: ret i1 [[R]]
547+ ;
548+ %x_eq_0 = icmp eq i8 %x , 0
549+ %x_eq_0_or = or i1 %x_eq_0 , %c1
550+ %y = zext i1 %x_eq_0_or to i8
551+ %v = sub i8 %y , %x
552+ %r = icmp eq i8 %v , 0
553+ ret i1 %r
554+ }
555+
556+ define i1 @src_x_umax_x_eq_0 (i8 %x ) {
557+ ; CHECK-LABEL: @src_x_umax_x_eq_0(
558+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
559+ ; CHECK-NEXT: [[Y:%.*]] = sext i1 [[X_EQ_0]] to i8
560+ ; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]])
561+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
562+ ; CHECK-NEXT: ret i1 [[R]]
563+ ;
564+ %x_eq_0 = icmp eq i8 %x , 0
565+ %y = sext i1 %x_eq_0 to i8
566+ %v = call i8 @llvm.umax.i8 (i8 %y , i8 %x )
567+ %r = icmp eq i8 %v , 0
568+ ret i1 %r
569+ }
570+
571+ define i1 @src_x_umax_x_ugt_10_fail (i8 %x ) {
572+ ; CHECK-LABEL: @src_x_umax_x_ugt_10_fail(
573+ ; CHECK-NEXT: [[X_UGT_10:%.*]] = icmp ugt i8 [[X:%.*]], 10
574+ ; CHECK-NEXT: [[Y:%.*]] = sext i1 [[X_UGT_10]] to i8
575+ ; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]])
576+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
577+ ; CHECK-NEXT: ret i1 [[R]]
578+ ;
579+ %x_ugt_10 = icmp ugt i8 %x , 10
580+ %y = sext i1 %x_ugt_10 to i8
581+ %v = call i8 @llvm.umax.i8 (i8 %y , i8 %x )
582+ %r = icmp eq i8 %v , 0
583+ ret i1 %r
584+ }
585+
586+ define i1 @src_x_uadd.sat_x_eq_0 (i8 %x ) {
587+ ; CHECK-LABEL: @src_x_uadd.sat_x_eq_0(
588+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
589+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X_EQ_0]] to i8
590+ ; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[Y]], i8 [[X]])
591+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
592+ ; CHECK-NEXT: ret i1 [[R]]
593+ ;
594+ %x_eq_0 = icmp eq i8 %x , 0
595+ %y = zext i1 %x_eq_0 to i8
596+ %v = call i8 @llvm.uadd.sat.i8 (i8 %y , i8 %x )
597+ %r = icmp eq i8 %v , 0
598+ ret i1 %r
599+ }
600+
601+ define i1 @src_x_uadd.sat_c1_fail (i8 %x , i1 %c1 ) {
602+ ; CHECK-LABEL: @src_x_uadd.sat_c1_fail(
603+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[C1:%.*]] to i8
604+ ; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[Y]], i8 [[X:%.*]])
605+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
606+ ; CHECK-NEXT: ret i1 [[R]]
607+ ;
608+ %y = zext i1 %c1 to i8
609+ %v = call i8 @llvm.uadd.sat.i8 (i8 %y , i8 %x )
610+ %r = icmp eq i8 %v , 0
611+ ret i1 %r
612+ }
613+
0 commit comments