[PATCH] D27932: InstSimplify: Eliminate fabs on known positive

Eli Friedman via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 4 11:18:54 PST 2017


efriedma added inline comments.


================
Comment at: lib/Analysis/ValueTracking.cpp:2614
     if (I->getOperand(0) == I->getOperand(1))
       return true;
     LLVM_FALLTHROUGH;
----------------
scanon wrote:
> arsenm wrote:
> > efriedma wrote:
> > > IIRC, A*A->A if A is a NaN, so fabs(x*x) isn't equivalent to x*x.
> > I think the sign of a NaN is OK to ignore
> It's OK [in the IEEE 754 sense] to ignore the sign of NaN with all operations *except* abs, copysign, copy, and negate.  So `fabs(x)` is not equivalent to `x` if `x` is NaN, but `fabs(x*x) -> x*x` is OK if `x` might be NaN, because the sign of `x*x` has no meaning if `x` is NaN.
Okay, since there seems to be some confusion here, I went and took a look at the standard.  It says "For all other operations, this standard does not specify the sign bit of a NaN result."  So x*x has an unspecified sign, and fabs(x*x) has a sign bit which is always clear.

>From this we can conclude that something like `fabs(x*x) + 1 -> x*x + 1` is a legal transformation, but the general transform proposed here is not legal.  For example, `copysign(1, fabs(x*x)) == 1`, but `copysign(1, x*x)` could be either 1 or -1 depending on the target.


https://reviews.llvm.org/D27932





More information about the llvm-commits mailing list