xiongji90 added a comment.

In D144454#4162129 <https://reviews.llvm.org/D144454#4162129>, @rjmccall wrote:

> In D144454#4157717 <https://reviews.llvm.org/D144454#4157717>, @xiongji90 
> wrote:
>
>> In D144454#4142253 <https://reviews.llvm.org/D144454#4142253>, @rjmccall 
>> wrote:
>>
>>> New builtins should be documented in the user manual.
>>>
>>> There are standard pragmas for changing the rounding mode, right?  What's 
>>> the interaction between the ability to set this dynamically with a builtin 
>>> call and those pragmas?
>>
>> Hi, @rjmccall 
>> Current status is LLVM has added llvm.get.rounding and llvm.set.rounding 
>> intrinsic and has also added "__builtin_flt_rounds" for llvm.get.rounding 
>> but there is no corresponding for llvm.set.rounding intrinisc. According to 
>> original patch to add llvm.set.rounding: https://reviews.llvm.org/D74729 and 
>> LLVM document for this intrinsic: https://llvm.org/docs/LangRef.html#id1506
>> The introduction of llvm.set.rounding intrinsic can provide same 
>> functionality as C library function "fesetround" and avoid unnecessary 
>> dependency on C library. Currently, this intrinsic can't benefit C/C++ 
>> developers since we don't have a corresponding builtin and we even can't add 
>> a C/C++ test for this intrinsic.
>
> If this builtin is defined to have the same behavior as `fesetround`, the 
> obvious name would be `__builtin_fesetround`.  You seem to have patterned it 
> off of `__builtin_flt_rounds`, but that is not an arbitrarily-chosen name, 
> it's taken from the standard `FLT_ROUNDS` macro and is expected to work as an 
> implementation of it.
>
> We already understand how `fesetround` is supposed to interact with the 
> standard pragmas about the FP environment, so that indirectly answers that 
> part of my question.  I assume you've modeled your intrinsic correctly in 
> LLVM so that the optimizer understands it can't reorder the 
> environment-sensitive math intrinsics around calls to the new intrinsic?
>
> If this builtin is just an intrinsic implementation of `fesetround`, I don't 
> think we need further documentation of it.
>
> I assume the intrinsic is only implemented on certain targets?  If so, we 
> might need to restrict uses of the builtin as well (and make sure that 
> `__has_builtin` only returns true on those targets).

Hi, @rjmccall 
"llvm.set.rounding" intrinsic will change default floating-point environment, 
so as same as explicit C library call to "fesetround", this intrinsic should 
work with "pragma std fenv_access on", then "strictfp" attr will be added and 
optimizer will honor it.
"llvm.set.rounding" shouldn't be a target-sepcific intrinsic and target backend 
should be responsible for supporting it. I didn't my local tests on x86/x86_64 
hardware and I also searched tests related to "llvm.set.rounding", arm, 
aarch64, risc-v all include such tests, so this builtin should work for these 
targets too.
Thanks very much.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D144454/new/

https://reviews.llvm.org/D144454

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to