Fold away one multiply in instcombine. This would normally be caught in

reassociate anyways, but they could be generated during instcombine's run.

llvm-svn: 46683
This commit is contained in:
Nick Lewycky 2008-02-03 07:42:09 +00:00
parent 391e0937e7
commit ce4c4698d7

View File

@ -2123,6 +2123,30 @@ Instruction *InstCombiner::visitAdd(BinaryOperator &I) {
if (Instruction *R = AssociativeOpt(I, AddMaskingAnd(C2)))
return R;
// W*X + Y*Z --> W * (X+Z) iff W == Y
if (I.getType()->isInteger()) {
Value *W, *X, *Y, *Z;
if (match(LHS, m_Mul(m_Value(W), m_Value(X))) &&
match(RHS, m_Mul(m_Value(Y), m_Value(Z)))) {
if (W != Y) {
if (W == Z) {
std::swap(Y, Z);
} else if (Y == X) {
std::swap(W, X);
} else if (X == Z) {
std::swap(Y, Z);
std::swap(W, X);
}
}
if (W == Y) {
Value *NewAdd = InsertNewInstBefore(BinaryOperator::createAdd(X, Z,
LHS->getName()), I);
return BinaryOperator::createMul(W, NewAdd);
}
}
}
if (ConstantInt *CRHS = dyn_cast<ConstantInt>(RHS)) {
Value *X = 0;
if (match(LHS, m_Not(m_Value(X)))) // ~X + C --> (C-1) - X