================
@@ -20510,6 +20515,32 @@ bool FloatExprEvaluator::VisitCallExpr(const CallExpr
*E) {
return true;
}
+ case Builtin::BI__builtin_exp:
+ case Builtin::BI__builtin_expf: {
+ APFloat Input(0.);
+ if (!EvaluateFloat(E->getArg(0), Input, Info))
+ return false;
+ llvm::RoundingMode RM = llvm::RoundingMode::NearestTiesToEven;
+ if (Info.InConstantContext)
+ RM = getActiveRoundingMode(Info, E);
+ APFloat::opStatus Status = APFloat::opStatus::opOK;
+ std::optional<APFloat> r = exp(Input, RM, &Status);
+ // Check for unsupported rounding modes.
+ if (!r.has_value())
+ return false;
+ // Check for raised non-FE_INEXACT exceptions.
+ if (Status & (~APFloat::opStatus::opInexact))
+ return false;
----------------
hubert-reinterpretcast wrote:
We should not pre-empt possible folding of a run-time evaluation here.
https://github.com/llvm/llvm-project/pull/199808
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits