Skip to content

Commit 17beeb1

Browse files
committed
[ValueTracking] Add tests for isKnowNonZero of X op (X != 0); NFC
1 parent dfafe38 commit 17beeb1

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

0 commit comments

Comments
 (0)