rsmith added inline comments.

================
Comment at: clang/lib/AST/ExprConstant.cpp:2446
+      fpOptions.isFPConstrained()) {
+    Info.CCEDiag(E, diag::note_constexpr_float_arithmetic_strict);
+    return false;
----------------
FFDiag


================
Comment at: clang/lib/AST/ExprConstant.cpp:2677
+  if (E->getFPFeaturesInEffect(Info.Ctx.getLangOpts()).isFPConstrained() &&
+      llvm::APFloatBase::opOK != status) {
+    Info.FFDiag(E, diag::note_constexpr_float_arithmetic_strict);
----------------
Nit: do these checks in the opposite order; we don't need to compute 
`FPOptions` if the calculation was exact. (I assume we don't get an OK status 
if the result was rounded?)


================
Comment at: clang/lib/AST/ExprConstant.cpp:2827
 
-      if (!handleFloatFloatBinOp(Info, E, LHSFloat, Opcode,
-                                 RHSElt.getFloat())) {
+      if (!handleFloatFloatBinOp(Info, dyn_cast<BinaryOperator>(E), LHSFloat,
+                                 Opcode, RHSElt.getFloat())) {
----------------
Change this function to take a `BinaryOperator` too rather than using a cast 
here.


================
Comment at: clang/lib/AST/ExprConstant.cpp:4158
     } else if (RHS.isFloat()) {
+      const BinaryOperator *BE = dyn_cast<BinaryOperator>(E);
+      const FPOptions fpOptions = BE->getFPFeaturesInEffect(
----------------
Change the `E` member to be a `BinaryOperator*` rather than using a cast here.


================
Comment at: clang/lib/AST/ExprConstant.cpp:12242
+    // but this doesn't affect constant folding since NaN are
+    // not constant expressions.
+
----------------
We can form NaNs in constant evaluation using `__builtin_nan()`, and that's 
exposed to the user via `std::numeric_limits`, so I think we do need to check 
for this.


================
Comment at: clang/lib/AST/ExprConstant.cpp:13290
   case Builtin::BI__builtin_fabsf128:
+    // The c lang ref says that "fabs raises no floating-point exceptions,
+    // even if x is a signaling NaN. The returned value is independent of
----------------



================
Comment at: clang/lib/AST/ExprConstant.cpp:13347
 bool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
+  // In C lang ref, the unary - raises no floating point exceptions,
+  // even if the operand is signalling.
----------------



================
Comment at: clang/lib/AST/ExprConstant.cpp:13383
+  return ST && DT && DT->isRealFloatingType() && ST->isRealFloatingType() &&
+         ST->getKind() <= DT->getKind();
+}
----------------
I don't think this works in general. There is no "wideness" order between PPC 
double-double and IEEE float128.


================
Comment at: clang/lib/AST/ExprConstant.cpp:13406
+    if (E->getFPFeaturesInEffect(Info.Ctx.getLangOpts()).isFPConstrained() &&
+        !isWideningFPConversion(E->getType(), SubExpr->getType())) {
+      // In C lang ref, footnote, cast may raise inexact exception.
----------------
Can we check whether the value is representable, not only the type? Eg, it 
would seem preferable to accept `float x = 1.0;`


================
Comment at: clang/lib/AST/ExprConstant.cpp:13407
+        !isWideningFPConversion(E->getType(), SubExpr->getType())) {
+      // In C lang ref, footnote, cast may raise inexact exception.
+      // Cast may also raise invalid.
----------------
It would be useful to say which C standard and which footnote, eg "C11 footnote 
123"


================
Comment at: clang/lib/AST/ExprConstant.cpp:13197-13198
   assert(E->isRValue() && E->getType()->isRealFloatingType());
+  if (Info.isStrictFP)
+    return false;
   return FloatExprEvaluator(Info, Result).Visit(E);
----------------
mibintc wrote:
> rsmith wrote:
> > I think we should be able to evaluate (for example) `constexpr float f = 
> > 1.0f;` even in a strict FP context. I think only floating point operations 
> > that depend on the rounding mode should be disabled, not all floating-point 
> > evaluation. Perhaps we should propagate the `FPOptions` into 
> > `handleFloatFloatBinOp` and perform the check there, along with any other 
> > places that care (I think we probably have some builtins that we can 
> > constant-evaluate that care about rounding modes.)
> > 
> > You also need to produce a diagnostic when you treat an expression as 
> > non-constant -- please read the comment at the top of the file for details.
> > I think we should be able to evaluate (for example) `constexpr float f = 
> > 1.0f;` even in a strict FP context. I think only floating point operations 
> > that depend on the rounding mode should be disabled, not all floating-point 
> > evaluation. Perhaps we should propagate the `FPOptions` into 
> > `handleFloatFloatBinOp` and perform the check there, along with any other 
> > places that care (I think we probably have some builtins that we can 
> > constant-evaluate that care about rounding modes.)
> > 
> > You also need to produce a diagnostic when you treat an expression as 
> > non-constant -- please read the comment at the top of the file for details.
> 
> It's not just rounding mode, right? If fp exceptions are unmasked then we 
> should inhibit the folding in particular cases?
Yes, we should check for anything that could behave differently in a different 
FP environment.


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

https://reviews.llvm.org/D87528

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

Reply via email to