@@ -15338,11 +15338,16 @@ bool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) {
15338
15338
case Builtin::BI__builtin_fmaxl:
15339
15339
case Builtin::BI__builtin_fmaxf16:
15340
15340
case Builtin::BI__builtin_fmaxf128: {
15341
+ // TODO: Handle sNaN.
15341
15342
APFloat RHS(0.);
15342
15343
if (!EvaluateFloat(E->getArg(0), Result, Info) ||
15343
15344
!EvaluateFloat(E->getArg(1), RHS, Info))
15344
15345
return false;
15345
- Result = maxnum(Result, RHS);
15346
+ // When comparing zeroes, return +0.0 if one of the zeroes is positive.
15347
+ if (Result.isZero() && RHS.isZero() && Result.isNegative())
15348
+ Result = RHS;
15349
+ else if (Result.isNaN() || RHS > Result)
15350
+ Result = RHS;
15346
15351
return true;
15347
15352
}
15348
15353
@@ -15351,11 +15356,16 @@ bool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) {
15351
15356
case Builtin::BI__builtin_fminl:
15352
15357
case Builtin::BI__builtin_fminf16:
15353
15358
case Builtin::BI__builtin_fminf128: {
15359
+ // TODO: Handle sNaN.
15354
15360
APFloat RHS(0.);
15355
15361
if (!EvaluateFloat(E->getArg(0), Result, Info) ||
15356
15362
!EvaluateFloat(E->getArg(1), RHS, Info))
15357
15363
return false;
15358
- Result = minnum(Result, RHS);
15364
+ // When comparing zeroes, return -0.0 if one of the zeroes is negative.
15365
+ if (Result.isZero() && RHS.isZero() && RHS.isNegative())
15366
+ Result = RHS;
15367
+ else if (Result.isNaN() || RHS < Result)
15368
+ Result = RHS;
15359
15369
return true;
15360
15370
}
15361
15371
0 commit comments