diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-11-22 07:25:19 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-11-22 07:25:19 +0000 |
commit | 8279a7506dad974fd2ce164d4e45984573ebcd2c (patch) | |
tree | 7a4a7825cdc3cabddeb38a1ca6f1b2850aaf9cab /llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp | |
parent | 4efa9ff8ca832d2a87f553c65960f81f02bb2843 (diff) | |
download | llvm-8279a7506dad974fd2ce164d4e45984573ebcd2c.zip llvm-8279a7506dad974fd2ce164d4e45984573ebcd2c.tar.gz llvm-8279a7506dad974fd2ce164d4e45984573ebcd2c.tar.bz2 |
InstCombine: Propagate NSW for -X * -Y -> X * Y
llvm-svn: 222612
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp index 5ea25bf..78f585f 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp @@ -237,9 +237,16 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) { } } - if (Value *Op0v = dyn_castNegVal(Op0)) // -X * -Y = X*Y - if (Value *Op1v = dyn_castNegVal(Op1)) - return BinaryOperator::CreateMul(Op0v, Op1v); + if (Value *Op0v = dyn_castNegVal(Op0)) { // -X * -Y = X*Y + if (Value *Op1v = dyn_castNegVal(Op1)) { + BinaryOperator *BO = BinaryOperator::CreateMul(Op0v, Op1v); + if (I.hasNoSignedWrap() && + match(Op0, m_NSWSub(m_Value(), m_Value())) && + match(Op1, m_NSWSub(m_Value(), m_Value()))) + BO->setHasNoSignedWrap(); + return BO; + } + } // (X / Y) * Y = X - (X % Y) // (X / Y) * -Y = (X % Y) - X |