diff options
author | Bill Wendling <isanbard@gmail.com> | 2008-11-30 12:38:24 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2008-11-30 12:38:24 +0000 |
commit | 2d2e7861b5aeb18b189abe95d0cbbd6e01b2deb2 (patch) | |
tree | 4beb516855b67f71530d398bae174437ba740275 /llvm/lib/Transforms | |
parent | 09bc6109455ef105f6a2d88c90904a817157eb61 (diff) | |
download | bcm5719-llvm-2d2e7861b5aeb18b189abe95d0cbbd6e01b2deb2.tar.gz bcm5719-llvm-2d2e7861b5aeb18b189abe95d0cbbd6e01b2deb2.zip |
getSExtValue() doesn't work for ConstantInts with bitwidth > 64 bits. Use all
APInt calls instead.
This fixes PR3144.
llvm-svn: 60288
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Scalar/InstructionCombining.cpp | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp index f3cb747e56f..93510f0593f 100644 --- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp @@ -2957,21 +2957,21 @@ Instruction *InstCombiner::visitSDiv(BinaryOperator &I) { return BinaryOperator::CreateNeg(Op0); ConstantInt *RHSNeg = cast<ConstantInt>(ConstantExpr::getNeg(RHS)); - APInt RHSNegAPI(RHSNeg->getBitWidth(), RHSNeg->getSExtValue(), true); + APInt RHSNegAPI(RHSNeg->getValue()); APInt NegOne = -APInt(RHSNeg->getBitWidth(), 1, true); APInt TwoToExp(RHSNeg->getBitWidth(), 1 << (RHSNeg->getBitWidth() - 1)); // -X/C -> X/-C, if and only if negation doesn't overflow. - if ((RHS->getSExtValue() < 0 && RHSNegAPI.slt(TwoToExp - 1)) || - (RHS->getSExtValue() > 0 && RHSNegAPI.sgt(TwoToExp * NegOne))) { + if ((RHS->getValue().isNegative() && RHSNegAPI.slt(TwoToExp - 1)) || + (RHS->getValue().isNonNegative() && RHSNegAPI.sgt(TwoToExp * NegOne))) { if (Value *LHSNeg = dyn_castNegVal(Op0)) { if (ConstantInt *CI = dyn_cast<ConstantInt>(LHSNeg)) { ConstantInt *CINeg = cast<ConstantInt>(ConstantExpr::getNeg(CI)); APInt CINegAPI(CINeg->getBitWidth(), CINeg->getSExtValue(), true); - if ((CI->getSExtValue() < 0 && CINegAPI.slt(TwoToExp - 1)) || - (CI->getSExtValue() > 0 && CINegAPI.sgt(TwoToExp * NegOne))) + if ((CI->getValue().isNegative() && CINegAPI.slt(TwoToExp - 1)) || + (CI->getValue().isNonNegative() && CINegAPI.sgt(TwoToExp*NegOne))) return BinaryOperator::CreateSDiv(LHSNeg, ConstantExpr::getNeg(RHS)); } |