Skip to content

Commit be2723d

Browse files
authored
[InstSimplify] Fold icmp of X and/or C1 and X and/or C2 into constant (llvm#65905)
This patch simplifies the pattern `icmp X and/or C1, X and/or C2` when one constant mask is the subset of the other. If `C1 & C2 == C1`, `A = X and/or C1`, `B = X and/or C2`, we can do the following folds: `icmp ule A, B -> true` `icmp ugt A, B -> false` We can apply similar folds for signed predicates when `C1` and `C2` are the same sign: `icmp sle A, B -> true` `icmp sgt A, B -> false` Alive2: https://alive2.llvm.org/ce/z/Q4ekP5 Fixes llvm#65833.
1 parent fb4bdf3 commit be2723d

File tree

3 files changed

+68
-111
lines changed

3 files changed

+68
-111
lines changed

llvm/lib/Analysis/InstructionSimplify.cpp

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3427,7 +3427,7 @@ static Value *simplifyICmpWithBinOp(CmpInst::Predicate Pred, Value *LHS,
34273427
switch (LBO->getOpcode()) {
34283428
default:
34293429
break;
3430-
case Instruction::Shl:
3430+
case Instruction::Shl: {
34313431
bool NUW = Q.IIQ.hasNoUnsignedWrap(LBO) && Q.IIQ.hasNoUnsignedWrap(RBO);
34323432
bool NSW = Q.IIQ.hasNoSignedWrap(LBO) && Q.IIQ.hasNoSignedWrap(RBO);
34333433
if (!NUW || (ICmpInst::isSigned(Pred) && !NSW) ||
@@ -3436,6 +3436,38 @@ static Value *simplifyICmpWithBinOp(CmpInst::Predicate Pred, Value *LHS,
34363436
if (Value *V = simplifyICmpInst(Pred, LBO->getOperand(1),
34373437
RBO->getOperand(1), Q, MaxRecurse - 1))
34383438
return V;
3439+
break;
3440+
}
3441+
// If C1 & C2 == C1, A = X and/or C1, B = X and/or C2:
3442+
// icmp ule A, B -> true
3443+
// icmp ugt A, B -> false
3444+
// icmp sle A, B -> true (C1 and C2 are the same sign)
3445+
// icmp sgt A, B -> false (C1 and C2 are the same sign)
3446+
case Instruction::And:
3447+
case Instruction::Or: {
3448+
const APInt *C1, *C2;
3449+
if (ICmpInst::isRelational(Pred) &&
3450+
match(LBO->getOperand(1), m_APInt(C1)) &&
3451+
match(RBO->getOperand(1), m_APInt(C2))) {
3452+
if (!C1->isSubsetOf(*C2)) {
3453+
std::swap(C1, C2);
3454+
Pred = ICmpInst::getSwappedPredicate(Pred);
3455+
}
3456+
if (C1->isSubsetOf(*C2)) {
3457+
if (Pred == ICmpInst::ICMP_ULE)
3458+
return ConstantInt::getTrue(getCompareTy(LHS));
3459+
if (Pred == ICmpInst::ICMP_UGT)
3460+
return ConstantInt::getFalse(getCompareTy(LHS));
3461+
if (C1->isNonNegative() == C2->isNonNegative()) {
3462+
if (Pred == ICmpInst::ICMP_SLE)
3463+
return ConstantInt::getTrue(getCompareTy(LHS));
3464+
if (Pred == ICmpInst::ICMP_SGT)
3465+
return ConstantInt::getFalse(getCompareTy(LHS));
3466+
}
3467+
}
3468+
}
3469+
break;
3470+
}
34393471
}
34403472
}
34413473

llvm/test/Transforms/InstSimplify/compare.ll

Lines changed: 17 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1921,10 +1921,7 @@ define i1 @tautological8(i32 %A, i32 %B) {
19211921

19221922
define i1 @tautological9(i32 %A) {
19231923
; CHECK-LABEL: @tautological9(
1924-
; CHECK-NEXT: [[C1:%.*]] = and i32 [[A:%.*]], 1
1925-
; CHECK-NEXT: [[C2:%.*]] = and i32 [[A]], 3
1926-
; CHECK-NEXT: [[D:%.*]] = icmp ugt i32 [[C1]], [[C2]]
1927-
; CHECK-NEXT: ret i1 [[D]]
1924+
; CHECK-NEXT: ret i1 false
19281925
;
19291926
%C1 = and i32 %A, 1
19301927
%C2 = and i32 %A, 3
@@ -1934,10 +1931,7 @@ define i1 @tautological9(i32 %A) {
19341931

19351932
define <2 x i1> @tautological9_vec(<2 x i32> %A) {
19361933
; CHECK-LABEL: @tautological9_vec(
1937-
; CHECK-NEXT: [[C1:%.*]] = and <2 x i32> [[A:%.*]], <i32 1, i32 1>
1938-
; CHECK-NEXT: [[C2:%.*]] = and <2 x i32> [[A]], <i32 3, i32 3>
1939-
; CHECK-NEXT: [[D:%.*]] = icmp ugt <2 x i32> [[C1]], [[C2]]
1940-
; CHECK-NEXT: ret <2 x i1> [[D]]
1934+
; CHECK-NEXT: ret <2 x i1> zeroinitializer
19411935
;
19421936
%C1 = and <2 x i32> %A, <i32 1, i32 1>
19431937
%C2 = and <2 x i32> %A, <i32 3, i32 3>
@@ -1947,10 +1941,7 @@ define <2 x i1> @tautological9_vec(<2 x i32> %A) {
19471941

19481942
define i1 @tautological10(i32 %A) {
19491943
; CHECK-LABEL: @tautological10(
1950-
; CHECK-NEXT: [[C1:%.*]] = and i32 [[A:%.*]], 1
1951-
; CHECK-NEXT: [[C2:%.*]] = and i32 [[A]], 3
1952-
; CHECK-NEXT: [[D:%.*]] = icmp ule i32 [[C1]], [[C2]]
1953-
; CHECK-NEXT: ret i1 [[D]]
1944+
; CHECK-NEXT: ret i1 true
19541945
;
19551946
%C1 = and i32 %A, 1
19561947
%C2 = and i32 %A, 3
@@ -1960,10 +1951,7 @@ define i1 @tautological10(i32 %A) {
19601951

19611952
define i1 @tautological11(i32 %A) {
19621953
; CHECK-LABEL: @tautological11(
1963-
; CHECK-NEXT: [[C1:%.*]] = or i32 [[A:%.*]], 1
1964-
; CHECK-NEXT: [[C2:%.*]] = or i32 [[A]], 3
1965-
; CHECK-NEXT: [[D:%.*]] = icmp ule i32 [[C1]], [[C2]]
1966-
; CHECK-NEXT: ret i1 [[D]]
1954+
; CHECK-NEXT: ret i1 true
19671955
;
19681956
%C1 = or i32 %A, 1
19691957
%C2 = or i32 %A, 3
@@ -1973,10 +1961,7 @@ define i1 @tautological11(i32 %A) {
19731961

19741962
define i1 @tautological12(i32 %A) {
19751963
; CHECK-LABEL: @tautological12(
1976-
; CHECK-NEXT: [[C1:%.*]] = or i32 [[A:%.*]], 1
1977-
; CHECK-NEXT: [[C2:%.*]] = or i32 [[A]], 3
1978-
; CHECK-NEXT: [[D:%.*]] = icmp ugt i32 [[C1]], [[C2]]
1979-
; CHECK-NEXT: ret i1 [[D]]
1964+
; CHECK-NEXT: ret i1 false
19801965
;
19811966
%C1 = or i32 %A, 1
19821967
%C2 = or i32 %A, 3
@@ -1986,10 +1971,7 @@ define i1 @tautological12(i32 %A) {
19861971

19871972
define i1 @tautological13(i32 %A) {
19881973
; CHECK-LABEL: @tautological13(
1989-
; CHECK-NEXT: [[C1:%.*]] = or i32 [[A:%.*]], 1
1990-
; CHECK-NEXT: [[C2:%.*]] = or i32 [[A]], 3
1991-
; CHECK-NEXT: [[D:%.*]] = icmp ult i32 [[C2]], [[C1]]
1992-
; CHECK-NEXT: ret i1 [[D]]
1974+
; CHECK-NEXT: ret i1 false
19931975
;
19941976
%C1 = or i32 %A, 1
19951977
%C2 = or i32 %A, 3
@@ -1999,10 +1981,7 @@ define i1 @tautological13(i32 %A) {
19991981

20001982
define i1 @tautological14(i32 %A) {
20011983
; CHECK-LABEL: @tautological14(
2002-
; CHECK-NEXT: [[C1:%.*]] = or i32 [[A:%.*]], 1
2003-
; CHECK-NEXT: [[C2:%.*]] = or i32 [[A]], 3
2004-
; CHECK-NEXT: [[D:%.*]] = icmp uge i32 [[C2]], [[C1]]
2005-
; CHECK-NEXT: ret i1 [[D]]
1984+
; CHECK-NEXT: ret i1 true
20061985
;
20071986
%C1 = or i32 %A, 1
20081987
%C2 = or i32 %A, 3
@@ -2012,10 +1991,7 @@ define i1 @tautological14(i32 %A) {
20121991

20131992
define i1 @tautological15(i32 %A) {
20141993
; CHECK-LABEL: @tautological15(
2015-
; CHECK-NEXT: [[C1:%.*]] = and i32 [[A:%.*]], 1
2016-
; CHECK-NEXT: [[C2:%.*]] = and i32 [[A]], 3
2017-
; CHECK-NEXT: [[D:%.*]] = icmp uge i32 [[C2]], [[C1]]
2018-
; CHECK-NEXT: ret i1 [[D]]
1994+
; CHECK-NEXT: ret i1 true
20191995
;
20201996
%C1 = and i32 %A, 1
20211997
%C2 = and i32 %A, 3
@@ -2025,10 +2001,7 @@ define i1 @tautological15(i32 %A) {
20252001

20262002
define i1 @tautological16(i32 %A) {
20272003
; CHECK-LABEL: @tautological16(
2028-
; CHECK-NEXT: [[C1:%.*]] = and i32 [[A:%.*]], 1
2029-
; CHECK-NEXT: [[C2:%.*]] = and i32 [[A]], 3
2030-
; CHECK-NEXT: [[D:%.*]] = icmp ult i32 [[C2]], [[C1]]
2031-
; CHECK-NEXT: ret i1 [[D]]
2004+
; CHECK-NEXT: ret i1 false
20322005
;
20332006
%C1 = and i32 %A, 1
20342007
%C2 = and i32 %A, 3
@@ -2142,10 +2115,7 @@ define i1 @tautological16_negative(i32 %A) {
21422115

21432116
define i1 @tautological17_subset1(i32 %A) {
21442117
; CHECK-LABEL: @tautological17_subset1(
2145-
; CHECK-NEXT: [[C1:%.*]] = and i32 [[A:%.*]], 1
2146-
; CHECK-NEXT: [[C2:%.*]] = and i32 [[A]], 3
2147-
; CHECK-NEXT: [[D:%.*]] = icmp sgt i32 [[C1]], [[C2]]
2148-
; CHECK-NEXT: ret i1 [[D]]
2118+
; CHECK-NEXT: ret i1 false
21492119
;
21502120
%C1 = and i32 %A, 1
21512121
%C2 = and i32 %A, 3
@@ -2155,10 +2125,7 @@ define i1 @tautological17_subset1(i32 %A) {
21552125

21562126
define i1 @tautological17_subset2(i32 %A) {
21572127
; CHECK-LABEL: @tautological17_subset2(
2158-
; CHECK-NEXT: [[C1:%.*]] = and i32 [[A:%.*]], -4
2159-
; CHECK-NEXT: [[C2:%.*]] = and i32 [[A]], -3
2160-
; CHECK-NEXT: [[D:%.*]] = icmp sgt i32 [[C1]], [[C2]]
2161-
; CHECK-NEXT: ret i1 [[D]]
2128+
; CHECK-NEXT: ret i1 false
21622129
;
21632130
%C1 = and i32 %A, -4
21642131
%C2 = and i32 %A, -3
@@ -2181,10 +2148,7 @@ define i1 @tautological17_negative(i32 %A) {
21812148

21822149
define i1 @tautological18_subset1(i32 %A) {
21832150
; CHECK-LABEL: @tautological18_subset1(
2184-
; CHECK-NEXT: [[C1:%.*]] = and i32 [[A:%.*]], 1
2185-
; CHECK-NEXT: [[C2:%.*]] = and i32 [[A]], 3
2186-
; CHECK-NEXT: [[D:%.*]] = icmp sle i32 [[C1]], [[C2]]
2187-
; CHECK-NEXT: ret i1 [[D]]
2151+
; CHECK-NEXT: ret i1 true
21882152
;
21892153
%C1 = and i32 %A, 1
21902154
%C2 = and i32 %A, 3
@@ -2194,10 +2158,7 @@ define i1 @tautological18_subset1(i32 %A) {
21942158

21952159
define i1 @tautological18_subset2(i32 %A) {
21962160
; CHECK-LABEL: @tautological18_subset2(
2197-
; CHECK-NEXT: [[C1:%.*]] = and i32 [[A:%.*]], -4
2198-
; CHECK-NEXT: [[C2:%.*]] = and i32 [[A]], -3
2199-
; CHECK-NEXT: [[D:%.*]] = icmp sle i32 [[C1]], [[C2]]
2200-
; CHECK-NEXT: ret i1 [[D]]
2161+
; CHECK-NEXT: ret i1 true
22012162
;
22022163
%C1 = and i32 %A, -4
22032164
%C2 = and i32 %A, -3
@@ -2220,10 +2181,7 @@ define i1 @tautological18_negative(i32 %A) {
22202181

22212182
define i1 @tautological19_subset1(i32 %A) {
22222183
; CHECK-LABEL: @tautological19_subset1(
2223-
; CHECK-NEXT: [[C1:%.*]] = or i32 [[A:%.*]], 1
2224-
; CHECK-NEXT: [[C2:%.*]] = or i32 [[A]], 3
2225-
; CHECK-NEXT: [[D:%.*]] = icmp sgt i32 [[C1]], [[C2]]
2226-
; CHECK-NEXT: ret i1 [[D]]
2184+
; CHECK-NEXT: ret i1 false
22272185
;
22282186
%C1 = or i32 %A, 1
22292187
%C2 = or i32 %A, 3
@@ -2233,10 +2191,7 @@ define i1 @tautological19_subset1(i32 %A) {
22332191

22342192
define i1 @tautological19_subset2(i32 %A) {
22352193
; CHECK-LABEL: @tautological19_subset2(
2236-
; CHECK-NEXT: [[C1:%.*]] = and i32 [[A:%.*]], -4
2237-
; CHECK-NEXT: [[C2:%.*]] = and i32 [[A]], -3
2238-
; CHECK-NEXT: [[D:%.*]] = icmp sgt i32 [[C1]], [[C2]]
2239-
; CHECK-NEXT: ret i1 [[D]]
2194+
; CHECK-NEXT: ret i1 false
22402195
;
22412196
%C1 = and i32 %A, -4
22422197
%C2 = and i32 %A, -3
@@ -2259,10 +2214,7 @@ define i1 @tautological19_negative(i32 %A) {
22592214

22602215
define i1 @tautological20_subset1(i32 %A) {
22612216
; CHECK-LABEL: @tautological20_subset1(
2262-
; CHECK-NEXT: [[C1:%.*]] = and i32 [[A:%.*]], 1
2263-
; CHECK-NEXT: [[C2:%.*]] = and i32 [[A]], 3
2264-
; CHECK-NEXT: [[D:%.*]] = icmp sle i32 [[C1]], [[C2]]
2265-
; CHECK-NEXT: ret i1 [[D]]
2217+
; CHECK-NEXT: ret i1 true
22662218
;
22672219
%C1 = and i32 %A, 1
22682220
%C2 = and i32 %A, 3
@@ -2272,10 +2224,7 @@ define i1 @tautological20_subset1(i32 %A) {
22722224

22732225
define i1 @tautological20_subset2(i32 %A) {
22742226
; CHECK-LABEL: @tautological20_subset2(
2275-
; CHECK-NEXT: [[C1:%.*]] = and i32 [[A:%.*]], -4
2276-
; CHECK-NEXT: [[C2:%.*]] = and i32 [[A]], -3
2277-
; CHECK-NEXT: [[D:%.*]] = icmp sle i32 [[C1]], [[C2]]
2278-
; CHECK-NEXT: ret i1 [[D]]
2227+
; CHECK-NEXT: ret i1 true
22792228
;
22802229
%C1 = and i32 %A, -4
22812230
%C2 = and i32 %A, -3

llvm/test/Transforms/InstSimplify/maxmin_intrinsics.ll

Lines changed: 18 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2337,9 +2337,7 @@ false:
23372337
define i8 @umin_and_mask(i8 %x) {
23382338
; CHECK-LABEL: @umin_and_mask(
23392339
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[X:%.*]], 1
2340-
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[X]], 3
2341-
; CHECK-NEXT: [[VAL:%.*]] = call i8 @llvm.umin.i8(i8 [[AND1]], i8 [[AND2]])
2342-
; CHECK-NEXT: ret i8 [[VAL]]
2340+
; CHECK-NEXT: ret i8 [[AND1]]
23432341
;
23442342
%and1 = and i8 %x, 1
23452343
%and2 = and i8 %x, 3
@@ -2349,10 +2347,8 @@ define i8 @umin_and_mask(i8 %x) {
23492347

23502348
define i8 @umax_and_mask(i8 %x) {
23512349
; CHECK-LABEL: @umax_and_mask(
2352-
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[X:%.*]], 1
2353-
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[X]], 3
2354-
; CHECK-NEXT: [[VAL:%.*]] = call i8 @llvm.umax.i8(i8 [[AND1]], i8 [[AND2]])
2355-
; CHECK-NEXT: ret i8 [[VAL]]
2350+
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[X:%.*]], 3
2351+
; CHECK-NEXT: ret i8 [[AND2]]
23562352
;
23572353
%and1 = and i8 %x, 1
23582354
%and2 = and i8 %x, 3
@@ -2363,9 +2359,7 @@ define i8 @umax_and_mask(i8 %x) {
23632359
define i8 @umin_or_mask(i8 %x) {
23642360
; CHECK-LABEL: @umin_or_mask(
23652361
; CHECK-NEXT: [[AND1:%.*]] = or i8 [[X:%.*]], 1
2366-
; CHECK-NEXT: [[AND2:%.*]] = or i8 [[X]], 3
2367-
; CHECK-NEXT: [[VAL:%.*]] = call i8 @llvm.umin.i8(i8 [[AND1]], i8 [[AND2]])
2368-
; CHECK-NEXT: ret i8 [[VAL]]
2362+
; CHECK-NEXT: ret i8 [[AND1]]
23692363
;
23702364
%and1 = or i8 %x, 1
23712365
%and2 = or i8 %x, 3
@@ -2375,10 +2369,8 @@ define i8 @umin_or_mask(i8 %x) {
23752369

23762370
define i8 @umax_or_mask(i8 %x) {
23772371
; CHECK-LABEL: @umax_or_mask(
2378-
; CHECK-NEXT: [[AND1:%.*]] = or i8 [[X:%.*]], 1
2379-
; CHECK-NEXT: [[AND2:%.*]] = or i8 [[X]], 3
2380-
; CHECK-NEXT: [[VAL:%.*]] = call i8 @llvm.umax.i8(i8 [[AND1]], i8 [[AND2]])
2381-
; CHECK-NEXT: ret i8 [[VAL]]
2372+
; CHECK-NEXT: [[AND2:%.*]] = or i8 [[X:%.*]], 3
2373+
; CHECK-NEXT: ret i8 [[AND2]]
23822374
;
23832375
%and1 = or i8 %x, 1
23842376
%and2 = or i8 %x, 3
@@ -2441,9 +2433,7 @@ define i8 @umax_or_mask_negative(i8 %x) {
24412433
define i8 @smin_and_mask_subset1(i8 %x) {
24422434
; CHECK-LABEL: @smin_and_mask_subset1(
24432435
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[X:%.*]], 1
2444-
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[X]], 3
2445-
; CHECK-NEXT: [[VAL:%.*]] = call i8 @llvm.smin.i8(i8 [[AND1]], i8 [[AND2]])
2446-
; CHECK-NEXT: ret i8 [[VAL]]
2436+
; CHECK-NEXT: ret i8 [[AND1]]
24472437
;
24482438
%and1 = and i8 %x, 1
24492439
%and2 = and i8 %x, 3
@@ -2453,10 +2443,8 @@ define i8 @smin_and_mask_subset1(i8 %x) {
24532443

24542444
define i8 @smax_and_mask_subset1(i8 %x) {
24552445
; CHECK-LABEL: @smax_and_mask_subset1(
2456-
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[X:%.*]], 1
2457-
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[X]], 3
2458-
; CHECK-NEXT: [[VAL:%.*]] = call i8 @llvm.smax.i8(i8 [[AND1]], i8 [[AND2]])
2459-
; CHECK-NEXT: ret i8 [[VAL]]
2446+
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[X:%.*]], 3
2447+
; CHECK-NEXT: ret i8 [[AND2]]
24602448
;
24612449
%and1 = and i8 %x, 1
24622450
%and2 = and i8 %x, 3
@@ -2467,9 +2455,7 @@ define i8 @smax_and_mask_subset1(i8 %x) {
24672455
define i8 @smin_or_mask_subset1(i8 %x) {
24682456
; CHECK-LABEL: @smin_or_mask_subset1(
24692457
; CHECK-NEXT: [[AND1:%.*]] = or i8 [[X:%.*]], 1
2470-
; CHECK-NEXT: [[AND2:%.*]] = or i8 [[X]], 3
2471-
; CHECK-NEXT: [[VAL:%.*]] = call i8 @llvm.smin.i8(i8 [[AND1]], i8 [[AND2]])
2472-
; CHECK-NEXT: ret i8 [[VAL]]
2458+
; CHECK-NEXT: ret i8 [[AND1]]
24732459
;
24742460
%and1 = or i8 %x, 1
24752461
%and2 = or i8 %x, 3
@@ -2479,10 +2465,8 @@ define i8 @smin_or_mask_subset1(i8 %x) {
24792465

24802466
define i8 @smax_or_mask_subset1(i8 %x) {
24812467
; CHECK-LABEL: @smax_or_mask_subset1(
2482-
; CHECK-NEXT: [[AND1:%.*]] = or i8 [[X:%.*]], 1
2483-
; CHECK-NEXT: [[AND2:%.*]] = or i8 [[X]], 3
2484-
; CHECK-NEXT: [[VAL:%.*]] = call i8 @llvm.smax.i8(i8 [[AND1]], i8 [[AND2]])
2485-
; CHECK-NEXT: ret i8 [[VAL]]
2468+
; CHECK-NEXT: [[AND2:%.*]] = or i8 [[X:%.*]], 3
2469+
; CHECK-NEXT: ret i8 [[AND2]]
24862470
;
24872471
%and1 = or i8 %x, 1
24882472
%and2 = or i8 %x, 3
@@ -2493,9 +2477,7 @@ define i8 @smax_or_mask_subset1(i8 %x) {
24932477
define i8 @smin_and_mask_subset2(i8 %x) {
24942478
; CHECK-LABEL: @smin_and_mask_subset2(
24952479
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[X:%.*]], -4
2496-
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[X]], -3
2497-
; CHECK-NEXT: [[VAL:%.*]] = call i8 @llvm.smin.i8(i8 [[AND1]], i8 [[AND2]])
2498-
; CHECK-NEXT: ret i8 [[VAL]]
2480+
; CHECK-NEXT: ret i8 [[AND1]]
24992481
;
25002482
%and1 = and i8 %x, -4
25012483
%and2 = and i8 %x, -3
@@ -2505,10 +2487,8 @@ define i8 @smin_and_mask_subset2(i8 %x) {
25052487

25062488
define i8 @smax_and_mask_subset2(i8 %x) {
25072489
; CHECK-LABEL: @smax_and_mask_subset2(
2508-
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[X:%.*]], -4
2509-
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[X]], -3
2510-
; CHECK-NEXT: [[VAL:%.*]] = call i8 @llvm.smax.i8(i8 [[AND1]], i8 [[AND2]])
2511-
; CHECK-NEXT: ret i8 [[VAL]]
2490+
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[X:%.*]], -3
2491+
; CHECK-NEXT: ret i8 [[AND2]]
25122492
;
25132493
%and1 = and i8 %x, -4
25142494
%and2 = and i8 %x, -3
@@ -2519,9 +2499,7 @@ define i8 @smax_and_mask_subset2(i8 %x) {
25192499
define i8 @smin_or_mask_subset2(i8 %x) {
25202500
; CHECK-LABEL: @smin_or_mask_subset2(
25212501
; CHECK-NEXT: [[AND1:%.*]] = or i8 [[X:%.*]], -4
2522-
; CHECK-NEXT: [[AND2:%.*]] = or i8 [[X]], -3
2523-
; CHECK-NEXT: [[VAL:%.*]] = call i8 @llvm.smin.i8(i8 [[AND1]], i8 [[AND2]])
2524-
; CHECK-NEXT: ret i8 [[VAL]]
2502+
; CHECK-NEXT: ret i8 [[AND1]]
25252503
;
25262504
%and1 = or i8 %x, -4
25272505
%and2 = or i8 %x, -3
@@ -2531,10 +2509,8 @@ define i8 @smin_or_mask_subset2(i8 %x) {
25312509

25322510
define i8 @smax_or_mask_subset2(i8 %x) {
25332511
; CHECK-LABEL: @smax_or_mask_subset2(
2534-
; CHECK-NEXT: [[AND1:%.*]] = or i8 [[X:%.*]], -4
2535-
; CHECK-NEXT: [[AND2:%.*]] = or i8 [[X]], -3
2536-
; CHECK-NEXT: [[VAL:%.*]] = call i8 @llvm.smax.i8(i8 [[AND1]], i8 [[AND2]])
2537-
; CHECK-NEXT: ret i8 [[VAL]]
2512+
; CHECK-NEXT: [[AND2:%.*]] = or i8 [[X:%.*]], -3
2513+
; CHECK-NEXT: ret i8 [[AND2]]
25382514
;
25392515
%and1 = or i8 %x, -4
25402516
%and2 = or i8 %x, -3

0 commit comments

Comments
 (0)