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 | |
| 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
| -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));  | 

