diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-10-11 10:20:01 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-10-11 10:20:01 +0000 |
commit | cb9d59665531cb2a894ac8af7e7cf476fba40600 (patch) | |
tree | ab0f8a8ced3fe61c01f5cbd807dabda731b62411 /llvm/lib/Transforms | |
parent | 3cac85e07120f0cfcbc8e78a975f68ae99fcebbb (diff) | |
download | bcm5719-llvm-cb9d59665531cb2a894ac8af7e7cf476fba40600.tar.gz bcm5719-llvm-cb9d59665531cb2a894ac8af7e7cf476fba40600.zip |
InstCombine, InstSimplify: (%X /s C1) /s C2 isn't always 0 when C1 * C2 overflow
consider:
C1 = INT_MIN
C2 = -1
C1 * C2 overflows without a doubt but consider the following:
%x = i32 INT_MIN
This means that (%X /s C1) is 1 and (%X /s C1) /s C2 is -1.
N. B. Move the unsigned version of this transform to InstSimplify, it
doesn't create any new instructions.
This fixes PR21243.
llvm-svn: 219567
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp index 249456fa6ea..8d004f2a0a2 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp @@ -727,11 +727,10 @@ Instruction *InstCombiner::commonIDivTransforms(BinaryOperator &I) { // (X / C1) / C2 -> X / (C1*C2) if (Instruction::BinaryOps(LHS->getOpcode()) == I.getOpcode()) if (ConstantInt *LHSRHS = dyn_cast<ConstantInt>(LHS->getOperand(1))) { - if (MultiplyOverflows(RHS, LHSRHS, - I.getOpcode() == Instruction::SDiv)) - return ReplaceInstUsesWith(I, Constant::getNullValue(I.getType())); - return BinaryOperator::Create(I.getOpcode(), LHS->getOperand(0), - ConstantExpr::getMul(RHS, LHSRHS)); + if (!MultiplyOverflows(RHS, LHSRHS, + I.getOpcode() == Instruction::SDiv)) + return BinaryOperator::Create(I.getOpcode(), LHS->getOperand(0), + ConstantExpr::getMul(RHS, LHSRHS)); } Value *X; |