forked from OSchip/llvm-project
[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
This commit is contained in:
parent
0299ebc1bd
commit
333771f355
|
@ -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<GNUNullExpr>(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));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue