Skip to content

Commit 2d61b5e

Browse files
nikiczmodem
authored andcommitted
Reduce code duplication in simplifySelectWithICmpCond (NFC)
Canonicalize icmp ne to icmp eq and implement all the folds only once.
1 parent b3fb40b commit 2d61b5e

File tree

1 file changed

+9
-25
lines changed

1 file changed

+9
-25
lines changed

llvm/lib/Analysis/InstructionSimplify.cpp

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3965,12 +3965,18 @@ static Value *simplifySelectWithICmpCond(Value *CondVal, Value *TrueVal,
39653965
if (!match(CondVal, m_ICmp(Pred, m_Value(CmpLHS), m_Value(CmpRHS))))
39663966
return nullptr;
39673967

3968-
if (ICmpInst::isEquality(Pred) && match(CmpRHS, m_Zero())) {
3968+
// Canonicalize ne to eq predicate.
3969+
if (Pred == ICmpInst::ICMP_NE) {
3970+
Pred = ICmpInst::ICMP_EQ;
3971+
std::swap(TrueVal, FalseVal);
3972+
}
3973+
3974+
if (Pred == ICmpInst::ICMP_EQ && match(CmpRHS, m_Zero())) {
39693975
Value *X;
39703976
const APInt *Y;
39713977
if (match(CmpLHS, m_And(m_Value(X), m_APInt(Y))))
39723978
if (Value *V = simplifySelectBitTest(TrueVal, FalseVal, X, Y,
3973-
Pred == ICmpInst::ICMP_EQ))
3979+
/*TrueWhenUnset=*/true))
39743980
return V;
39753981

39763982
// Test for a bogus zero-shift-guard-op around funnel-shift or rotate.
@@ -3981,13 +3987,7 @@ static Value *simplifySelectWithICmpCond(Value *CondVal, Value *TrueVal,
39813987
m_Value(ShAmt)));
39823988
// (ShAmt == 0) ? fshl(X, *, ShAmt) : X --> X
39833989
// (ShAmt == 0) ? fshr(*, X, ShAmt) : X --> X
3984-
if (match(TrueVal, isFsh) && FalseVal == X && CmpLHS == ShAmt &&
3985-
Pred == ICmpInst::ICMP_EQ)
3986-
return X;
3987-
// (ShAmt != 0) ? X : fshl(X, *, ShAmt) --> X
3988-
// (ShAmt != 0) ? X : fshr(*, X, ShAmt) --> X
3989-
if (match(FalseVal, isFsh) && TrueVal == X && CmpLHS == ShAmt &&
3990-
Pred == ICmpInst::ICMP_NE)
3990+
if (match(TrueVal, isFsh) && FalseVal == X && CmpLHS == ShAmt)
39913991
return X;
39923992

39933993
// Test for a zero-shift-guard-op around rotates. These are used to
@@ -4001,11 +4001,6 @@ static Value *simplifySelectWithICmpCond(Value *CondVal, Value *TrueVal,
40014001
m_Intrinsic<Intrinsic::fshr>(m_Value(X),
40024002
m_Deferred(X),
40034003
m_Value(ShAmt)));
4004-
// (ShAmt != 0) ? fshl(X, X, ShAmt) : X --> fshl(X, X, ShAmt)
4005-
// (ShAmt != 0) ? fshr(X, X, ShAmt) : X --> fshr(X, X, ShAmt)
4006-
if (match(TrueVal, isRotate) && FalseVal == X && CmpLHS == ShAmt &&
4007-
Pred == ICmpInst::ICMP_NE)
4008-
return TrueVal;
40094004
// (ShAmt == 0) ? X : fshl(X, X, ShAmt) --> fshl(X, X, ShAmt)
40104005
// (ShAmt == 0) ? X : fshr(X, X, ShAmt) --> fshr(X, X, ShAmt)
40114006
if (match(FalseVal, isRotate) && TrueVal == X && CmpLHS == ShAmt &&
@@ -4032,17 +4027,6 @@ static Value *simplifySelectWithICmpCond(Value *CondVal, Value *TrueVal,
40324027
SimplifyWithOpReplaced(TrueVal, CmpRHS, CmpLHS, Q, MaxRecurse) ==
40334028
FalseVal)
40344029
return FalseVal;
4035-
} else if (Pred == ICmpInst::ICMP_NE) {
4036-
if (SimplifyWithOpReplaced(TrueVal, CmpLHS, CmpRHS, Q, MaxRecurse) ==
4037-
FalseVal ||
4038-
SimplifyWithOpReplaced(TrueVal, CmpRHS, CmpLHS, Q, MaxRecurse) ==
4039-
FalseVal)
4040-
return TrueVal;
4041-
if (SimplifyWithOpReplaced(FalseVal, CmpLHS, CmpRHS, Q, MaxRecurse) ==
4042-
TrueVal ||
4043-
SimplifyWithOpReplaced(FalseVal, CmpRHS, CmpLHS, Q, MaxRecurse) ==
4044-
TrueVal)
4045-
return TrueVal;
40464030
}
40474031

40484032
return nullptr;

0 commit comments

Comments
 (0)