jcranmer-intel added a comment.

In D136568#3878104 <https://reviews.llvm.org/D136568#3878104>, @Izaron wrote:

> The online documentation 
> (https://en.cppreference.com/w/cpp/numeric/math/ilogb) says:
>
>   1. If the correct result is greater than INT_MAX or smaller than INT_MIN, 
> FE_INVALID is raised.
>   2. If arg is ±0, ±∞, or NaN, FE_INVALID is raised.
>   3. In all other cases, the result is exact (FE_INEXACT is never raised) and 
> the current rounding mode is ignored
>
> The first point seemingly never occur, because llvm's `ilogb` return type is 
> `int`.
> The second point is handled as expected (`APFloatTest.cpp` checks it)

FWIW, I would be slightly wary of relying on cppreference as definitive for 
niche semantic issues like this, although it is correct in this case. C2x is 
actually pretty well-organized in Annex F, and enumerates most of the corner 
cases specifically in every function.



================
Comment at: clang/lib/AST/ExprConstant.cpp:12452
+    int Ilogb;
+    if (APFloat::opStatus St = ilogb(F, Ilogb); !isConstantOpStatus(St))
+      return false;
----------------
`long double` is `ppc_fp128` on at least some PPC targets, and while I'm not 
entirely certain of what `ilogb` properly returns in the corner cases of the 
`ppc_fp128`, I'm not entirely confident that the implementation of `APFloat` is 
correct in those cases. I'd like someone with PPC background to comment in here.


================
Comment at: clang/test/Sema/constant-builtins-ilogb.cpp:13
+    static_assert(!__builtin_constant_p(FUNC(T(Inf))));    \
+    static_assert(!__builtin_constant_p(FUNC(T(NegInf))));
+
----------------
Test of smallest subnormal and largest finite number would also be useful.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D136568

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

Reply via email to