[PATCH] D55868: [Fixed Point Arithmetic] Fixed Point Addition Constant Expression Evaluation

Bevin Hansson via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 15 08:07:31 PST 2019


ebevhan added inline comments.


================
Comment at: clang/lib/AST/ExprConstant.cpp:7568
 
+static bool EvaluateFixedPoint(const Expr *E, APValue &Result, EvalInfo &Info) {
+  if (E->getType()->isFixedPointType()) {
----------------
This could provide an APFixedPoint rather than APValue.


================
Comment at: clang/lib/AST/ExprConstant.cpp:7582
+
+static bool EvaluateFixedPointOrInteger(const Expr *E, APValue &Result,
+                                        EvalInfo &Info) {
----------------
Technically, this will always produce an APFixedPoint so it doesn't really need to return APValue either.


================
Comment at: clang/lib/AST/ExprConstant.cpp:7584
+                                        EvalInfo &Info) {
+  auto FXSema = Info.Ctx.getFixedPointSemantics(E->getType());
+  if (E->getType()->isIntegerType()) {
----------------
The semantic is not used in the fixed-point path.


================
Comment at: clang/lib/AST/ExprConstant.cpp:9927
       }
       return Success(-Value, E);
     }
----------------
I think I've mentioned this before, but just as a reminder; this doesn't perform correctly for saturation.


================
Comment at: clang/lib/AST/ExprConstant.cpp:9979
+    APFixedPoint Result =
+        LHSFX.getFixedPoint().add(RHSFX.getFixedPoint()).convert(ResultFXSema);
+    return Success(Result, E);
----------------
Perhaps this should call HandleOverflow (or do something else) to signal that overflow occurred. HandleOverflow only seems to emit a note, though, but I think it should probably be a warning.

Maybe for casts as well? Might get double warnings then, though.


================
Comment at: clang/lib/Basic/FixedPoint.cpp:25
   bool Upscaling = DstScale > getScale();
+  bool Overflowed = false;
 
----------------
I think it's a bit cleaner if you avoid this variable and simply assign `Overflow` directly here, with the 'else' cases below replaced with `else if (Overflow)`.

That style isn't cleaner in `add` if you use the APInt add_ov functions though, so maybe it's better to keep it this way for consistency.


================
Comment at: clang/lib/Basic/FixedPoint.cpp:170
+    Result = ThisVal + OtherVal;
+    Overflowed = ThisVal.isSigned() ? Result.slt(ThisVal) : Result.ult(ThisVal);
+  }
----------------
You could use the add_ov functions here.


Repository:
  rC Clang

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

https://reviews.llvm.org/D55868





More information about the cfe-commits mailing list