[clang] 50ff49e - Clang: ExprConstant use maxnum/minnum for fmax/fmin (#129630)

via cfe-commits cfe-commits at lists.llvm.org
Mon Mar 3 20:26:47 PST 2025


Author: YunQiang Su
Date: 2025-03-04T12:26:44+08:00
New Revision: 50ff49ebbcdc88301070e94b04cb158d040db276

URL: https://github.com/llvm/llvm-project/commit/50ff49ebbcdc88301070e94b04cb158d040db276
DIFF: https://github.com/llvm/llvm-project/commit/50ff49ebbcdc88301070e94b04cb158d040db276.diff

LOG: Clang: ExprConstant use maxnum/minnum for fmax/fmin (#129630)

In APFloat, we have defined maxnum and minnum, so let's use them
directly here.

In `maxnum`/`minnum` of APFloat, we process sNaN, signed-zero as
strictly as possible.

Added: 
    

Modified: 
    clang/lib/AST/ExprConstant.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index ef1d763009453..7244120d1be51 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -15604,16 +15604,11 @@ bool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) {
   case Builtin::BI__builtin_fmaxl:
   case Builtin::BI__builtin_fmaxf16:
   case Builtin::BI__builtin_fmaxf128: {
-    // TODO: Handle sNaN.
     APFloat RHS(0.);
     if (!EvaluateFloat(E->getArg(0), Result, Info) ||
         !EvaluateFloat(E->getArg(1), RHS, Info))
       return false;
-    // When comparing zeroes, return +0.0 if one of the zeroes is positive.
-    if (Result.isZero() && RHS.isZero() && Result.isNegative())
-      Result = RHS;
-    else if (Result.isNaN() || RHS > Result)
-      Result = RHS;
+    Result = maxnum(Result, RHS);
     return true;
   }
 
@@ -15622,16 +15617,11 @@ bool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) {
   case Builtin::BI__builtin_fminl:
   case Builtin::BI__builtin_fminf16:
   case Builtin::BI__builtin_fminf128: {
-    // TODO: Handle sNaN.
     APFloat RHS(0.);
     if (!EvaluateFloat(E->getArg(0), Result, Info) ||
         !EvaluateFloat(E->getArg(1), RHS, Info))
       return false;
-    // When comparing zeroes, return -0.0 if one of the zeroes is negative.
-    if (Result.isZero() && RHS.isZero() && RHS.isNegative())
-      Result = RHS;
-    else if (Result.isNaN() || RHS < Result)
-      Result = RHS;
+    Result = minnum(Result, RHS);
     return true;
   }
 


        


More information about the cfe-commits mailing list