Skip to content

Commit c0e06c7

Browse files
committed
[InstCombine] Handle logical and/or in recursive and/or of icmps fold
The and/or of icmps fold is also applied in reassociated form. However, this currently only happens for bitwise and of bitwise and, but not for bitwise and of logical and (or other combinations, but this is the one being addressed here). We can do this for bitwise+logical combinations as well, but need to be a bit careful about which of the resulting ands are logical: https://alive2.llvm.org/ce/z/WYSjGh https://alive2.llvm.org/ce/z/guxYnz https://alive2.llvm.org/ce/z/S5SYxY https://alive2.llvm.org/ce/z/2rAWeW
1 parent 973c7e0 commit c0e06c7

3 files changed

Lines changed: 101 additions & 81 deletions

File tree

llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp

Lines changed: 56 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1989,21 +1989,39 @@ Instruction *InstCombinerImpl::visitAnd(BinaryOperator &I) {
19891989

19901990
// TODO: Make this recursive; it's a little tricky because an arbitrary
19911991
// number of 'and' instructions might have to be created.
1992-
if (LHS && match(Op1, m_OneUse(m_And(m_Value(X), m_Value(Y))))) {
1992+
if (LHS && match(Op1, m_OneUse(m_LogicalAnd(m_Value(X), m_Value(Y))))) {
1993+
bool IsLogical = isa<SelectInst>(Op1);
1994+
// LHS & (X && Y) --> (LHS && X) && Y
19931995
if (auto *Cmp = dyn_cast<ICmpInst>(X))
1994-
if (Value *Res = foldAndOrOfICmps(LHS, Cmp, I, /* IsAnd */ true))
1995-
return replaceInstUsesWith(I, Builder.CreateAnd(Res, Y));
1996+
if (Value *Res =
1997+
foldAndOrOfICmps(LHS, Cmp, I, /* IsAnd */ true, IsLogical))
1998+
return replaceInstUsesWith(I, IsLogical
1999+
? Builder.CreateLogicalAnd(Res, Y)
2000+
: Builder.CreateAnd(Res, Y));
2001+
// LHS & (X && Y) --> X && (LHS & Y)
19962002
if (auto *Cmp = dyn_cast<ICmpInst>(Y))
1997-
if (Value *Res = foldAndOrOfICmps(LHS, Cmp, I, /* IsAnd */ true))
1998-
return replaceInstUsesWith(I, Builder.CreateAnd(X, Res));
2003+
if (Value *Res = foldAndOrOfICmps(LHS, Cmp, I, /* IsAnd */ true,
2004+
/* IsLogical */ false))
2005+
return replaceInstUsesWith(I, IsLogical
2006+
? Builder.CreateLogicalAnd(X, Res)
2007+
: Builder.CreateAnd(X, Res));
19992008
}
2000-
if (RHS && match(Op0, m_OneUse(m_And(m_Value(X), m_Value(Y))))) {
2009+
if (RHS && match(Op0, m_OneUse(m_LogicalAnd(m_Value(X), m_Value(Y))))) {
2010+
bool IsLogical = isa<SelectInst>(Op0);
2011+
// (X && Y) & RHS --> (X && RHS) && Y
20012012
if (auto *Cmp = dyn_cast<ICmpInst>(X))
2002-
if (Value *Res = foldAndOrOfICmps(Cmp, RHS, I, /* IsAnd */ true))
2003-
return replaceInstUsesWith(I, Builder.CreateAnd(Res, Y));
2013+
if (Value *Res =
2014+
foldAndOrOfICmps(Cmp, RHS, I, /* IsAnd */ true, IsLogical))
2015+
return replaceInstUsesWith(I, IsLogical
2016+
? Builder.CreateLogicalAnd(Res, Y)
2017+
: Builder.CreateAnd(Res, Y));
2018+
// (X && Y) & RHS --> X && (Y & RHS)
20042019
if (auto *Cmp = dyn_cast<ICmpInst>(Y))
2005-
if (Value *Res = foldAndOrOfICmps(Cmp, RHS, I, /* IsAnd */ true))
2006-
return replaceInstUsesWith(I, Builder.CreateAnd(X, Res));
2020+
if (Value *Res = foldAndOrOfICmps(Cmp, RHS, I, /* IsAnd */ true,
2021+
/* IsLogical */ false))
2022+
return replaceInstUsesWith(I, IsLogical
2023+
? Builder.CreateLogicalAnd(X, Res)
2024+
: Builder.CreateAnd(X, Res));
20072025
}
20082026
}
20092027

@@ -2788,21 +2806,39 @@ Instruction *InstCombinerImpl::visitOr(BinaryOperator &I) {
27882806
// TODO: Make this recursive; it's a little tricky because an arbitrary
27892807
// number of 'or' instructions might have to be created.
27902808
Value *X, *Y;
2791-
if (LHS && match(Op1, m_OneUse(m_Or(m_Value(X), m_Value(Y))))) {
2809+
if (LHS && match(Op1, m_OneUse(m_LogicalOr(m_Value(X), m_Value(Y))))) {
2810+
bool IsLogical = isa<SelectInst>(Op1);
2811+
// LHS | (X || Y) --> (LHS || X) || Y
27922812
if (auto *Cmp = dyn_cast<ICmpInst>(X))
2793-
if (Value *Res = foldAndOrOfICmps(LHS, Cmp, I, /* IsAnd */ false))
2794-
return replaceInstUsesWith(I, Builder.CreateOr(Res, Y));
2813+
if (Value *Res =
2814+
foldAndOrOfICmps(LHS, Cmp, I, /* IsAnd */ false, IsLogical))
2815+
return replaceInstUsesWith(I, IsLogical
2816+
? Builder.CreateLogicalOr(Res, Y)
2817+
: Builder.CreateOr(Res, Y));
2818+
// LHS | (X || Y) --> X || (LHS | Y)
27952819
if (auto *Cmp = dyn_cast<ICmpInst>(Y))
2796-
if (Value *Res = foldAndOrOfICmps(LHS, Cmp, I, /* IsAnd */ false))
2797-
return replaceInstUsesWith(I, Builder.CreateOr(X, Res));
2820+
if (Value *Res = foldAndOrOfICmps(LHS, Cmp, I, /* IsAnd */ false,
2821+
/* IsLogical */ false))
2822+
return replaceInstUsesWith(I, IsLogical
2823+
? Builder.CreateLogicalOr(X, Res)
2824+
: Builder.CreateOr(X, Res));
27982825
}
2799-
if (RHS && match(Op0, m_OneUse(m_Or(m_Value(X), m_Value(Y))))) {
2826+
if (RHS && match(Op0, m_OneUse(m_LogicalOr(m_Value(X), m_Value(Y))))) {
2827+
bool IsLogical = isa<SelectInst>(Op0);
2828+
// (X || Y) | RHS --> (X || RHS) || Y
28002829
if (auto *Cmp = dyn_cast<ICmpInst>(X))
2801-
if (Value *Res = foldAndOrOfICmps(Cmp, RHS, I, /* IsAnd */ false))
2802-
return replaceInstUsesWith(I, Builder.CreateOr(Res, Y));
2830+
if (Value *Res =
2831+
foldAndOrOfICmps(Cmp, RHS, I, /* IsAnd */ false, IsLogical))
2832+
return replaceInstUsesWith(I, IsLogical
2833+
? Builder.CreateLogicalOr(Res, Y)
2834+
: Builder.CreateOr(Res, Y));
2835+
// (X || Y) | RHS --> X || (Y | RHS)
28032836
if (auto *Cmp = dyn_cast<ICmpInst>(Y))
2804-
if (Value *Res = foldAndOrOfICmps(Cmp, RHS, I, /* IsAnd */ false))
2805-
return replaceInstUsesWith(I, Builder.CreateOr(X, Res));
2837+
if (Value *Res = foldAndOrOfICmps(Cmp, RHS, I, /* IsAnd */ false,
2838+
/* IsLogical */ false))
2839+
return replaceInstUsesWith(I, IsLogical
2840+
? Builder.CreateLogicalOr(X, Res)
2841+
: Builder.CreateOr(X, Res));
28062842
}
28072843
}
28082844

llvm/test/Transforms/InstCombine/and-or-icmps.ll

Lines changed: 42 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1364,14 +1364,12 @@ define i1 @bitwise_and_bitwise_and_icmps_comm3(i8 %x, i8 %y, i8 %z) {
13641364
define i1 @bitwise_and_logical_and_icmps(i8 %x, i8 %y, i8 %z) {
13651365
; CHECK-LABEL: @bitwise_and_logical_and_icmps(
13661366
; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
1367-
; CHECK-NEXT: [[X_M1:%.*]] = and i8 [[X:%.*]], 1
13681367
; CHECK-NEXT: [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
1369-
; CHECK-NEXT: [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
1370-
; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[X_M1]], 0
1371-
; CHECK-NEXT: [[C3:%.*]] = icmp ne i8 [[X_M2]], 0
1372-
; CHECK-NEXT: [[AND1:%.*]] = select i1 [[C1]], i1 [[C2]], i1 false
1373-
; CHECK-NEXT: [[AND2:%.*]] = and i1 [[AND1]], [[C3]]
1374-
; CHECK-NEXT: ret i1 [[AND2]]
1368+
; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
1369+
; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
1370+
; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP2]], [[TMP1]]
1371+
; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[C1]], i1 [[TMP3]], i1 false
1372+
; CHECK-NEXT: ret i1 [[TMP4]]
13751373
;
13761374
%c1 = icmp eq i8 %y, 42
13771375
%x.m1 = and i8 %x, 1
@@ -1387,14 +1385,12 @@ define i1 @bitwise_and_logical_and_icmps(i8 %x, i8 %y, i8 %z) {
13871385
define i1 @bitwise_and_logical_and_icmps_comm1(i8 %x, i8 %y, i8 %z) {
13881386
; CHECK-LABEL: @bitwise_and_logical_and_icmps_comm1(
13891387
; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
1390-
; CHECK-NEXT: [[X_M1:%.*]] = and i8 [[X:%.*]], 1
13911388
; CHECK-NEXT: [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
1392-
; CHECK-NEXT: [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
1393-
; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[X_M1]], 0
1394-
; CHECK-NEXT: [[C3:%.*]] = icmp ne i8 [[X_M2]], 0
1395-
; CHECK-NEXT: [[AND1:%.*]] = select i1 [[C1]], i1 [[C2]], i1 false
1396-
; CHECK-NEXT: [[AND2:%.*]] = and i1 [[C3]], [[AND1]]
1397-
; CHECK-NEXT: ret i1 [[AND2]]
1389+
; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
1390+
; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
1391+
; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP2]], [[TMP1]]
1392+
; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[C1]], i1 [[TMP3]], i1 false
1393+
; CHECK-NEXT: ret i1 [[TMP4]]
13981394
;
13991395
%c1 = icmp eq i8 %y, 42
14001396
%x.m1 = and i8 %x, 1
@@ -1410,14 +1406,13 @@ define i1 @bitwise_and_logical_and_icmps_comm1(i8 %x, i8 %y, i8 %z) {
14101406
define i1 @bitwise_and_logical_and_icmps_comm2(i8 %x, i8 %y, i8 %z) {
14111407
; CHECK-LABEL: @bitwise_and_logical_and_icmps_comm2(
14121408
; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
1413-
; CHECK-NEXT: [[X_M1:%.*]] = and i8 [[X:%.*]], 1
14141409
; CHECK-NEXT: [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
1415-
; CHECK-NEXT: [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
1416-
; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[X_M1]], 0
1417-
; CHECK-NEXT: [[C3:%.*]] = icmp ne i8 [[X_M2]], 0
1418-
; CHECK-NEXT: [[AND1:%.*]] = select i1 [[C2]], i1 [[C1]], i1 false
1419-
; CHECK-NEXT: [[AND2:%.*]] = and i1 [[AND1]], [[C3]]
1420-
; CHECK-NEXT: ret i1 [[AND2]]
1410+
; CHECK-NEXT: [[TMP1:%.*]] = freeze i8 [[Z_SHIFT]]
1411+
; CHECK-NEXT: [[TMP2:%.*]] = or i8 [[TMP1]], 1
1412+
; CHECK-NEXT: [[TMP3:%.*]] = and i8 [[TMP2]], [[X:%.*]]
1413+
; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i8 [[TMP3]], [[TMP2]]
1414+
; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TMP4]], i1 [[C1]], i1 false
1415+
; CHECK-NEXT: ret i1 [[TMP5]]
14211416
;
14221417
%c1 = icmp eq i8 %y, 42
14231418
%x.m1 = and i8 %x, 1
@@ -1433,14 +1428,12 @@ define i1 @bitwise_and_logical_and_icmps_comm2(i8 %x, i8 %y, i8 %z) {
14331428
define i1 @bitwise_and_logical_and_icmps_comm3(i8 %x, i8 %y, i8 %z) {
14341429
; CHECK-LABEL: @bitwise_and_logical_and_icmps_comm3(
14351430
; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
1436-
; CHECK-NEXT: [[X_M1:%.*]] = and i8 [[X:%.*]], 1
14371431
; CHECK-NEXT: [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
1438-
; CHECK-NEXT: [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
1439-
; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[X_M1]], 0
1440-
; CHECK-NEXT: [[C3:%.*]] = icmp ne i8 [[X_M2]], 0
1441-
; CHECK-NEXT: [[AND1:%.*]] = select i1 [[C2]], i1 [[C1]], i1 false
1442-
; CHECK-NEXT: [[AND2:%.*]] = and i1 [[C3]], [[AND1]]
1443-
; CHECK-NEXT: ret i1 [[AND2]]
1432+
; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
1433+
; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
1434+
; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP2]], [[TMP1]]
1435+
; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i1 [[C1]], i1 false
1436+
; CHECK-NEXT: ret i1 [[TMP4]]
14441437
;
14451438
%c1 = icmp eq i8 %y, 42
14461439
%x.m1 = and i8 %x, 1
@@ -1722,14 +1715,12 @@ define i1 @bitwise_or_bitwise_or_icmps_comm3(i8 %x, i8 %y, i8 %z) {
17221715
define i1 @bitwise_or_logical_or_icmps(i8 %x, i8 %y, i8 %z) {
17231716
; CHECK-LABEL: @bitwise_or_logical_or_icmps(
17241717
; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
1725-
; CHECK-NEXT: [[X_M1:%.*]] = and i8 [[X:%.*]], 1
17261718
; CHECK-NEXT: [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
1727-
; CHECK-NEXT: [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
1728-
; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[X_M1]], 0
1729-
; CHECK-NEXT: [[C3:%.*]] = icmp eq i8 [[X_M2]], 0
1730-
; CHECK-NEXT: [[OR1:%.*]] = select i1 [[C1]], i1 true, i1 [[C2]]
1731-
; CHECK-NEXT: [[OR2:%.*]] = or i1 [[OR1]], [[C3]]
1732-
; CHECK-NEXT: ret i1 [[OR2]]
1719+
; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
1720+
; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
1721+
; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP2]], [[TMP1]]
1722+
; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[C1]], i1 true, i1 [[TMP3]]
1723+
; CHECK-NEXT: ret i1 [[TMP4]]
17331724
;
17341725
%c1 = icmp eq i8 %y, 42
17351726
%x.m1 = and i8 %x, 1
@@ -1745,14 +1736,12 @@ define i1 @bitwise_or_logical_or_icmps(i8 %x, i8 %y, i8 %z) {
17451736
define i1 @bitwise_or_logical_or_icmps_comm1(i8 %x, i8 %y, i8 %z) {
17461737
; CHECK-LABEL: @bitwise_or_logical_or_icmps_comm1(
17471738
; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
1748-
; CHECK-NEXT: [[X_M1:%.*]] = and i8 [[X:%.*]], 1
17491739
; CHECK-NEXT: [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
1750-
; CHECK-NEXT: [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
1751-
; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[X_M1]], 0
1752-
; CHECK-NEXT: [[C3:%.*]] = icmp eq i8 [[X_M2]], 0
1753-
; CHECK-NEXT: [[OR1:%.*]] = select i1 [[C1]], i1 true, i1 [[C2]]
1754-
; CHECK-NEXT: [[OR2:%.*]] = or i1 [[C3]], [[OR1]]
1755-
; CHECK-NEXT: ret i1 [[OR2]]
1740+
; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
1741+
; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
1742+
; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP2]], [[TMP1]]
1743+
; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[C1]], i1 true, i1 [[TMP3]]
1744+
; CHECK-NEXT: ret i1 [[TMP4]]
17561745
;
17571746
%c1 = icmp eq i8 %y, 42
17581747
%x.m1 = and i8 %x, 1
@@ -1768,14 +1757,13 @@ define i1 @bitwise_or_logical_or_icmps_comm1(i8 %x, i8 %y, i8 %z) {
17681757
define i1 @bitwise_or_logical_or_icmps_comm2(i8 %x, i8 %y, i8 %z) {
17691758
; CHECK-LABEL: @bitwise_or_logical_or_icmps_comm2(
17701759
; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
1771-
; CHECK-NEXT: [[X_M1:%.*]] = and i8 [[X:%.*]], 1
17721760
; CHECK-NEXT: [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
1773-
; CHECK-NEXT: [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
1774-
; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[X_M1]], 0
1775-
; CHECK-NEXT: [[C3:%.*]] = icmp eq i8 [[X_M2]], 0
1776-
; CHECK-NEXT: [[OR1:%.*]] = select i1 [[C2]], i1 true, i1 [[C1]]
1777-
; CHECK-NEXT: [[OR2:%.*]] = or i1 [[OR1]], [[C3]]
1778-
; CHECK-NEXT: ret i1 [[OR2]]
1761+
; CHECK-NEXT: [[TMP1:%.*]] = freeze i8 [[Z_SHIFT]]
1762+
; CHECK-NEXT: [[TMP2:%.*]] = or i8 [[TMP1]], 1
1763+
; CHECK-NEXT: [[TMP3:%.*]] = and i8 [[TMP2]], [[X:%.*]]
1764+
; CHECK-NEXT: [[TMP4:%.*]] = icmp ne i8 [[TMP3]], [[TMP2]]
1765+
; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TMP4]], i1 true, i1 [[C1]]
1766+
; CHECK-NEXT: ret i1 [[TMP5]]
17791767
;
17801768
%c1 = icmp eq i8 %y, 42
17811769
%x.m1 = and i8 %x, 1
@@ -1791,14 +1779,12 @@ define i1 @bitwise_or_logical_or_icmps_comm2(i8 %x, i8 %y, i8 %z) {
17911779
define i1 @bitwise_or_logical_or_icmps_comm3(i8 %x, i8 %y, i8 %z) {
17921780
; CHECK-LABEL: @bitwise_or_logical_or_icmps_comm3(
17931781
; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
1794-
; CHECK-NEXT: [[X_M1:%.*]] = and i8 [[X:%.*]], 1
17951782
; CHECK-NEXT: [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
1796-
; CHECK-NEXT: [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
1797-
; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[X_M1]], 0
1798-
; CHECK-NEXT: [[C3:%.*]] = icmp eq i8 [[X_M2]], 0
1799-
; CHECK-NEXT: [[OR1:%.*]] = select i1 [[C2]], i1 true, i1 [[C1]]
1800-
; CHECK-NEXT: [[OR2:%.*]] = or i1 [[C3]], [[OR1]]
1801-
; CHECK-NEXT: ret i1 [[OR2]]
1783+
; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
1784+
; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
1785+
; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP2]], [[TMP1]]
1786+
; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i1 true, i1 [[C1]]
1787+
; CHECK-NEXT: ret i1 [[TMP4]]
18021788
;
18031789
%c1 = icmp eq i8 %y, 42
18041790
%x.m1 = and i8 %x, 1

llvm/test/Transforms/InstCombine/and2.ll

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,9 @@ define i1 @test7(i32 %i, i1 %b) {
4646

4747
define i1 @test7_logical(i32 %i, i1 %b) {
4848
; CHECK-LABEL: @test7_logical(
49-
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[I:%.*]], 1
50-
; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[I]], -1
51-
; CHECK-NEXT: [[AND1:%.*]] = select i1 [[CMP1]], i1 [[B:%.*]], i1 false
52-
; CHECK-NEXT: [[AND2:%.*]] = and i1 [[AND1]], [[CMP2]]
53-
; CHECK-NEXT: ret i1 [[AND2]]
49+
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[I:%.*]], 0
50+
; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i1 [[B:%.*]], i1 false
51+
; CHECK-NEXT: ret i1 [[TMP2]]
5452
;
5553
%cmp1 = icmp slt i32 %i, 1
5654
%cmp2 = icmp sgt i32 %i, -1

0 commit comments

Comments
 (0)