Skip to content

Commit 906deaa

Browse files
committed
[CVP] Add additional tests for clamp patterns (NFC)
These are the same as the existing tests, but using different predicates that are not handled by the current code.
1 parent 10a7289 commit 906deaa

File tree

1 file changed

+113
-1
lines changed
  • llvm/test/Transforms/CorrelatedValuePropagation

1 file changed

+113
-1
lines changed

llvm/test/Transforms/CorrelatedValuePropagation/basic.ll

Lines changed: 113 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,62 @@ out:
578578
ret i1 false
579579
}
580580

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+
581637
define i1 @clamp_high1(i32 %a) {
582638
; CHECK-LABEL: @clamp_high1(
583639
; CHECK-NEXT: entry:
@@ -632,13 +688,69 @@ out:
632688
ret i1 false
633689
}
634690

635-
; Just showing arbitrary constants work, not really a clamp
636691
define i1 @clamp_high3(i32 %a) {
637692
; CHECK-LABEL: @clamp_high3(
638693
; CHECK-NEXT: entry:
639694
; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[A:%.*]], 5
640695
; CHECK-NEXT: br i1 [[CMP]], label [[A_GUARD:%.*]], label [[OUT:%.*]]
641696
; 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:
642754
; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp ne i32 [[A]], 5
643755
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 100
644756
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[SEL_CMP]], i32 [[ADD]], i32 5

0 commit comments

Comments
 (0)