diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-11-22 04:52:52 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-11-22 04:52:52 +0000 |
commit | fd4a6d2b7aa6fc16f5722ae840867b92ed9c981b (patch) | |
tree | 5834c367fe47006ba092299b657cc227ce3c8563 /llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp | |
parent | 027bc80928e00f143db3de878b4cf828f305a92a (diff) | |
download | llvm-fd4a6d2b7aa6fc16f5722ae840867b92ed9c981b.zip llvm-fd4a6d2b7aa6fc16f5722ae840867b92ed9c981b.tar.gz llvm-fd4a6d2b7aa6fc16f5722ae840867b92ed9c981b.tar.bz2 |
InstCombine: Preserve nsw/nuw for ((X << C2)*C1) -> (X * (C1 << C2))
llvm-svn: 222605
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp index c96c2d6..7844223 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp @@ -151,9 +151,18 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) { const APInt *IVal; if (match(&I, m_Mul(m_Shl(m_Value(NewOp), m_Constant(C2)), m_Constant(C1))) && - match(C1, m_APInt(IVal))) - // ((X << C1)*C2) == (X * (C2 << C1)) - return BinaryOperator::CreateMul(NewOp, ConstantExpr::getShl(C1, C2)); + match(C1, m_APInt(IVal))) { + // ((X << C2)*C1) == (X * (C1 << C2)) + Constant *Shl = ConstantExpr::getShl(C1, C2); + BinaryOperator *Mul = cast<BinaryOperator>(I.getOperand(0)); + BinaryOperator *BO = BinaryOperator::CreateMul(NewOp, Shl); + if (I.hasNoUnsignedWrap() && Mul->hasNoUnsignedWrap()) + BO->setHasNoUnsignedWrap(); + if (I.hasNoSignedWrap() && Mul->hasNoSignedWrap() && + Shl->isNotMinSignedValue()) + BO->setHasNoSignedWrap(); + return BO; + } if (match(&I, m_Mul(m_Value(NewOp), m_Constant(C1)))) { Constant *NewCst = nullptr; |