From 143ffebf675fe0d90b55d2226c6f690fc4b7ed4b Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Wed, 11 Oct 2017 14:29:17 +0000 Subject: [PATCH] [InstCombine] add baseline tests for D38531; NFC git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@315461 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/Transforms/InstCombine/minmax-fold.ll | 104 ++++++++++++++++++++- 1 file changed, 103 insertions(+), 1 deletion(-) diff --git a/test/Transforms/InstCombine/minmax-fold.ll b/test/Transforms/InstCombine/minmax-fold.ll index 568fd50fd69..5197a58ef8b 100644 --- a/test/Transforms/InstCombine/minmax-fold.ll +++ b/test/Transforms/InstCombine/minmax-fold.ll @@ -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 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 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 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 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) { -- 2.40.0