summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-05-19 20:27:56 +0000
committerChris Lattner <sabre@nondot.org>2008-05-19 20:27:56 +0000
commitba9acbe6dcf2a599093a1e414bb9d66675e0ecfd (patch)
tree23e839383086478a9dee2e73c9a7fad337c392c0 /llvm/lib/Transforms
parente35fe0f1c67623ba408413c65b2b8fdae99a7822 (diff)
downloadbcm5719-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')
-rw-r--r--llvm/lib/Transforms/Scalar/InstructionCombining.cpp11
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));
OpenPOWER on IntegriCloud