Changeset View
Changeset View
Standalone View
Standalone View
lib/Transforms/InstCombine/InstCombineAddSub.cpp
Show First 20 Lines • Show All 1,120 Lines • ▼ Show 20 Lines | if (LHSKnownZero != 0) { | ||||
computeKnownBits(RHS, RHSKnownZero, RHSKnownOne); | computeKnownBits(RHS, RHSKnownZero, RHSKnownOne); | ||||
// No bits in common -> bitwise or. | // No bits in common -> bitwise or. | ||||
if ((LHSKnownZero|RHSKnownZero).isAllOnesValue()) | if ((LHSKnownZero|RHSKnownZero).isAllOnesValue()) | ||||
return BinaryOperator::CreateOr(LHS, RHS); | return BinaryOperator::CreateOr(LHS, RHS); | ||||
} | } | ||||
} | } | ||||
// W*X + Y*Z --> W * (X+Z) iff W == Y | |||||
{ | |||||
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 = Builder->CreateAdd(X, Z, LHS->getName()); | |||||
return BinaryOperator::CreateMul(W, NewAdd); | |||||
} | |||||
} | |||||
} | |||||
if (Constant *CRHS = dyn_cast<Constant>(RHS)) { | if (Constant *CRHS = dyn_cast<Constant>(RHS)) { | ||||
Value *X; | Value *X; | ||||
if (match(LHS, m_Not(m_Value(X)))) // ~X + C --> (C-1) - X | if (match(LHS, m_Not(m_Value(X)))) // ~X + C --> (C-1) - X | ||||
return BinaryOperator::CreateSub(SubOne(CRHS), X); | return BinaryOperator::CreateSub(SubOne(CRHS), X); | ||||
} | } | ||||
if (ConstantInt *CRHS = dyn_cast<ConstantInt>(RHS)) { | if (ConstantInt *CRHS = dyn_cast<ConstantInt>(RHS)) { | ||||
// (X & FF00) + xx00 -> (X+xx00) & FF00 | // (X & FF00) + xx00 -> (X+xx00) & FF00 | ||||
▲ Show 20 Lines • Show All 402 Lines • ▼ Show 20 Lines | if (match(Op1, m_SDiv(m_Value(X), m_Constant(C))) && | ||||
match(Op0, m_Zero())) | match(Op0, m_Zero())) | ||||
return BinaryOperator::CreateSDiv(X, ConstantExpr::getNeg(C)); | return BinaryOperator::CreateSDiv(X, ConstantExpr::getNeg(C)); | ||||
// 0 - (X << Y) -> (-X << Y) when X is freely negatable. | // 0 - (X << Y) -> (-X << Y) when X is freely negatable. | ||||
if (match(Op1, m_Shl(m_Value(X), m_Value(Y))) && match(Op0, m_Zero())) | if (match(Op1, m_Shl(m_Value(X), m_Value(Y))) && match(Op0, m_Zero())) | ||||
if (Value *XNeg = dyn_castNegVal(X)) | if (Value *XNeg = dyn_castNegVal(X)) | ||||
return BinaryOperator::CreateShl(XNeg, Y); | return BinaryOperator::CreateShl(XNeg, Y); | ||||
// X - X*C --> X * (1-C) | |||||
if (match(Op1, m_Mul(m_Specific(Op0), m_Constant(CI)))) { | |||||
Constant *CP1 = ConstantExpr::getSub(ConstantInt::get(I.getType(),1), CI); | |||||
return BinaryOperator::CreateMul(Op0, CP1); | |||||
} | |||||
// X - X<<C --> X * (1-(1<<C)) | |||||
if (match(Op1, m_Shl(m_Specific(Op0), m_Constant(CI)))) { | |||||
Constant *One = ConstantInt::get(I.getType(), 1); | |||||
C = ConstantExpr::getSub(One, ConstantExpr::getShl(One, CI)); | |||||
return BinaryOperator::CreateMul(Op0, C); | |||||
} | |||||
// X - A*-B -> X + A*B | // X - A*-B -> X + A*B | ||||
// X - -A*B -> X + A*B | // X - -A*B -> X + A*B | ||||
Value *A, *B; | Value *A, *B; | ||||
if (match(Op1, m_Mul(m_Value(A), m_Neg(m_Value(B)))) || | if (match(Op1, m_Mul(m_Value(A), m_Neg(m_Value(B)))) || | ||||
match(Op1, m_Mul(m_Neg(m_Value(A)), m_Value(B)))) | match(Op1, m_Mul(m_Neg(m_Value(A)), m_Value(B)))) | ||||
return BinaryOperator::CreateAdd(Op0, Builder->CreateMul(A, B)); | return BinaryOperator::CreateAdd(Op0, Builder->CreateMul(A, B)); | ||||
// X - A*CI -> X + A*-CI | // X - A*CI -> X + A*-CI | ||||
▲ Show 20 Lines • Show All 71 Lines • Show Last 20 Lines |