[llvm] r177279 - The optimization a + (-0.0f) -> a was being misapplied to a + (+0.0f) in the vector case (because

David Tweed david.tweed at arm.com
Mon Mar 18 08:52:20 PDT 2013



-----Original Message-----
From: llvm-commits-bounces at cs.uiuc.edu
[mailto:llvm-commits-bounces at cs.uiuc.edu] On Behalf Of Duncan Sands
Sent: 18 March 2013 15:18
To: llvm-commits at cs.uiuc.edu
Subject: Re: [llvm] r177279 - The optimization a + (-0.0f) -> a was being
misapplied to a + (+0.0f) in the vector case (because

Hi David,

On 18/03/13 12:54, David Tweed wrote:
> Author: davidtweed
> Date: Mon Mar 18 06:54:44 2013
> New Revision: 177279
>
> URL: http://llvm.org/viewvc/llvm-project?rev=177279&view=rev
> Log:
>   The optimization a + (-0.0f) -> a was being misapplied to a + (+0.0f) in
the vector case (because
> 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.
>
>
> Modified:
>      llvm/trunk/lib/IR/Constants.cpp
>
> Modified: llvm/trunk/lib/IR/Constants.cpp
> URL:
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Constants.cpp?rev=1772
79&r1=177278&r2=177279&view=diff
>
============================================================================
==
> --- llvm/trunk/lib/IR/Constants.cpp (original)
> +++ llvm/trunk/lib/IR/Constants.cpp Mon Mar 18 06:54:44 2013
> @@ -47,6 +47,19 @@ bool Constant::isNegativeZeroValue() con
>     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;

|Can't you just return "false" here if
|   this->getType()->isFPOrFPVectorTy()
|is true?

That's a good point: now we've checked for the only true case, any other FP
value is false. (And I
hadn't registered isFPOrFPVectorTy().) I'll apply a clean up patch, maybe
wait a bit in case any
other comments come in.

Cheers,
Dave

Ciao, Duncan.

> +
>     // Otherwise, just use +0.0.
>     return isNullValue();
>   }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>

_______________________________________________
llvm-commits mailing list
llvm-commits at cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits








More information about the llvm-commits mailing list