[llvm-branch-commits] [clang] [Serialization] Code cleanups and polish 83233 (PR #83237)

Alexander Kornienko via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Oct 22 07:15:35 PDT 2024


alexfh wrote:

@usx95 may be able to help with the reproducer.

In the meantime, I'm trying to collect some information on the compile times. So far it looks like we have a ~10-15x compile time regression on some translation units. Without this patch `-ftime-report` shows:
```
===-------------------------------------------------------------------------===
                          Clang front-end time report
===-------------------------------------------------------------------------===
  Total Execution Time: 39.1940 seconds (39.7238 wall clock)

   ---User Time---   --System Time--   --User+System--   ---Wall Time---  --- Name ---
  28.2611 ( 77.5%)   1.8439 ( 67.3%)  30.1050 ( 76.8%)  30.5230 ( 76.8%)  Clang front-end timer
   8.1911 ( 22.5%)   0.8980 ( 32.7%)   9.0891 ( 23.2%)   9.2009 ( 23.2%)  Reading modules
  36.4522 (100.0%)   2.7419 (100.0%)  39.1940 (100.0%)  39.7238 (100.0%)  Total
```

With it:
```
===-------------------------------------------------------------------------===
Clang front-end time report
===-------------------------------------------------------------------------===
Total Execution Time: 466.7373 seconds (1251.6300 wall clock)
---User Time---   --System Time--   --User+System--   ---Wall Time---  --- Name ---
 404.7200 ( 96.1%)  40.6383 ( 88.8%)  445.3583 ( 95.4%)  471.9647 ( 37.7%)  Clang front-end timer
 15.2098 (  3.6%)   3.3586 (  7.3%)  18.5684 (  4.0%)  398.1242 ( 31.8%)  Reading modules
 420.9899 (100.0%)  45.7474 (100.0%)  466.7373 (100.0%)  1251.6300 (100.0%)  Total
```

`perf record -g` / `perf report` give the following picture:
```
  Children      Self  Command  Shared Object       Symbol
+   94.85%     0.00%  clang    clang               [.] clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformCallExpr(clang::CallExpr*) [clone .__uniq.16014532493918845222783194145290083557] ◆
+   93.47%     0.00%  clang    clang               [.] clang::Sema::InstantiateFunctionDefinition(clang::SourceLocation, clang::FunctionDecl*, bool, bool, bool)                                                     ▒
+   93.37%    83.51%  clang    clang               [.] clang::ASTReader::LoadExternalSpecializations(clang::Decl const*, bool)                                                                                       ▒
+   93.19%     0.00%  clang    clang               [.] clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformCompoundStmt(clang::CompoundStmt*, bool) [clone .__uniq.16014532493918845222783194▒
+   93.08%     0.00%  clang    clang               [.] clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformUnresolvedLookupExpr(clang::UnresolvedLookupExpr*, bool) [clone .__uniq.1601453249▒
+   92.98%     0.00%  clang    clang               [.] clang::Sema::BuildTemplateIdExpr(clang::CXXScopeSpec const&, clang::SourceLocation, clang::LookupResult&, bool, clang::TemplateArgumentListInfo const*)       ▒
+   92.44%     0.00%  clang    clang               [.] clang::Sema::CheckVarTemplateId(clang::VarTemplateDecl*, clang::SourceLocation, clang::SourceLocation, clang::TemplateArgumentListInfo const&)                ▒
+   92.08%     0.00%  clang    clang               [.] clang::Sema::InstantiateVariableInitializer(clang::VarDecl*, clang::VarDecl*, clang::MultiLevelTemplateArgumentList const&)                                   ▒
+   91.87%     0.00%  clang    clang               [.] clang::VarTemplateDecl::getPartialSpecializations(llvm::SmallVectorImpl<clang::VarTemplatePartialSpecializationDecl*>&) const                                 ▒
+   91.18%     0.00%  clang    clang               [.] clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformBinaryOperator(clang::BinaryOperator*) [clone .__uniq.1601453249391884522278319414▒
+   91.07%     0.00%  clang    clang               [.] clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformExprs(clang::Expr* const*, unsigned int, bool, llvm::SmallVectorImpl<clang::Expr*>▒
+   90.70%     0.01%  clang    clang               [.] clang::Sema::InstantiateVariableDefinition(clang::SourceLocation, clang::VarDecl*, bool, bool, bool)                                                          ▒
+   90.41%     0.01%  clang    clang               [.] clang::Sema::BuildDeclarationNameExpr(clang::CXXScopeSpec const&, clang::DeclarationNameInfo const&, clang::NamedDecl*, clang::NamedDecl*, clang::TemplateArgu▒
+   90.29%     0.00%  clang    clang               [.] clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformInitListExpr(clang::InitListExpr*) [clone .__uniq.16014532493918845222783194145290▒
+   89.92%     0.00%  clang    clang               [.] clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformParenExpr(clang::ParenExpr*) [clone .__uniq.16014532493918845222783194145290083557▒
+   89.23%     0.00%  clang    clang               [.] clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformConditionalOperator(clang::ConditionalOperator*) [clone .__uniq.160145324939188452▒
+   84.49%     0.02%  clang    clang               [.] clang::Sema::RequireCompleteTypeImpl(clang::SourceLocation, clang::QualType, clang::Sema::CompleteTypeKind, clang::Sema::TypeDiagnoser*)                      ▒
+   84.47%     0.00%  clang    clang               [.] clang::Sema::InstantiateClassTemplateSpecialization(clang::SourceLocation, clang::ClassTemplateSpecializationDecl*, clang::TemplateSpecializationKind, bool)  ▒
+   84.07%     0.01%  clang    clang               [.] clang::Sema::InstantiateClass(clang::SourceLocation, clang::CXXRecordDecl*, clang::CXXRecordDecl*, clang::MultiLevelTemplateArgumentList const&, clang::Templa▒
+   82.84%     0.02%  clang    clang               [.] clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&, clang::TypeLoc) [clone .__uniq.1601453249391884522278▒
+   82.23%     0.02%  clang    clang               [.] clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformTemplateSpecializationType(clang::TypeLocBuilder&, clang::TemplateSpecializationTy▒
+   81.99%     0.01%  clang    clang               [.] (anonymous namespace)::TemplateInstantiator::TransformTemplateArgument(clang::TemplateArgumentLoc const&, clang::TemplateArgumentLoc&, bool) [clone .__uniq.16▒
+   81.54%     0.00%  clang    clang               [.] clang::Sema::RequireCompleteDeclContext(clang::CXXScopeSpec&, clang::DeclContext*)                                                                            ▒
+   80.18%     0.01%  clang    clang               [.] clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformType(clang::TypeSourceInfo*) [clone .__uniq.16014532493918845222783194145290083557▒
+   79.88%     0.12%  clang    clang               [.] clang::Sema::CheckTemplateIdType(clang::TemplateName, clang::SourceLocation, clang::TemplateArgumentListInfo&)                                                ▒
```

I can try to build clang with better debug information and get a higher fidelity profile, but hopefully this already shows the direction to look at.

https://github.com/llvm/llvm-project/pull/83237


More information about the llvm-branch-commits mailing list