diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-11-22 20:00:41 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-11-22 20:00:41 +0000 |
commit | fb3805576b3b2907cbd0c425656d93d4eaed729f (patch) | |
tree | 3a0d5fda99ccc2f2bcf6639aa2a46079e90ce222 /llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp | |
parent | ec6e481bc5f77188efeccca73b5eafcc9eb2b663 (diff) | |
download | llvm-fb3805576b3b2907cbd0c425656d93d4eaed729f.zip llvm-fb3805576b3b2907cbd0c425656d93d4eaed729f.tar.gz llvm-fb3805576b3b2907cbd0c425656d93d4eaed729f.tar.bz2 |
InstCombine: Propagate exact for (sdiv X, Pow2) -> (udiv X, Pow2)
llvm-svn: 222625
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp index 216177f..d7847ca 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp @@ -1102,12 +1102,14 @@ Instruction *InstCombiner::visitSDiv(BinaryOperator &I) { return BO; } - if (match(Op1, m_Shl(m_Power2(), m_Value()))) { + if (isKnownToBeAPowerOfTwo(Op1, /*OrZero*/true, 0, AT, &I, DT)) { // X sdiv (1 << Y) -> X udiv (1 << Y) ( -> X u>> Y) // Safe because the only negative value (1 << Y) can take on is // INT_MIN, and X sdiv INT_MIN == X udiv INT_MIN == 0 if X doesn't have // the sign bit set. - return BinaryOperator::CreateUDiv(Op0, Op1, I.getName()); + auto *BO = BinaryOperator::CreateUDiv(Op0, Op1, I.getName()); + BO->setIsExact(I.isExact()); + return BO; } } } |