diff options
| author | Chris Lattner <sabre@nondot.org> | 2008-05-19 20:27:56 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2008-05-19 20:27:56 +0000 |
| commit | ba9acbe6dcf2a599093a1e414bb9d66675e0ecfd (patch) | |
| tree | 23e839383086478a9dee2e73c9a7fad337c392c0 /llvm/lib/Transforms/Scalar/InstructionCombining.cpp | |
| parent | e35fe0f1c67623ba408413c65b2b8fdae99a7822 (diff) | |
| download | bcm5719-llvm-ba9acbe6dcf2a599093a1e414bb9d66675e0ecfd.tar.gz bcm5719-llvm-ba9acbe6dcf2a599093a1e414bb9d66675e0ecfd.zip | |
minor cleanups, teach instcombine that sitofp/uitofp cannot
produce a negative zero.
llvm-svn: 51272
Diffstat (limited to 'llvm/lib/Transforms/Scalar/InstructionCombining.cpp')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/InstructionCombining.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp index 46dba398cfe..10d3344598d 100644 --- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp @@ -834,10 +834,11 @@ void InstCombiner::ComputeMaskedBits(Value *V, const APInt &Mask, case Instruction::IntToPtr: // We can't handle these if we don't know the pointer size. if (!TD) return; - // Fall through and handle them the same as zext/trunc. + // FALL THROUGH and handle them the same as zext/trunc. case Instruction::ZExt: case Instruction::Trunc: { - // All these have integer operands + // Note that we handle pointer operands here because of inttoptr/ptrtoint + // which fall through here. const Type *SrcTy = I->getOperand(0)->getType(); uint32_t SrcBitWidth = TD ? TD->getTypeSizeInBits(SrcTy) : @@ -2339,13 +2340,17 @@ static bool CannotBeNegativeZero(const Value *V) { if (const ConstantFP *CFP = dyn_cast<ConstantFP>(V)) return !CFP->getValueAPF().isNegZero(); - // (add x, 0.0) is guaranteed to return +0.0, not -0.0. if (const Instruction *I = dyn_cast<Instruction>(V)) { + // (add x, 0.0) is guaranteed to return +0.0, not -0.0. if (I->getOpcode() == Instruction::Add && isa<ConstantFP>(I->getOperand(1)) && cast<ConstantFP>(I->getOperand(1))->isNullValue()) return true; + // sitofp and uitofp turn into +0.0 for zero. + if (isa<SIToFPInst>(I) || isa<UIToFPInst>(I)) + return true; + if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) if (II->getIntrinsicID() == Intrinsic::sqrt) return CannotBeNegativeZero(II->getOperand(1)); |

