forked from OSchip/llvm-project
[InstCombine] revert r339439 - rearrange code for foldSelectBinOpIdentity
That was supposed to be NFC, but it exposed a logic hole somewhere that caused bots to fail. llvm-svn: 339446
This commit is contained in:
parent
5099835541
commit
c9cc86a5b3
|
@ -54,38 +54,34 @@ static Value *createMinMax(InstCombiner::BuilderTy &Builder,
|
|||
return Builder.CreateSelect(Builder.CreateICmp(Pred, A, B), A, B);
|
||||
}
|
||||
|
||||
/// Replace a select operand based on an equality comparison with the identity
|
||||
/// constant of a binop.
|
||||
/// Fold
|
||||
/// %A = icmp eq/ne i8 %x, 0
|
||||
/// %B = op i8 %x, %z
|
||||
/// %C = select i1 %A, i8 %B, i8 %y
|
||||
/// To
|
||||
/// %C = select i1 %A, i8 %z, i8 %y
|
||||
/// OP: binop with an identity constant
|
||||
/// TODO: support for non-commutative and FP opcodes
|
||||
static Instruction *foldSelectBinOpIdentity(SelectInst &Sel) {
|
||||
// The select condition must be an equality compare with a constant operand.
|
||||
// TODO: Support FP compares.
|
||||
Value *X;
|
||||
|
||||
Value *Cond = Sel.getCondition();
|
||||
Value *X, *Z;
|
||||
Constant *C;
|
||||
CmpInst::Predicate Pred;
|
||||
if (!match(Sel.getCondition(), m_ICmp(Pred, m_Value(X), m_Constant(C))) ||
|
||||
if (!match(Cond, m_ICmp(Pred, m_Value(X), m_Constant(C))) ||
|
||||
!ICmpInst::isEquality(Pred))
|
||||
return nullptr;
|
||||
|
||||
// A select operand must be a binop, and the compare constant must be the
|
||||
// identity constant for that binop.
|
||||
// TODO: Support non-commutative binops.
|
||||
bool IsEq = Pred == ICmpInst::ICMP_EQ;
|
||||
BinaryOperator *BO;
|
||||
if (!match(Sel.getOperand(IsEq ? 1 : 2), m_BinOp(BO)) ||
|
||||
ConstantExpr::getBinOpIdentity(BO->getOpcode(), X->getType(), false) != C)
|
||||
return nullptr;
|
||||
|
||||
// Last, match the compare variable operand with a binop operand.
|
||||
Value *Y;
|
||||
if (!match(BO, m_c_BinOp(m_Value(Y), m_Specific(X))))
|
||||
return nullptr;
|
||||
|
||||
// BO = binop Y, X
|
||||
// S = { select (cmp eq X, C), BO, ? } or { select (cmp ne X, C), ?, BO }
|
||||
// =>
|
||||
// S = { select (cmp eq X, C), Y, ? } or { select (cmp ne X, C), ?, Y }
|
||||
Sel.setOperand(IsEq ? 1 : 2, Y);
|
||||
return &Sel;
|
||||
auto *BO =
|
||||
dyn_cast<BinaryOperator>(IsEq ? Sel.getTrueValue() : Sel.getFalseValue());
|
||||
// TODO: support for undefs
|
||||
if (BO && match(BO, m_c_BinOp(m_Specific(X), m_Value(Z))) &&
|
||||
ConstantExpr::getBinOpIdentity(BO->getOpcode(), X->getType()) == C) {
|
||||
Sel.setOperand(IsEq ? 1 : 2, Z);
|
||||
return &Sel;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/// This folds:
|
||||
|
|
Loading…
Reference in New Issue