From 333771f3558c81390a0e5d715ad8d1e419050b66 Mon Sep 17 00:00:00 2001 From: Justin Stitt Date: Sun, 14 Aug 2022 13:28:49 -0700 Subject: [PATCH] [Sema] Avoid isNullPointerConstant invocation DiagnoseNullConversion is needlessly calling isNullPointerConstant which is an expensive routine due to its calls to a constant evaluator -- which we don't need. Building the Linux Kernel (x86_64) with this fix has improved build times by ~2.1%. This is mainly due to the following methods no longer needing to be called anywhere near as often: 1) ExprConstant::CheckICE (reduced CPU cycles by ~90%) 2) IntExprEvaluator::VisitBinaryOperator (reduced CPU cycles by ~50%) Reviewed By: rtrieu, nickdesaulniers Differential Revision: https://reviews.llvm.org/D131532 --- clang/lib/Sema/SemaChecking.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index a0ea35e..bb4ca8c 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -13355,9 +13355,10 @@ static void DiagnoseNullConversion(Sema &S, Expr *E, QualType T, return; // Check for NULL (GNUNull) or nullptr (CXX11_nullptr). - const Expr::NullPointerConstantKind NullKind = - E->isNullPointerConstant(S.Context, Expr::NPC_ValueDependentIsNotNull); - if (NullKind != Expr::NPCK_GNUNull && NullKind != Expr::NPCK_CXX11_nullptr) + const Expr *NewE = E->IgnoreParenImpCasts(); + bool IsGNUNullExpr = isa(NewE); + bool HasNullPtrType = NewE->getType()->isNullPtrType(); + if (!IsGNUNullExpr && !HasNullPtrType) return; // Return if target type is a safe conversion. @@ -13374,7 +13375,7 @@ static void DiagnoseNullConversion(Sema &S, Expr *E, QualType T, CC = S.SourceMgr.getTopMacroCallerLoc(CC); // __null is usually wrapped in a macro. Go up a macro if that is the case. - if (NullKind == Expr::NPCK_GNUNull && Loc.isMacroID()) { + if (IsGNUNullExpr && Loc.isMacroID()) { StringRef MacroName = Lexer::getImmediateMacroNameForDiagnostics( Loc, S.SourceMgr, S.getLangOpts()); if (MacroName == "NULL") @@ -13386,7 +13387,7 @@ static void DiagnoseNullConversion(Sema &S, Expr *E, QualType T, return; S.Diag(Loc, diag::warn_impcast_null_pointer_to_integer) - << (NullKind == Expr::NPCK_CXX11_nullptr) << T << SourceRange(CC) + << HasNullPtrType << T << SourceRange(CC) << FixItHint::CreateReplacement(Loc, S.getFixItZeroLiteralForType(T, Loc)); } -- 2.7.4