diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
index 67a54018c37e..d92e126b080c 100644
--- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -694,11 +694,12 @@ Instruction *InstCombiner::visitAdd(BinaryOperator &I) {
       return ReplaceInstUsesWith(I, RHS);
 
     // X + 0 --> X
-    // NOTE: -0 + +0 = +0 in non-default rounding modes.  When we support them
-    // we must disable this.  Note that 0.0-0.0 = -0.0, so this doesn't hold
-    // for SUB.
-    if (RHSC->isNullValue())
+    if (!I.getType()->isFloatingPoint()) { // NOTE: -0 + +0 = +0.
+      if (RHSC->isNullValue())
+        return ReplaceInstUsesWith(I, LHS);
+    } else if (cast<ConstantFP>(RHSC)->isExactlyValue(-0.0)) {
       return ReplaceInstUsesWith(I, LHS);
+    }
 
     // X + (signbit) --> X ^ signbit
     if (ConstantInt *CI = dyn_cast<ConstantInt>(RHSC)) {