aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2014-11-22 07:25:19 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2014-11-22 07:25:19 +0000
commit8279a7506dad974fd2ce164d4e45984573ebcd2c (patch)
tree7a4a7825cdc3cabddeb38a1ca6f1b2850aaf9cab /llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
parent4efa9ff8ca832d2a87f553c65960f81f02bb2843 (diff)
downloadllvm-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.cpp13
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