================
@@ -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

Reply via email to