[InstCombine] Combine adds across a zext

We can perform the following:
(add (zext (add nuw X, C1)), C2) -> (zext (add nuw X, C1+C2))

This is only possible if C2 is negative and C2 is greater than or equal to negative C1.

llvm-svn: 290927
This commit is contained in:
David Majnemer
2017-01-04 02:21:31 +00:00
parent 6298b44448
commit 022d2a563b
2 changed files with 24 additions and 0 deletions

View File

@@ -1057,6 +1057,18 @@ Instruction *InstCombiner::visitAdd(BinaryOperator &I) {
// add(zext(xor i16 X, -32768), -32768) --> sext X
return CastInst::Create(Instruction::SExt, X, LHS->getType());
}
if (Val->isNegative() &&
match(LHS, m_ZExt(m_NUWAdd(m_Value(X), m_APInt(C)))) &&
Val->sge(-C->sext(Val->getBitWidth()))) {
// (add (zext (add nuw X, C)), Val) -> (zext (add nuw X, C+Val))
return CastInst::Create(
Instruction::ZExt,
Builder->CreateNUWAdd(
X, Constant::getIntegerValue(X->getType(),
*C + Val->trunc(C->getBitWidth()))),
I.getType());
}
}
// FIXME: Use the match above instead of dyn_cast to allow these transforms