[PATCH] D88238: [APFloat] convert SNaN to QNaN in convert() and raise Invalid signal

Serge Pavlov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 29 08:23:18 PDT 2020


sepavloff added a comment.

In D88238#2300890 <https://reviews.llvm.org/D88238#2300890>, @spatel wrote:

> In D88238#2300802 <https://reviews.llvm.org/D88238#2300802>, @sepavloff wrote:
>
>> I would propose to put a check into `checkFloatingPointResult` like:
>>
>>   if (St & APFloat::opStatus::opInvalidOp) {
>>     if (E is __builtin_nan() and probably other similar builtins)
>>       return true;
>>   ...
>>
>> It would allow initialization with NaN but catches other operations with it.
>
> That seems like a fragile fix - future changes to APFloat behavior might trigger the same error. Is there some reason we are not predicating the error based on the FP exception mode?
>
>   diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
>   index 3bc649b9699..323de80a17d 100644
>   --- a/clang/lib/AST/ExprConstant.cpp
>   +++ b/clang/lib/AST/ExprConstant.cpp
>   @@ -2439,7 +2439,8 @@ static bool checkFloatingPointResult(EvalInfo &Info, const Expr *E,
>        return false;
>      }
>    
>   -  if (St & APFloat::opStatus::opInvalidOp) {
>   +  if (St & APFloat::opStatus::opInvalidOp &&
>   +      FPO.getFPExceptionMode() != LangOptions::FPE_Ignore) {
>        // There is no usefully definable result.
>        Info.FFDiag(E);
>        return false;

I have no objection to such solution, if it enables this patch.

Catching `Invalid` exception in all situations but initialization looks more natural, but this is a topic for other patches.


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

https://reviews.llvm.org/D88238



More information about the llvm-commits mailing list