forked from OSchip/llvm-project
[InstCombine] add baseline tests for D38531; NFC
llvm-svn: 315461
This commit is contained in:
parent
34fd5eaaf0
commit
8d565a233d
|
@ -361,7 +361,7 @@ define i32 @test75(i32 %x) {
|
|||
ret i32 %retval
|
||||
}
|
||||
|
||||
; The next 4 tests are value clamping with constants:
|
||||
; The next 10 tests are value clamping with constants:
|
||||
; https://llvm.org/bugs/show_bug.cgi?id=31693
|
||||
|
||||
; (X <s C1) ? C1 : SMIN(X, C2) ==> SMAX(SMIN(X, C2), C1)
|
||||
|
@ -398,6 +398,40 @@ define i32 @clamp_signed2(i32 %x) {
|
|||
ret i32 %r
|
||||
}
|
||||
|
||||
; (X >s C1) ? SMIN(X, C2) : C1 ==> SMAX(SMIN(X, C2), C1)
|
||||
|
||||
define i32 @clamp_signed3(i32 %x) {
|
||||
; CHECK-LABEL: @clamp_signed3(
|
||||
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[X:%.*]], 255
|
||||
; CHECK-NEXT: [[MIN:%.*]] = select i1 [[CMP2]], i32 [[X]], i32 255
|
||||
; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[X]], 15
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP1]], i32 [[MIN]], i32 15
|
||||
; CHECK-NEXT: ret i32 [[R]]
|
||||
;
|
||||
%cmp2 = icmp slt i32 %x, 255
|
||||
%min = select i1 %cmp2, i32 %x, i32 255
|
||||
%cmp1 = icmp sgt i32 %x, 15
|
||||
%r = select i1 %cmp1, i32 %min, i32 15
|
||||
ret i32 %r
|
||||
}
|
||||
|
||||
; (X <s C1) ? SMAX(X, C2) : C1 ==> SMIN(SMAX(X, C1), C2)
|
||||
|
||||
define i32 @clamp_signed4(i32 %x) {
|
||||
; CHECK-LABEL: @clamp_signed4(
|
||||
; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[X:%.*]], 15
|
||||
; CHECK-NEXT: [[MAX:%.*]] = select i1 [[CMP2]], i32 [[X]], i32 15
|
||||
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[X]], 255
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP1]], i32 [[MAX]], i32 255
|
||||
; CHECK-NEXT: ret i32 [[R]]
|
||||
;
|
||||
%cmp2 = icmp sgt i32 %x, 15
|
||||
%max = select i1 %cmp2, i32 %x, i32 15
|
||||
%cmp1 = icmp slt i32 %x, 255
|
||||
%r = select i1 %cmp1, i32 %max, i32 255
|
||||
ret i32 %r
|
||||
}
|
||||
|
||||
; (X <u C1) ? C1 : UMIN(X, C2) ==> UMAX(UMIN(X, C2), C1)
|
||||
|
||||
define i32 @clamp_unsigned1(i32 %x) {
|
||||
|
@ -432,6 +466,74 @@ define i32 @clamp_unsigned2(i32 %x) {
|
|||
ret i32 %r
|
||||
}
|
||||
|
||||
; (X >u C1) ? UMIN(X, C2) : C1 ==> UMAX(UMIN(X, C2), C1)
|
||||
|
||||
define i32 @clamp_unsigned3(i32 %x) {
|
||||
; CHECK-LABEL: @clamp_unsigned3(
|
||||
; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i32 [[X:%.*]], 255
|
||||
; CHECK-NEXT: [[MIN:%.*]] = select i1 [[CMP2]], i32 [[X]], i32 255
|
||||
; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i32 [[X]], 15
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP1]], i32 [[MIN]], i32 15
|
||||
; CHECK-NEXT: ret i32 [[R]]
|
||||
;
|
||||
%cmp2 = icmp ult i32 %x, 255
|
||||
%min = select i1 %cmp2, i32 %x, i32 255
|
||||
%cmp1 = icmp ugt i32 %x, 15
|
||||
%r = select i1 %cmp1, i32 %min, i32 15
|
||||
ret i32 %r
|
||||
}
|
||||
|
||||
; (X <u C1) ? UMAX(X, C2) : C1 ==> UMIN(UMAX(X, C2), C1)
|
||||
|
||||
define i32 @clamp_unsigned4(i32 %x) {
|
||||
; CHECK-LABEL: @clamp_unsigned4(
|
||||
; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i32 [[X:%.*]], 15
|
||||
; CHECK-NEXT: [[MAX:%.*]] = select i1 [[CMP2]], i32 [[X]], i32 15
|
||||
; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i32 [[X]], 255
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP1]], i32 [[MAX]], i32 255
|
||||
; CHECK-NEXT: ret i32 [[R]]
|
||||
;
|
||||
%cmp2 = icmp ugt i32 %x, 15
|
||||
%max = select i1 %cmp2, i32 %x, i32 15
|
||||
%cmp1 = icmp ult i32 %x, 255
|
||||
%r = select i1 %cmp1, i32 %max, i32 255
|
||||
ret i32 %r
|
||||
}
|
||||
|
||||
; Check that clamp is recognized and there is no infinite
|
||||
; loop because of reverse cmp transformation:
|
||||
; (icmp sgt smin(PositiveA, B) 0) -> (icmp sgt B 0)
|
||||
define i32 @clamp_check_for_no_infinite_loop1(i32 %i) {
|
||||
; CHECK-LABEL: @clamp_check_for_no_infinite_loop1(
|
||||
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[I:%.*]], 255
|
||||
; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP1]], i32 [[I]], i32 255
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i32 [[I]], 0
|
||||
; CHECK-NEXT: [[RES:%.*]] = select i1 [[TMP1]], i32 [[SEL1]], i32 0
|
||||
; CHECK-NEXT: ret i32 [[RES]]
|
||||
;
|
||||
%cmp1 = icmp slt i32 %i, 255
|
||||
%sel1 = select i1 %cmp1, i32 %i, i32 255
|
||||
%cmp2 = icmp slt i32 %i, 0
|
||||
%res = select i1 %cmp2, i32 0, i32 %sel1
|
||||
ret i32 %res
|
||||
}
|
||||
; Check that there is no infinite loop in case of:
|
||||
; (icmp slt smax(NegativeA, B) 0) -> (icmp slt B 0)
|
||||
define i32 @clamp_check_for_no_infinite_loop2(i32 %i) {
|
||||
; CHECK-LABEL: @clamp_check_for_no_infinite_loop2(
|
||||
; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[I:%.*]], -255
|
||||
; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP1]], i32 [[I]], i32 -255
|
||||
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[I]], 0
|
||||
; CHECK-NEXT: [[RES:%.*]] = select i1 [[CMP2]], i32 [[SEL1]], i32 0
|
||||
; CHECK-NEXT: ret i32 [[RES]]
|
||||
;
|
||||
%cmp1 = icmp sgt i32 %i, -255
|
||||
%sel1 = select i1 %cmp1, i32 %i, i32 -255
|
||||
%cmp2 = icmp slt i32 %i, 0
|
||||
%res = select i1 %cmp2, i32 %sel1, i32 0
|
||||
ret i32 %res
|
||||
}
|
||||
|
||||
; The next 3 min tests should canonicalize to the same form...and not infinite loop.
|
||||
|
||||
define double @PR31751_umin1(i32 %x) {
|
||||
|
|
Loading…
Reference in New Issue