@@ -578,6 +578,62 @@ out:
578
578
ret i1 false
579
579
}
580
580
581
+ define i1 @clamp_low3 (i32 %a ) {
582
+ ; CHECK-LABEL: @clamp_low3(
583
+ ; CHECK-NEXT: entry:
584
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[A:%.*]], 5
585
+ ; CHECK-NEXT: br i1 [[CMP]], label [[A_GUARD:%.*]], label [[OUT:%.*]]
586
+ ; CHECK: a_guard:
587
+ ; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp sgt i32 [[A]], 5
588
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], -1
589
+ ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[SEL_CMP]], i32 [[ADD]], i32 5
590
+ ; CHECK-NEXT: [[RES:%.*]] = icmp eq i32 [[SEL]], 4
591
+ ; CHECK-NEXT: ret i1 [[RES]]
592
+ ; CHECK: out:
593
+ ; CHECK-NEXT: ret i1 false
594
+ ;
595
+ entry:
596
+ %cmp = icmp sge i32 %a , 5
597
+ br i1 %cmp , label %a_guard , label %out
598
+
599
+ a_guard:
600
+ %sel_cmp = icmp sgt i32 %a , 5
601
+ %add = add i32 %a , -1
602
+ %sel = select i1 %sel_cmp , i32 %add , i32 5
603
+ %res = icmp eq i32 %sel , 4
604
+ ret i1 %res
605
+ out:
606
+ ret i1 false
607
+ }
608
+
609
+ define i1 @clamp_low4 (i32 %a ) {
610
+ ; CHECK-LABEL: @clamp_low4(
611
+ ; CHECK-NEXT: entry:
612
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[A:%.*]], 5
613
+ ; CHECK-NEXT: br i1 [[CMP]], label [[A_GUARD:%.*]], label [[OUT:%.*]]
614
+ ; CHECK: a_guard:
615
+ ; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp sle i32 [[A]], 5
616
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], -1
617
+ ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[SEL_CMP]], i32 5, i32 [[ADD]]
618
+ ; CHECK-NEXT: [[RES:%.*]] = icmp eq i32 [[SEL]], 4
619
+ ; CHECK-NEXT: ret i1 [[RES]]
620
+ ; CHECK: out:
621
+ ; CHECK-NEXT: ret i1 false
622
+ ;
623
+ entry:
624
+ %cmp = icmp sge i32 %a , 5
625
+ br i1 %cmp , label %a_guard , label %out
626
+
627
+ a_guard:
628
+ %sel_cmp = icmp sle i32 %a , 5
629
+ %add = add i32 %a , -1
630
+ %sel = select i1 %sel_cmp , i32 5 , i32 %add
631
+ %res = icmp eq i32 %sel , 4
632
+ ret i1 %res
633
+ out:
634
+ ret i1 false
635
+ }
636
+
581
637
define i1 @clamp_high1 (i32 %a ) {
582
638
; CHECK-LABEL: @clamp_high1(
583
639
; CHECK-NEXT: entry:
@@ -632,13 +688,69 @@ out:
632
688
ret i1 false
633
689
}
634
690
635
- ; Just showing arbitrary constants work, not really a clamp
636
691
define i1 @clamp_high3 (i32 %a ) {
637
692
; CHECK-LABEL: @clamp_high3(
638
693
; CHECK-NEXT: entry:
639
694
; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[A:%.*]], 5
640
695
; CHECK-NEXT: br i1 [[CMP]], label [[A_GUARD:%.*]], label [[OUT:%.*]]
641
696
; CHECK: a_guard:
697
+ ; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp slt i32 [[A]], 5
698
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
699
+ ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[SEL_CMP]], i32 [[ADD]], i32 5
700
+ ; CHECK-NEXT: [[RES:%.*]] = icmp eq i32 [[SEL]], 6
701
+ ; CHECK-NEXT: ret i1 [[RES]]
702
+ ; CHECK: out:
703
+ ; CHECK-NEXT: ret i1 false
704
+ ;
705
+ entry:
706
+ %cmp = icmp sle i32 %a , 5
707
+ br i1 %cmp , label %a_guard , label %out
708
+
709
+ a_guard:
710
+ %sel_cmp = icmp slt i32 %a , 5
711
+ %add = add i32 %a , 1
712
+ %sel = select i1 %sel_cmp , i32 %add , i32 5
713
+ %res = icmp eq i32 %sel , 6
714
+ ret i1 %res
715
+ out:
716
+ ret i1 false
717
+ }
718
+
719
+ define i1 @clamp_high4 (i32 %a ) {
720
+ ; CHECK-LABEL: @clamp_high4(
721
+ ; CHECK-NEXT: entry:
722
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[A:%.*]], 5
723
+ ; CHECK-NEXT: br i1 [[CMP]], label [[A_GUARD:%.*]], label [[OUT:%.*]]
724
+ ; CHECK: a_guard:
725
+ ; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp sge i32 [[A]], 5
726
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
727
+ ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[SEL_CMP]], i32 5, i32 [[ADD]]
728
+ ; CHECK-NEXT: [[RES:%.*]] = icmp eq i32 [[SEL]], 6
729
+ ; CHECK-NEXT: ret i1 [[RES]]
730
+ ; CHECK: out:
731
+ ; CHECK-NEXT: ret i1 false
732
+ ;
733
+ entry:
734
+ %cmp = icmp sle i32 %a , 5
735
+ br i1 %cmp , label %a_guard , label %out
736
+
737
+ a_guard:
738
+ %sel_cmp = icmp sge i32 %a , 5
739
+ %add = add i32 %a , 1
740
+ %sel = select i1 %sel_cmp , i32 5 , i32 %add
741
+ %res = icmp eq i32 %sel , 6
742
+ ret i1 %res
743
+ out:
744
+ ret i1 false
745
+ }
746
+
747
+ ; Just showing arbitrary constants work, not really a clamp
748
+ define i1 @not_clamp_high (i32 %a ) {
749
+ ; CHECK-LABEL: @not_clamp_high(
750
+ ; CHECK-NEXT: entry:
751
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[A:%.*]], 5
752
+ ; CHECK-NEXT: br i1 [[CMP]], label [[A_GUARD:%.*]], label [[OUT:%.*]]
753
+ ; CHECK: a_guard:
642
754
; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp ne i32 [[A]], 5
643
755
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 100
644
756
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[SEL_CMP]], i32 [[ADD]], i32 5
0 commit comments