tbaeder created this revision. tbaeder added reviewers: aaron.ballman, erichkeane. Herald added a project: All. tbaeder requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
This adds another case to `FastEvaluateAsRValue()` for boolean expressions as well as calls `FastEvaluateAsRValue()` in `Expr::EvaluateAsConstantExpr()` as well. This way we can short-circuit evaluating simple integer and boolean literals here. I don't have before/after numbers for compilation times, since my local builds have asan enabled (so valgrind doesn't work) and I lost access to the my asan-less build. But it shouldn't be worse than before... right? Sorry, can't find better reviewers to add. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D138115 Files: clang/lib/AST/ExprConstant.cpp Index: clang/lib/AST/ExprConstant.cpp =================================================================== --- clang/lib/AST/ExprConstant.cpp +++ clang/lib/AST/ExprConstant.cpp @@ -15056,6 +15056,12 @@ 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()) { @@ -15240,6 +15246,9 @@ 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;
Index: clang/lib/AST/ExprConstant.cpp =================================================================== --- clang/lib/AST/ExprConstant.cpp +++ clang/lib/AST/ExprConstant.cpp @@ -15056,6 +15056,12 @@ 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()) { @@ -15240,6 +15246,9 @@ 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;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits