@@ -407,4 +407,220 @@ define i1 @test13(i8 %x, i64* %p) {
407
407
ret i1 %cmp
408
408
}
409
409
410
+ define i1 @test14 (i32 %a , i32 %b ) {
411
+ ; CHECK-LABEL: @test14(
412
+ ; CHECK-NEXT: begin:
413
+ ; CHECK-NEXT: [[CMP0:%.*]] = icmp sge i32 [[A:%.*]], 0
414
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[B:%.*]], 0
415
+ ; CHECK-NEXT: [[BR:%.*]] = and i1 [[CMP0]], [[CMP1]]
416
+ ; CHECK-NEXT: br i1 [[BR]], label [[BB:%.*]], label [[EXIT:%.*]]
417
+ ; CHECK: bb:
418
+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[A]], [[B]]
419
+ ; CHECK-NEXT: br label [[CONT:%.*]]
420
+ ; CHECK: cont:
421
+ ; CHECK-NEXT: [[RES:%.*]] = icmp sge i32 [[SUB]], 0
422
+ ; CHECK-NEXT: br label [[EXIT]]
423
+ ; CHECK: exit:
424
+ ; CHECK-NEXT: [[IV:%.*]] = phi i1 [ true, [[BEGIN:%.*]] ], [ [[RES]], [[CONT]] ]
425
+ ; CHECK-NEXT: ret i1 [[IV]]
426
+ ;
427
+ begin:
428
+ %cmp0 = icmp sge i32 %a , 0
429
+ %cmp1 = icmp sge i32 %b , 0
430
+ %br = and i1 %cmp0 , %cmp1
431
+ br i1 %br , label %bb , label %exit
432
+
433
+ bb:
434
+ %sub = sub i32 %a , %b
435
+ br label %cont
436
+
437
+ cont:
438
+ %res = icmp sge i32 %sub , 0
439
+ br label %exit
440
+
441
+ exit:
442
+ %iv = phi i1 [ true , %begin ], [ %res , %cont ]
443
+ ret i1 %iv
444
+ }
445
+
446
+ define i1 @test15 (i32 %a , i32 %b ) {
447
+ ; CHECK-LABEL: @test15(
448
+ ; CHECK-NEXT: begin:
449
+ ; CHECK-NEXT: [[CMP0:%.*]] = icmp sge i32 [[A:%.*]], 0
450
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[B:%.*]], 0
451
+ ; CHECK-NEXT: [[BR:%.*]] = and i1 [[CMP0]], [[CMP1]]
452
+ ; CHECK-NEXT: br i1 [[BR]], label [[BB:%.*]], label [[EXIT:%.*]]
453
+ ; CHECK: bb:
454
+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[A]], [[B]]
455
+ ; CHECK-NEXT: br label [[CONT:%.*]]
456
+ ; CHECK: cont:
457
+ ; CHECK-NEXT: [[RES:%.*]] = icmp sge i32 [[SUB]], 0
458
+ ; CHECK-NEXT: br label [[EXIT]]
459
+ ; CHECK: exit:
460
+ ; CHECK-NEXT: [[IV:%.*]] = phi i1 [ true, [[BEGIN:%.*]] ], [ [[RES]], [[CONT]] ]
461
+ ; CHECK-NEXT: ret i1 [[IV]]
462
+ ;
463
+ begin:
464
+ %cmp0 = icmp sge i32 %a , 0
465
+ %cmp1 = icmp sge i32 %b , 0
466
+ %br = and i1 %cmp0 , %cmp1
467
+ br i1 %br , label %bb , label %exit
468
+
469
+ bb:
470
+ %sub = sub nsw i32 %a , %b
471
+ br label %cont
472
+
473
+ cont:
474
+ %res = icmp sge i32 %sub , 0
475
+ br label %exit
476
+
477
+ exit:
478
+ %iv = phi i1 [ true , %begin ], [ %res , %cont ]
479
+ ret i1 %iv
480
+ }
481
+
482
+ define i1 @test16 (i32 %a , i32 %b ) {
483
+ ; CHECK-LABEL: @test16(
484
+ ; CHECK-NEXT: begin:
485
+ ; CHECK-NEXT: [[CMP0:%.*]] = icmp sge i32 [[A:%.*]], 0
486
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[B:%.*]], 0
487
+ ; CHECK-NEXT: [[BR:%.*]] = and i1 [[CMP0]], [[CMP1]]
488
+ ; CHECK-NEXT: br i1 [[BR]], label [[BB:%.*]], label [[EXIT:%.*]]
489
+ ; CHECK: bb:
490
+ ; CHECK-NEXT: [[SUB:%.*]] = sub nuw nsw i32 [[A]], [[B]]
491
+ ; CHECK-NEXT: br label [[CONT:%.*]]
492
+ ; CHECK: cont:
493
+ ; CHECK-NEXT: [[RES:%.*]] = icmp sge i32 [[SUB]], 0
494
+ ; CHECK-NEXT: br label [[EXIT]]
495
+ ; CHECK: exit:
496
+ ; CHECK-NEXT: [[IV:%.*]] = phi i1 [ true, [[BEGIN:%.*]] ], [ [[RES]], [[CONT]] ]
497
+ ; CHECK-NEXT: ret i1 [[IV]]
498
+ ;
499
+ begin:
500
+ %cmp0 = icmp sge i32 %a , 0
501
+ %cmp1 = icmp sge i32 %b , 0
502
+ %br = and i1 %cmp0 , %cmp1
503
+ br i1 %br , label %bb , label %exit
504
+
505
+ bb:
506
+ %sub = sub nuw i32 %a , %b
507
+ br label %cont
508
+
509
+ cont:
510
+ %res = icmp sge i32 %sub , 0
511
+ br label %exit
512
+
513
+ exit:
514
+ %iv = phi i1 [ true , %begin ], [ %res , %cont ]
515
+ ret i1 %iv
516
+ }
517
+
518
+ define i1 @test17 (i32 %a , i32 %b ) {
519
+ ; CHECK-LABEL: @test17(
520
+ ; CHECK-NEXT: begin:
521
+ ; CHECK-NEXT: [[CMP0:%.*]] = icmp sle i32 [[A:%.*]], 0
522
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[B:%.*]], 0
523
+ ; CHECK-NEXT: [[BR:%.*]] = and i1 [[CMP0]], [[CMP1]]
524
+ ; CHECK-NEXT: br i1 [[BR]], label [[BB:%.*]], label [[EXIT:%.*]]
525
+ ; CHECK: bb:
526
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A]], [[B]]
527
+ ; CHECK-NEXT: br label [[CONT:%.*]]
528
+ ; CHECK: cont:
529
+ ; CHECK-NEXT: [[RES:%.*]] = icmp sle i32 [[SUB]], 0
530
+ ; CHECK-NEXT: br label [[EXIT]]
531
+ ; CHECK: exit:
532
+ ; CHECK-NEXT: [[IV:%.*]] = phi i1 [ true, [[BEGIN:%.*]] ], [ [[RES]], [[CONT]] ]
533
+ ; CHECK-NEXT: ret i1 [[IV]]
534
+ ;
535
+ begin:
536
+ %cmp0 = icmp sle i32 %a , 0
537
+ %cmp1 = icmp sge i32 %b , 0
538
+ %br = and i1 %cmp0 , %cmp1
539
+ br i1 %br , label %bb , label %exit
540
+
541
+ bb:
542
+ %sub = sub i32 %a , %b
543
+ br label %cont
544
+
545
+ cont:
546
+ %res = icmp sle i32 %sub , 0
547
+ br label %exit
548
+
549
+ exit:
550
+ %iv = phi i1 [ true , %begin ], [ %res , %cont ]
551
+ ret i1 %iv
552
+ }
553
+
554
+ define i1 @test18 (i32 %a , i32 %b ) {
555
+ ; CHECK-LABEL: @test18(
556
+ ; CHECK-NEXT: begin:
557
+ ; CHECK-NEXT: [[CMP0:%.*]] = icmp sle i32 [[A:%.*]], 0
558
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[B:%.*]], 0
559
+ ; CHECK-NEXT: [[BR:%.*]] = and i1 [[CMP0]], [[CMP1]]
560
+ ; CHECK-NEXT: br i1 [[BR]], label [[BB:%.*]], label [[EXIT:%.*]]
561
+ ; CHECK: bb:
562
+ ; CHECK-NEXT: [[SUB:%.*]] = sub nuw i32 [[A]], [[B]]
563
+ ; CHECK-NEXT: br label [[CONT:%.*]]
564
+ ; CHECK: cont:
565
+ ; CHECK-NEXT: [[RES:%.*]] = icmp sle i32 [[SUB]], 0
566
+ ; CHECK-NEXT: br label [[EXIT]]
567
+ ; CHECK: exit:
568
+ ; CHECK-NEXT: [[IV:%.*]] = phi i1 [ true, [[BEGIN:%.*]] ], [ [[RES]], [[CONT]] ]
569
+ ; CHECK-NEXT: ret i1 [[IV]]
570
+ ;
571
+ begin:
572
+ %cmp0 = icmp sle i32 %a , 0
573
+ %cmp1 = icmp sge i32 %b , 0
574
+ %br = and i1 %cmp0 , %cmp1
575
+ br i1 %br , label %bb , label %exit
576
+
577
+ bb:
578
+ %sub = sub nuw i32 %a , %b
579
+ br label %cont
580
+
581
+ cont:
582
+ %res = icmp sle i32 %sub , 0
583
+ br label %exit
584
+
585
+ exit:
586
+ %iv = phi i1 [ true , %begin ], [ %res , %cont ]
587
+ ret i1 %iv
588
+ }
589
+
590
+ define i1 @test19 (i32 %a , i32 %b ) {
591
+ ; CHECK-LABEL: @test19(
592
+ ; CHECK-NEXT: begin:
593
+ ; CHECK-NEXT: [[CMP0:%.*]] = icmp sle i32 [[A:%.*]], 0
594
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[B:%.*]], 0
595
+ ; CHECK-NEXT: [[BR:%.*]] = and i1 [[CMP0]], [[CMP1]]
596
+ ; CHECK-NEXT: br i1 [[BR]], label [[BB:%.*]], label [[EXIT:%.*]]
597
+ ; CHECK: bb:
598
+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[A]], [[B]]
599
+ ; CHECK-NEXT: br label [[CONT:%.*]]
600
+ ; CHECK: cont:
601
+ ; CHECK-NEXT: [[RES:%.*]] = icmp sle i32 [[SUB]], 0
602
+ ; CHECK-NEXT: br label [[EXIT]]
603
+ ; CHECK: exit:
604
+ ; CHECK-NEXT: [[IV:%.*]] = phi i1 [ true, [[BEGIN:%.*]] ], [ [[RES]], [[CONT]] ]
605
+ ; CHECK-NEXT: ret i1 [[IV]]
606
+ ;
607
+ begin:
608
+ %cmp0 = icmp sle i32 %a , 0
609
+ %cmp1 = icmp sge i32 %b , 0
610
+ %br = and i1 %cmp0 , %cmp1
611
+ br i1 %br , label %bb , label %exit
612
+
613
+ bb:
614
+ %sub = sub nsw i32 %a , %b
615
+ br label %cont
616
+
617
+ cont:
618
+ %res = icmp sle i32 %sub , 0
619
+ br label %exit
620
+
621
+ exit:
622
+ %iv = phi i1 [ true , %begin ], [ %res , %cont ]
623
+ ret i1 %iv
624
+ }
625
+
410
626
attributes #4 = { noreturn }
0 commit comments