Skip to content

Commit bf7eb96

Browse files
committed
[ValueTracking] Add tests for isKnowNonZero of X op (X != 0); NFC
1 parent 88da875 commit bf7eb96

File tree

1 file changed

+211
-0
lines changed

1 file changed

+211
-0
lines changed

llvm/test/Transforms/InstSimplify/known-non-zero.ll

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)