[clang] ec78295 - [clang] Short-circuit evaluation in ::EvaluateAsConstantExpr

Timm Bäder via cfe-commits cfe-commits at lists.llvm.org
Thu Nov 17 03:02:13 PST 2022


Author: Timm Bäder
Date: 2022-11-17T12:01:37+01:00
New Revision: ec782951d7bd34f9c32d08bb6ec6b43d2a805832

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

LOG: [clang] Short-circuit evaluation in ::EvaluateAsConstantExpr

Use FastEvaluateAsRValue() in EvaluateAsConstantExpr() as well, to
short-circuit evaluation of simple integrals.

Differential Revision: https://reviews.llvm.org/D138115

Added: 
    

Modified: 
    clang/lib/AST/ExprConstant.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index ecf072e070835..b5281a660bcf3 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -15051,6 +15051,12 @@ static bool FastEvaluateAsRValue(const Expr *Exp, Expr::EvalResult &Result,
     return true;
   }
 
+  if (const auto *L = dyn_cast<CXXBoolLiteralExpr>(Exp)) {
+    Result.Val = APValue(APSInt(APInt(1, L->getValue())));
+    IsConst = true;
+    return true;
+  }
+
   // This case should be rare, but we need to check it before we check on
   // the type below.
   if (Exp->getType().isNull()) {
@@ -15235,6 +15241,9 @@ bool Expr::EvaluateAsConstantExpr(EvalResult &Result, const ASTContext &Ctx,
                                   ConstantExprKind Kind) const {
   assert(!isValueDependent() &&
          "Expression evaluator can't be called on a dependent expression.");
+  bool IsConst;
+  if (FastEvaluateAsRValue(this, Result, Ctx, IsConst))
+    return true;
 
   ExprTimeTraceScope TimeScope(this, Ctx, "EvaluateAsConstantExpr");
   EvalInfo::EvaluationMode EM = EvalInfo::EM_ConstantExpression;


        


More information about the cfe-commits mailing list