minor cleanups, teach instcombine that sitofp/uitofp cannot
authorChris Lattner <sabre@nondot.org>
Mon, 19 May 2008 20:27:56 +0000 (20:27 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 19 May 2008 20:27:56 +0000 (20:27 +0000)
produce a negative zero.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51272 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp

index 46dba398cfeabb15f2b1c0d8ba6dfef2167323d2..10d3344598da04baa9b17d2f02a7c33b7e97b7ba 100644 (file)
@@ -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));