[LLVMdev] [RFC] Extend LLVM IR to express "fast-math" at a per-instruction level

Joshua Cranmer pidgeot18 at gmail.com
Tue Oct 30 21:11:13 PDT 2012


On 10/30/2012 10:28 PM, Michael Ilseman wrote:
>
> On Oct 30, 2012, at 4:19 PM, Dan Gohman <dan433584 at gmail.com 
> <mailto:dan433584 at gmail.com>> wrote:
>
>> On Tue, Oct 30, 2012 at 2:25 PM, Michael Ilseman <milseman at apple.com 
>> <mailto:milseman at apple.com>> wrote:
>>
>>
>>     no signed zeros (S)
>>       - The optimizer is allowed to not distinguish between -0 and +0
>>     for the
>>         purposes of optimizations.
>>
>>
>> Ok, I checked LLVM CodeGen's existing -enable-no-infs-fp-math 
>> and -enable-no-nans-fp-math flags, and GCC's -ffinite-math-only flag, 
>> and they all say they apply to results as well as arguments. Do you 
>> have a good reason for varying from existing practice here?
>>
>
> The primary example I was trying to simplify with that change was x * 
> 0 ==> 0. It can be performed if you assume NIS inputs, or NS inputs 
> and N outputs. This is because Inf * 0 is NaN. In hindsight, this is 
> all making things more confusing, so I think I'll go back to 
> "arguments and results" and allow this optimization for NS. GCC gets 
> around this by lumping Inf and NaN under the same command line option.
>
>> Phrasing these from the perspective of the optimizer is a little 
>> confusing here.
>
> I think it might be clearer to change "The optimizer is allowed to …" 
> to "Allow optimizations to …" and clean up the wording a bit.
>
>> Also, "The optimizer is allowed to [not care about X]" read literally 
>> means that the semantics for X are unconstrained, which would be 
>> Undefined Behavior. For I and N here you have a second sentence which 
>> says only the result is undefined, but for S you don't.
>
> 'S' shouldn't have any undefined behavior, it just allows 
> optimizations to not distinguish between +/-0. It's perfectly legal 
> for the operation to receive a negative zero, the operation just might 
> treat it exactly the same as a positive zero. I would rather have that 
> than undefined behavior.

I'm not an expert in writing specifications, but I think defining the S 
flag in this manner would be preferable:
no signed zeros (S) - If present, then the result of a floating point 
operation with -0.0 or +0.0 as an operand is either the result of the 
operation with the original specified values or the result of the 
operation with the +0.0 or -0.0 replaced with its opposite sign.

As a side note, it's never explicitly stated in the language reference 
how much of IEEE 754 semantics floating point operations must follow.

-- 
Joshua Cranmer
News submodule owner
DXR coauthor

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121030/e8b4a8b9/attachment.html>


More information about the llvm-dev mailing list