@@ -474,3 +474,154 @@ exit:
474
474
%cmp = icmp eq i8 %A , 0
475
475
ret i1 %cmp
476
476
}
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