The optimization a + (-0.0f) -> a was being misapplied to a + (+0.0f) in the vector...
authorDavid Tweed <david.tweed@arm.com>
Mon, 18 Mar 2013 11:54:44 +0000 (11:54 +0000)
committerDavid Tweed <david.tweed@arm.com>
Mon, 18 Mar 2013 11:54:44 +0000 (11:54 +0000)
we weren't differntiating floating-point zeroinitializers from other zero-initializers)
which was causing problems for code relying upon a + (+0.0f) to, eg, flush denormals to
0. Make the scalar and vector cases have the same behaviour.

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

lib/IR/Constants.cpp

index 0c7effb5cac71a5092f5429d060d46c5db96f8dc..70f7e0176e85de464c6c71da6697e1cae0836355 100644 (file)
@@ -47,6 +47,19 @@ bool Constant::isNegativeZeroValue() const {
   if (const ConstantFP *CFP = dyn_cast<ConstantFP>(this))
     return CFP->isZero() && CFP->isNegative();
 
+  // Equivalent for a vector of -0.0's.
+  if (const ConstantDataVector *CV = dyn_cast<ConstantDataVector>(this))
+    if (ConstantFP *SplatCFP = dyn_cast_or_null<ConstantFP>(CV->getSplatValue()))
+      if (SplatCFP && SplatCFP->isZero() && SplatCFP->isNegative())
+        return true;
+
+  // However, vectors of zeroes which are floating point represent +0.0's.
+  if (const ConstantAggregateZero *CAZ = dyn_cast<ConstantAggregateZero>(this))
+    if (const VectorType *VT = dyn_cast<VectorType>(CAZ->getType()))
+      if (VT->getElementType()->isFloatingPointTy())
+        // As it's a CAZ, we know it's the zero bit-pattern (ie, +0.0) in each element.
+        return false;
+
   // Otherwise, just use +0.0.
   return isNullValue();
 }