Skip to content

Commit 3d13662

Browse files
committed
[InstCombine] Canonicalize max(min(X, MinC), MaxC) -> min(max(X, MaxC), MinC)
1 parent 986fc2c commit 3d13662

File tree

8 files changed

+123
-102
lines changed

8 files changed

+123
-102
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1924,6 +1924,29 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
19241924
}
19251925
}
19261926

1927+
// smax(smin(X, MinC), MaxC) -> smin(smax(X, MaxC), MinC) if MinC s>= MaxC
1928+
// umax(umin(X, MinC), MaxC) -> umin(umax(X, MaxC), MinC) if MinC u>= MaxC
1929+
const APInt *MinC, *MaxC;
1930+
auto CreateTransposedMaxMin = [&](bool IsSigned) {
1931+
auto MaxIID = IsSigned ? Intrinsic::smax : Intrinsic::umax;
1932+
auto MinIID = IsSigned ? Intrinsic::smin : Intrinsic::umin;
1933+
Value *NewMax = Builder.CreateBinaryIntrinsic(
1934+
MaxIID, X, ConstantInt::get(X->getType(), *MaxC));
1935+
return replaceInstUsesWith(
1936+
*II, Builder.CreateBinaryIntrinsic(
1937+
MinIID, NewMax, ConstantInt::get(X->getType(), *MinC)));
1938+
};
1939+
if (IID == Intrinsic::smax &&
1940+
match(I0, m_OneUse(m_Intrinsic<Intrinsic::smin>(m_Value(X),
1941+
m_APInt(MinC)))) &&
1942+
match(I1, m_APInt(MaxC)) && MinC->sgt(*MaxC))
1943+
return CreateTransposedMaxMin(true);
1944+
if (IID == Intrinsic::umax &&
1945+
match(I0, m_OneUse(m_Intrinsic<Intrinsic::umin>(m_Value(X),
1946+
m_APInt(MinC)))) &&
1947+
match(I1, m_APInt(MaxC)) && MinC->ugt(*MaxC))
1948+
return CreateTransposedMaxMin(false);
1949+
19271950
// umin(i1 X, i1 Y) -> and i1 X, Y
19281951
// smax(i1 X, i1 Y) -> and i1 X, Y
19291952
if ((IID == Intrinsic::umin || IID == Intrinsic::smax) &&

llvm/test/Transforms/InstCombine/clamp-to-minmax.ll

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ define float @clamp_float_fast_unordered_strict_maxmin(float %x) {
8383
; (X <= C1) ? C1 : MIN(X, C2)
8484
define float @clamp_float_fast_unordered_nonstrict_maxmin(float %x) {
8585
; CHECK-LABEL: @clamp_float_fast_unordered_nonstrict_maxmin(
86-
; CHECK-NEXT: [[MIN:%.*]] = call fast float @llvm.minnum.f32(float [[X:%.*]], float 2.550000e+02)
86+
; CHECK-NEXT: [[MIN:%.*]] = call fast float @llvm.minnum.f32(float [[X:%.*]], float 2.550000e+02)
8787
; CHECK-NEXT: [[CMP1:%.*]] = fcmp fast ule float [[X]], 1.000000e+00
8888
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP1]], float 1.000000e+00, float [[MIN]]
8989
; CHECK-NEXT: ret float [[R]]
@@ -98,7 +98,7 @@ define float @clamp_float_fast_unordered_nonstrict_maxmin(float %x) {
9898
; (X > C1) ? C1 : MAX(X, C2)
9999
define float @clamp_float_fast_unordered_strict_minmax(float %x) {
100100
; CHECK-LABEL: @clamp_float_fast_unordered_strict_minmax(
101-
; CHECK-NEXT: [[MAX:%.*]] = call fast float @llvm.maxnum.f32(float [[X:%.*]], float 1.000000e+00)
101+
; CHECK-NEXT: [[MAX:%.*]] = call fast float @llvm.maxnum.f32(float [[X:%.*]], float 1.000000e+00)
102102
; CHECK-NEXT: [[CMP1:%.*]] = fcmp fast ugt float [[X]], 2.550000e+02
103103
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP1]], float 2.550000e+02, float [[MAX]]
104104
; CHECK-NEXT: ret float [[R]]
@@ -113,7 +113,7 @@ define float @clamp_float_fast_unordered_strict_minmax(float %x) {
113113
; (X >= C1) ? C1 : MAX(X, C2)
114114
define float @clamp_float_fast_unordered_nonstrict_minmax(float %x) {
115115
; CHECK-LABEL: @clamp_float_fast_unordered_nonstrict_minmax(
116-
; CHECK-NEXT: [[MAX:%.*]] = call fast float @llvm.maxnum.f32(float [[X:%.*]], float 1.000000e+00)
116+
; CHECK-NEXT: [[MAX:%.*]] = call fast float @llvm.maxnum.f32(float [[X:%.*]], float 1.000000e+00)
117117
; CHECK-NEXT: [[CMP1:%.*]] = fcmp fast uge float [[X]], 2.550000e+02
118118
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP1]], float 2.550000e+02, float [[MAX]]
119119
; CHECK-NEXT: ret float [[R]]
@@ -147,7 +147,7 @@ define float @clamp_test_1(float %x) {
147147
; Like @clamp_test_1 but HighConst < LowConst
148148
define float @clamp_negative_wrong_const(float %x) {
149149
; CHECK-LABEL: @clamp_negative_wrong_const(
150-
; CHECK-NEXT: [[INNER_SEL:%.*]] = call fast float @llvm.minnum.f32(float [[X:%.*]], float 2.550000e+02)
150+
; CHECK-NEXT: [[INNER_SEL:%.*]] = call fast float @llvm.minnum.f32(float [[X:%.*]], float 2.550000e+02)
151151
; CHECK-NEXT: [[OUTER_CMP:%.*]] = fcmp fast ugt float [[X]], 5.120000e+02
152152
; CHECK-NEXT: [[R:%.*]] = select i1 [[OUTER_CMP]], float [[INNER_SEL]], float 5.120000e+02
153153
; CHECK-NEXT: ret float [[R]]
@@ -162,7 +162,7 @@ define float @clamp_negative_wrong_const(float %x) {
162162
; Like @clamp_test_1 but both are min
163163
define float @clamp_negative_same_op(float %x) {
164164
; CHECK-LABEL: @clamp_negative_same_op(
165-
; CHECK-NEXT: [[INNER_SEL:%.*]] = call fast float @llvm.minnum.f32(float [[X:%.*]], float 2.550000e+02)
165+
; CHECK-NEXT: [[INNER_SEL:%.*]] = call fast float @llvm.minnum.f32(float [[X:%.*]], float 2.550000e+02)
166166
; CHECK-NEXT: [[OUTER_CMP:%.*]] = fcmp fast ult float [[X]], 1.000000e+00
167167
; CHECK-NEXT: [[R:%.*]] = select i1 [[OUTER_CMP]], float [[INNER_SEL]], float 1.000000e+00
168168
; CHECK-NEXT: ret float [[R]]
@@ -500,9 +500,9 @@ define float @ui64_clamp_and_cast_to_float(i64 %x) {
500500

501501
define float @mixed_clamp_to_float_1(i32 %x) {
502502
; CHECK-LABEL: @mixed_clamp_to_float_1(
503-
; CHECK-NEXT: [[SI_MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[X:%.*]], i32 255)
504-
; CHECK-NEXT: [[R1:%.*]] = call i32 @llvm.smax.i32(i32 [[SI_MIN]], i32 1)
505-
; CHECK-NEXT: [[R:%.*]] = uitofp nneg i32 [[R1]] to float
503+
; CHECK-NEXT: [[R1:%.*]] = call i32 @llvm.smax.i32(i32 [[SI_MIN:%.*]], i32 1)
504+
; CHECK-NEXT: [[R2:%.*]] = call i32 @llvm.smin.i32(i32 [[R1]], i32 255)
505+
; CHECK-NEXT: [[R:%.*]] = uitofp nneg i32 [[R2]] to float
506506
; CHECK-NEXT: ret float [[R]]
507507
;
508508
%si_min_cmp = icmp sgt i32 %x, 255
@@ -535,9 +535,9 @@ define i32 @mixed_clamp_to_i32_1(float %x) {
535535

536536
define float @mixed_clamp_to_float_2(i32 %x) {
537537
; CHECK-LABEL: @mixed_clamp_to_float_2(
538-
; CHECK-NEXT: [[SI_MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[X:%.*]], i32 255)
539-
; CHECK-NEXT: [[R1:%.*]] = call i32 @llvm.smax.i32(i32 [[SI_MIN]], i32 1)
540-
; CHECK-NEXT: [[R:%.*]] = uitofp nneg i32 [[R1]] to float
538+
; CHECK-NEXT: [[R1:%.*]] = call i32 @llvm.smax.i32(i32 [[SI_MIN:%.*]], i32 1)
539+
; CHECK-NEXT: [[R2:%.*]] = call i32 @llvm.smin.i32(i32 [[R1]], i32 255)
540+
; CHECK-NEXT: [[R:%.*]] = uitofp nneg i32 [[R2]] to float
541541
; CHECK-NEXT: ret float [[R]]
542542
;
543543
%si_min_cmp = icmp sgt i32 %x, 255
@@ -568,9 +568,9 @@ define i32 @mixed_clamp_to_i32_2(float %x) {
568568

569569
define <2 x float> @mixed_clamp_to_float_vec(<2 x i32> %x) {
570570
; CHECK-LABEL: @mixed_clamp_to_float_vec(
571-
; CHECK-NEXT: [[SI_MIN:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[X:%.*]], <2 x i32> splat (i32 255))
572-
; CHECK-NEXT: [[R1:%.*]] = call <2 x i32> @llvm.smax.v2i32(<2 x i32> [[SI_MIN]], <2 x i32> splat (i32 1))
573-
; CHECK-NEXT: [[R:%.*]] = uitofp nneg <2 x i32> [[R1]] to <2 x float>
571+
; CHECK-NEXT: [[R1:%.*]] = call <2 x i32> @llvm.smax.v2i32(<2 x i32> [[SI_MIN:%.*]], <2 x i32> splat (i32 1))
572+
; CHECK-NEXT: [[R2:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[R1]], <2 x i32> splat (i32 255))
573+
; CHECK-NEXT: [[R:%.*]] = uitofp nneg <2 x i32> [[R2]] to <2 x float>
574574
; CHECK-NEXT: ret <2 x float> [[R]]
575575
;
576576
%si_min_cmp = icmp sgt <2 x i32> %x, <i32 255, i32 255>

llvm/test/Transforms/InstCombine/max-min-canonicalize.ll

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
define i16 @smax_smin(i16 %x) {
99
; CHECK-LABEL: define i16 @smax_smin(
1010
; CHECK-SAME: i16 [[X:%.*]]) {
11-
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 255)
12-
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smax.i16(i16 [[MIN]], i16 -1)
11+
; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.smax.i16(i16 [[X]], i16 -1)
12+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smin.i16(i16 [[TMP1]], i16 255)
1313
; CHECK-NEXT: ret i16 [[MAX]]
1414
;
1515
%min = call i16 @llvm.smin.i16(i16 %x, i16 255)
@@ -20,8 +20,8 @@ define i16 @smax_smin(i16 %x) {
2020
define i16 @umax_umin(i16 %x) {
2121
; CHECK-LABEL: define i16 @umax_umin(
2222
; CHECK-SAME: i16 [[X:%.*]]) {
23-
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.umin.i16(i16 [[X]], i16 255)
24-
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umax.i16(i16 [[MIN]], i16 63)
23+
; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.umax.i16(i16 [[X]], i16 63)
24+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umin.i16(i16 [[TMP1]], i16 255)
2525
; CHECK-NEXT: ret i16 [[MAX]]
2626
;
2727
%min = call i16 @llvm.umin.i16(i16 %x, i16 255)
@@ -32,8 +32,8 @@ define i16 @umax_umin(i16 %x) {
3232
define i16 @smax_smin_commute0(i16 %x) {
3333
; CHECK-LABEL: define i16 @smax_smin_commute0(
3434
; CHECK-SAME: i16 [[X:%.*]]) {
35-
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 127)
36-
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smax.i16(i16 [[MIN]], i16 -128)
35+
; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.smax.i16(i16 [[X]], i16 -128)
36+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smin.i16(i16 [[TMP1]], i16 127)
3737
; CHECK-NEXT: ret i16 [[MAX]]
3838
;
3939
%min = call i16 @llvm.smin.i16(i16 %x, i16 127)
@@ -44,8 +44,8 @@ define i16 @smax_smin_commute0(i16 %x) {
4444
define i16 @umax_umin_commute0(i16 %x) {
4545
; CHECK-LABEL: define i16 @umax_umin_commute0(
4646
; CHECK-SAME: i16 [[X:%.*]]) {
47-
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.umin.i16(i16 [[X]], i16 255)
48-
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umax.i16(i16 [[MIN]], i16 127)
47+
; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.umax.i16(i16 [[X]], i16 127)
48+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umin.i16(i16 [[TMP1]], i16 255)
4949
; CHECK-NEXT: ret i16 [[MAX]]
5050
;
5151
%min = call i16 @llvm.umin.i16(i16 %x, i16 255)
@@ -56,8 +56,8 @@ define i16 @umax_umin_commute0(i16 %x) {
5656
define i16 @smax_smin_commute1(i16 %x) {
5757
; CHECK-LABEL: define i16 @smax_smin_commute1(
5858
; CHECK-SAME: i16 [[X:%.*]]) {
59-
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 127)
60-
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smax.i16(i16 [[MIN]], i16 -128)
59+
; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.smax.i16(i16 [[X]], i16 -128)
60+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smin.i16(i16 [[TMP1]], i16 127)
6161
; CHECK-NEXT: ret i16 [[MAX]]
6262
;
6363
%min = call i16 @llvm.smin.i16(i16 127, i16 %x)
@@ -68,8 +68,8 @@ define i16 @smax_smin_commute1(i16 %x) {
6868
define i16 @umax_umin_commute1(i16 %x) {
6969
; CHECK-LABEL: define i16 @umax_umin_commute1(
7070
; CHECK-SAME: i16 [[X:%.*]]) {
71-
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.umin.i16(i16 [[X]], i16 255)
72-
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umax.i16(i16 [[MIN]], i16 127)
71+
; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.umax.i16(i16 [[X]], i16 127)
72+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umin.i16(i16 [[TMP1]], i16 255)
7373
; CHECK-NEXT: ret i16 [[MAX]]
7474
;
7575
%min = call i16 @llvm.umin.i16(i16 255, i16 %x)
@@ -80,8 +80,8 @@ define i16 @umax_umin_commute1(i16 %x) {
8080
define i16 @smax_smin_commute2(i16 %x) {
8181
; CHECK-LABEL: define i16 @smax_smin_commute2(
8282
; CHECK-SAME: i16 [[X:%.*]]) {
83-
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 127)
84-
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smax.i16(i16 [[MIN]], i16 -128)
83+
; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.smax.i16(i16 [[X]], i16 -128)
84+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smin.i16(i16 [[TMP1]], i16 127)
8585
; CHECK-NEXT: ret i16 [[MAX]]
8686
;
8787
%min = call i16 @llvm.smin.i16(i16 %x, i16 127)
@@ -92,8 +92,8 @@ define i16 @smax_smin_commute2(i16 %x) {
9292
define i16 @umax_umin_commute2(i16 %x) {
9393
; CHECK-LABEL: define i16 @umax_umin_commute2(
9494
; CHECK-SAME: i16 [[X:%.*]]) {
95-
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.umin.i16(i16 [[X]], i16 255)
96-
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umax.i16(i16 [[MIN]], i16 127)
95+
; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.umax.i16(i16 [[X]], i16 127)
96+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umin.i16(i16 [[TMP1]], i16 255)
9797
; CHECK-NEXT: ret i16 [[MAX]]
9898
;
9999
%min = call i16 @llvm.umin.i16(i16 %x, i16 255)
@@ -104,8 +104,8 @@ define i16 @umax_umin_commute2(i16 %x) {
104104
define i16 @smax_smin_commute3(i16 %x) {
105105
; CHECK-LABEL: define i16 @smax_smin_commute3(
106106
; CHECK-SAME: i16 [[X:%.*]]) {
107-
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 127)
108-
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smax.i16(i16 [[MIN]], i16 -128)
107+
; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.smax.i16(i16 [[X]], i16 -128)
108+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smin.i16(i16 [[TMP1]], i16 127)
109109
; CHECK-NEXT: ret i16 [[MAX]]
110110
;
111111
%min = call i16 @llvm.smin.i16(i16 %x, i16 127)
@@ -116,8 +116,8 @@ define i16 @smax_smin_commute3(i16 %x) {
116116
define i16 @umax_umin_commute3(i16 %x) {
117117
; CHECK-LABEL: define i16 @umax_umin_commute3(
118118
; CHECK-SAME: i16 [[X:%.*]]) {
119-
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.umin.i16(i16 [[X]], i16 255)
120-
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umax.i16(i16 [[MIN]], i16 127)
119+
; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.umax.i16(i16 [[X]], i16 127)
120+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umin.i16(i16 [[TMP1]], i16 255)
121121
; CHECK-NEXT: ret i16 [[MAX]]
122122
;
123123
%min = call i16 @llvm.umin.i16(i16 %x, i16 255)
@@ -128,8 +128,8 @@ define i16 @umax_umin_commute3(i16 %x) {
128128
define <2 x i16> @smax_smin_v2i16(<2 x i16> %x) {
129129
; CHECK-LABEL: define <2 x i16> @smax_smin_v2i16(
130130
; CHECK-SAME: <2 x i16> [[X:%.*]]) {
131-
; CHECK-NEXT: [[MIN:%.*]] = call <2 x i16> @llvm.smin.v2i16(<2 x i16> [[X]], <2 x i16> splat (i16 127))
132-
; CHECK-NEXT: [[MAX:%.*]] = call <2 x i16> @llvm.smax.v2i16(<2 x i16> [[MIN]], <2 x i16> splat (i16 -128))
131+
; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i16> @llvm.smax.v2i16(<2 x i16> [[X]], <2 x i16> splat (i16 -128))
132+
; CHECK-NEXT: [[MAX:%.*]] = call <2 x i16> @llvm.smin.v2i16(<2 x i16> [[TMP1]], <2 x i16> splat (i16 127))
133133
; CHECK-NEXT: ret <2 x i16> [[MAX]]
134134
;
135135
%min = call <2 x i16> @llvm.smin.v2i16(<2 x i16> %x, <2 x i16> splat (i16 127))
@@ -140,8 +140,8 @@ define <2 x i16> @smax_smin_v2i16(<2 x i16> %x) {
140140
define <2 x i16> @umax_umin_v2i16(<2 x i16> %x) {
141141
; CHECK-LABEL: define <2 x i16> @umax_umin_v2i16(
142142
; CHECK-SAME: <2 x i16> [[X:%.*]]) {
143-
; CHECK-NEXT: [[MIN:%.*]] = call <2 x i16> @llvm.umin.v2i16(<2 x i16> [[X]], <2 x i16> splat (i16 255))
144-
; CHECK-NEXT: [[MAX:%.*]] = call <2 x i16> @llvm.umax.v2i16(<2 x i16> [[MIN]], <2 x i16> splat (i16 127))
143+
; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i16> @llvm.umax.v2i16(<2 x i16> [[X]], <2 x i16> splat (i16 127))
144+
; CHECK-NEXT: [[MAX:%.*]] = call <2 x i16> @llvm.umin.v2i16(<2 x i16> [[TMP1]], <2 x i16> splat (i16 255))
145145
; CHECK-NEXT: ret <2 x i16> [[MAX]]
146146
;
147147
%min = call <2 x i16> @llvm.umin.v2i16(<2 x i16> %x, <2 x i16> splat (i16 255))
@@ -251,8 +251,7 @@ define i16 @umax_umin_i16_limits(i16 %x) {
251251
define i16 @min_smax_smin_nested(i16 %x) {
252252
; CHECK-LABEL: define i16 @min_smax_smin_nested(
253253
; CHECK-SAME: i16 [[X:%.*]]) {
254-
; CHECK-NEXT: [[MIN1:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 255)
255-
; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.smax.i16(i16 [[MIN1]], i16 -128)
254+
; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.smax.i16(i16 [[X]], i16 -128)
256255
; CHECK-NEXT: [[MIN2:%.*]] = call i16 @llvm.smin.i16(i16 [[TMP1]], i16 127)
257256
; CHECK-NEXT: ret i16 [[MIN2]]
258257
;
@@ -265,8 +264,7 @@ define i16 @min_smax_smin_nested(i16 %x) {
265264
define i16 @umax_umin_nested(i16 %x) {
266265
; CHECK-LABEL: define i16 @umax_umin_nested(
267266
; CHECK-SAME: i16 [[X:%.*]]) {
268-
; CHECK-NEXT: [[MIN1:%.*]] = call i16 @llvm.umin.i16(i16 [[X]], i16 255)
269-
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umax.i16(i16 [[MIN1]], i16 63)
267+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umax.i16(i16 [[X]], i16 63)
270268
; CHECK-NEXT: [[MIN2:%.*]] = call i16 @llvm.umin.i16(i16 [[MAX]], i16 127)
271269
; CHECK-NEXT: ret i16 [[MIN2]]
272270
;

llvm/test/Transforms/InstCombine/max_known_bits.ll

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ define i16 @min_max_clamp(i16 %x) {
3535
; Same as above with min/max reversed.
3636
define i16 @min_max_clamp_2(i16 %x) {
3737
; CHECK-LABEL: @min_max_clamp_2(
38-
; CHECK-NEXT: [[B:%.*]] = call i16 @llvm.smin.i16(i16 [[X:%.*]], i16 2047)
39-
; CHECK-NEXT: [[D:%.*]] = call i16 @llvm.smax.i16(i16 [[B]], i16 -2048)
40-
; CHECK-NEXT: [[E:%.*]] = add nsw i16 [[D]], 1
38+
; CHECK-NEXT: [[D:%.*]] = call i16 @llvm.smax.i16(i16 [[B:%.*]], i16 -2048)
39+
; CHECK-NEXT: [[D1:%.*]] = call i16 @llvm.smin.i16(i16 [[D]], i16 2047)
40+
; CHECK-NEXT: [[E:%.*]] = add nsw i16 [[D1]], 1
4141
; CHECK-NEXT: ret i16 [[E]]
4242
;
4343
%a = icmp slt i16 %x, 2047
@@ -71,9 +71,9 @@ define i32 @min_max_clamp_3(i16 %x) {
7171
; Same as above with min/max order reversed
7272
define i32 @min_max_clamp_4(i16 %x) {
7373
; CHECK-LABEL: @min_max_clamp_4(
74-
; CHECK-NEXT: [[B:%.*]] = call i16 @llvm.smin.i16(i16 [[X:%.*]], i16 2047)
75-
; CHECK-NEXT: [[D:%.*]] = call i16 @llvm.smax.i16(i16 [[B]], i16 -2048)
76-
; CHECK-NEXT: [[TMP1:%.*]] = sext i16 [[D]] to i32
74+
; CHECK-NEXT: [[D:%.*]] = call i16 @llvm.smax.i16(i16 [[B:%.*]], i16 -2048)
75+
; CHECK-NEXT: [[D1:%.*]] = call i16 @llvm.smin.i16(i16 [[D]], i16 2047)
76+
; CHECK-NEXT: [[TMP1:%.*]] = sext i16 [[D1]] to i32
7777
; CHECK-NEXT: ret i32 [[TMP1]]
7878
;
7979
%a = icmp slt i16 %x, 2047
@@ -106,9 +106,9 @@ define i16 @min_max_clamp_intrinsic(i16 %x) {
106106

107107
define i16 @min_max_clamp_intrinsic_2(i16 %x) {
108108
; CHECK-LABEL: @min_max_clamp_intrinsic_2(
109-
; CHECK-NEXT: [[A:%.*]] = call i16 @llvm.smin.i16(i16 [[X:%.*]], i16 2047)
110-
; CHECK-NEXT: [[B:%.*]] = call i16 @llvm.smax.i16(i16 [[A]], i16 -2048)
111-
; CHECK-NEXT: [[C:%.*]] = add nsw i16 [[B]], 1
109+
; CHECK-NEXT: [[B:%.*]] = call i16 @llvm.smax.i16(i16 [[A:%.*]], i16 -2048)
110+
; CHECK-NEXT: [[B1:%.*]] = call i16 @llvm.smin.i16(i16 [[B]], i16 2047)
111+
; CHECK-NEXT: [[C:%.*]] = add nsw i16 [[B1]], 1
112112
; CHECK-NEXT: ret i16 [[C]]
113113
;
114114
%a = call i16 @llvm.smin.i16(i16 %x, i16 2047)
@@ -134,9 +134,9 @@ define i32 @min_max_clamp_intrinsic_3(i16 %x) {
134134

135135
define i32 @min_max_clamp_intrinsic_4(i16 %x) {
136136
; CHECK-LABEL: @min_max_clamp_intrinsic_4(
137-
; CHECK-NEXT: [[A:%.*]] = call i16 @llvm.smin.i16(i16 [[X:%.*]], i16 2047)
138-
; CHECK-NEXT: [[B:%.*]] = call i16 @llvm.smax.i16(i16 [[A]], i16 -2048)
139-
; CHECK-NEXT: [[TMP1:%.*]] = sext i16 [[B]] to i32
137+
; CHECK-NEXT: [[B:%.*]] = call i16 @llvm.smax.i16(i16 [[A:%.*]], i16 -2048)
138+
; CHECK-NEXT: [[B1:%.*]] = call i16 @llvm.smin.i16(i16 [[B]], i16 2047)
139+
; CHECK-NEXT: [[TMP1:%.*]] = sext i16 [[B1]] to i32
140140
; CHECK-NEXT: ret i32 [[TMP1]]
141141
;
142142
%a = call i16 @llvm.smin.i16(i16 %x, i16 2047)

0 commit comments

Comments
 (0)