Skip to content

Commit 0f70a17

Browse files
committed
[tests] Add tests for ashr/lshr recurrences in isKnownNonZero
1 parent 3cc3c0f commit 0f70a17

File tree

1 file changed

+151
-0
lines changed

1 file changed

+151
-0
lines changed

llvm/test/Analysis/ValueTracking/monotonic-phi.ll

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,3 +474,154 @@ exit:
474474
%cmp = icmp eq i8 %A, 0
475475
ret i1 %cmp
476476
}
477+
478+
479+
define i1 @test_lshr_exact(i8 %p, i8* %pq, i8 %n) {
480+
; CHECK-LABEL: @test_lshr_exact(
481+
; CHECK-NEXT: entry:
482+
; CHECK-NEXT: br label [[LOOP:%.*]]
483+
; CHECK: loop:
484+
; CHECK-NEXT: [[A:%.*]] = phi i8 [ 64, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]
485+
; CHECK-NEXT: [[NEXT]] = lshr exact i8 [[A]], 1
486+
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]
487+
; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]
488+
; CHECK: exit:
489+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A]], 0
490+
; CHECK-NEXT: ret i1 [[CMP]]
491+
;
492+
entry:
493+
br label %loop
494+
loop:
495+
%A = phi i8 [ 64, %entry ], [ %next, %loop ]
496+
%next = lshr exact i8 %A, 1
497+
%cmp1 = icmp eq i8 %A, %n
498+
br i1 %cmp1, label %exit, label %loop
499+
exit:
500+
%cmp = icmp eq i8 %A, 0
501+
ret i1 %cmp
502+
}
503+
504+
define i1 @test_lshr_may_wrap(i8 %p, i8* %pq, i8 %n) {
505+
; CHECK-LABEL: @test_lshr_may_wrap(
506+
; CHECK-NEXT: entry:
507+
; CHECK-NEXT: br label [[LOOP:%.*]]
508+
; CHECK: loop:
509+
; CHECK-NEXT: [[A:%.*]] = phi i8 [ 1, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]
510+
; CHECK-NEXT: [[NEXT]] = lshr i8 [[A]], 1
511+
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]
512+
; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]
513+
; CHECK: exit:
514+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A]], 0
515+
; CHECK-NEXT: ret i1 [[CMP]]
516+
;
517+
entry:
518+
br label %loop
519+
loop:
520+
%A = phi i8 [ 1, %entry ], [ %next, %loop ]
521+
%next = lshr i8 %A, 1
522+
%cmp1 = icmp eq i8 %A, %n
523+
br i1 %cmp1, label %exit, label %loop
524+
exit:
525+
%cmp = icmp eq i8 %A, 0
526+
ret i1 %cmp
527+
}
528+
529+
define i1 @test_lshr_zero_start(i8 %p, i8* %pq, i8 %n) {
530+
; CHECK-LABEL: @test_lshr_zero_start(
531+
; CHECK-NEXT: entry:
532+
; CHECK-NEXT: br label [[LOOP:%.*]]
533+
; CHECK: loop:
534+
; CHECK-NEXT: [[A:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]
535+
; CHECK-NEXT: [[NEXT]] = lshr exact i8 [[A]], 1
536+
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]
537+
; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]
538+
; CHECK: exit:
539+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A]], 0
540+
; CHECK-NEXT: ret i1 [[CMP]]
541+
;
542+
entry:
543+
br label %loop
544+
loop:
545+
%A = phi i8 [ 0, %entry ], [ %next, %loop ]
546+
%next = lshr exact i8 %A, 1
547+
%cmp1 = icmp eq i8 %A, %n
548+
br i1 %cmp1, label %exit, label %loop
549+
exit:
550+
%cmp = icmp eq i8 %A, 0
551+
ret i1 %cmp
552+
}
553+
554+
define i1 @test_ashr_exact(i8 %p, i8* %pq, i8 %n) {
555+
; CHECK-LABEL: @test_ashr_exact(
556+
; CHECK-NEXT: entry:
557+
; CHECK-NEXT: br label [[LOOP:%.*]]
558+
; CHECK: loop:
559+
; CHECK-NEXT: [[A:%.*]] = phi i8 [ 64, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]
560+
; CHECK-NEXT: [[NEXT]] = ashr exact i8 [[A]], 1
561+
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]
562+
; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]
563+
; CHECK: exit:
564+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A]], 0
565+
; CHECK-NEXT: ret i1 [[CMP]]
566+
;
567+
entry:
568+
br label %loop
569+
loop:
570+
%A = phi i8 [ 64, %entry ], [ %next, %loop ]
571+
%next = ashr exact i8 %A, 1
572+
%cmp1 = icmp eq i8 %A, %n
573+
br i1 %cmp1, label %exit, label %loop
574+
exit:
575+
%cmp = icmp eq i8 %A, 0
576+
ret i1 %cmp
577+
}
578+
579+
define i1 @test_ashr_may_wrap(i8 %p, i8* %pq, i8 %n) {
580+
; CHECK-LABEL: @test_ashr_may_wrap(
581+
; CHECK-NEXT: entry:
582+
; CHECK-NEXT: br label [[LOOP:%.*]]
583+
; CHECK: loop:
584+
; CHECK-NEXT: [[A:%.*]] = phi i8 [ 1, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]
585+
; CHECK-NEXT: [[NEXT]] = ashr i8 [[A]], 1
586+
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]
587+
; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]
588+
; CHECK: exit:
589+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A]], 0
590+
; CHECK-NEXT: ret i1 [[CMP]]
591+
;
592+
entry:
593+
br label %loop
594+
loop:
595+
%A = phi i8 [ 1, %entry ], [ %next, %loop ]
596+
%next = ashr i8 %A, 1
597+
%cmp1 = icmp eq i8 %A, %n
598+
br i1 %cmp1, label %exit, label %loop
599+
exit:
600+
%cmp = icmp eq i8 %A, 0
601+
ret i1 %cmp
602+
}
603+
604+
define i1 @test_ashr_zero_start(i8 %p, i8* %pq, i8 %n) {
605+
; CHECK-LABEL: @test_ashr_zero_start(
606+
; CHECK-NEXT: entry:
607+
; CHECK-NEXT: br label [[LOOP:%.*]]
608+
; CHECK: loop:
609+
; CHECK-NEXT: [[A:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]
610+
; CHECK-NEXT: [[NEXT]] = ashr exact i8 [[A]], 1
611+
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]
612+
; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]
613+
; CHECK: exit:
614+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A]], 0
615+
; CHECK-NEXT: ret i1 [[CMP]]
616+
;
617+
entry:
618+
br label %loop
619+
loop:
620+
%A = phi i8 [ 0, %entry ], [ %next, %loop ]
621+
%next = ashr exact i8 %A, 1
622+
%cmp1 = icmp eq i8 %A, %n
623+
br i1 %cmp1, label %exit, label %loop
624+
exit:
625+
%cmp = icmp eq i8 %A, 0
626+
ret i1 %cmp
627+
}

0 commit comments

Comments
 (0)