https://github.com/dzbarsky created 
https://github.com/llvm/llvm-project/pull/202657

RecursiveASTVisitor is a CRTP template instantiated by hundreds of Clang tools 
and checks. The optimizer currently duplicates large traversal functions in 
each instantiation.

Apply Clang minsize to every RecursiveASTVisitor member function. minsize 
enables size-oriented inlining and outlining for the generated traversal 
functions without changing RecursiveASTVisitor dispatch or traversal order.

In the stripped all-tools multicall binary, this reduces size from 152,475,496 
bytes to 150,635,672 bytes, saving 1,839,824 bytes (1.207%).

Correctness validation:

- bazel build @llvm-project//llvm --config=prebuilt --config=remote

- clang-tidy --checks=* produced byte-identical 13,886-line output before and 
after the change on a 1,500-line generated C file.

Performance validation:

- The LLVM repository has no RecursiveASTVisitor benchmark target.

- hyperfine --warmup 3 --runs 15 measured clang-tidy --checks=* on the same 
file.

- Baseline user time: 435.5 ms; patched user time: 428.9 ms. The result shows 
no performance regression.

Work towards #202616

>From 974d022278c3916099166a77c1cb5242f91b733d Mon Sep 17 00:00:00 2001
From: David Zbarsky <[email protected]>
Date: Mon, 8 Jun 2026 13:03:10 -0400
Subject: [PATCH] [clang] Optimize RecursiveASTVisitor instantiations for size

RecursiveASTVisitor is a CRTP template instantiated by hundreds of Clang tools 
and checks. The optimizer currently duplicates large traversal functions in 
each instantiation.

Apply Clang minsize to every RecursiveASTVisitor member function. minsize 
enables size-oriented inlining and outlining for the generated traversal 
functions without changing RecursiveASTVisitor dispatch or traversal order.

In the stripped all-tools multicall binary, this reduces size from 152,475,496 
bytes to 150,635,672 bytes, saving 1,839,824 bytes (1.207%).

Correctness validation:

- bazel build @llvm-project//llvm --config=prebuilt --config=remote

- clang-tidy --checks=* produced byte-identical 13,886-line output before and 
after the change on a 1,500-line generated C file.

Performance validation:

- The LLVM repository has no RecursiveASTVisitor benchmark target.

- hyperfine --warmup 3 --runs 15 measured clang-tidy --checks=* on the same 
file.

- Baseline user time: 435.5 ms; patched user time: 428.9 ms. The result shows 
no performance regression.
---
 clang/include/clang/AST/RecursiveASTVisitor.h | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h 
b/clang/include/clang/AST/RecursiveASTVisitor.h
index 3b9bafffe1bc1..88e56464c79a9 100644
--- a/clang/include/clang/AST/RecursiveASTVisitor.h
+++ b/clang/include/clang/AST/RecursiveASTVisitor.h
@@ -153,6 +153,10 @@ isSameMethod([[maybe_unused]] FirstMethodPtrTy 
FirstMethodPtr,
 /// By default, this visitor preorder traverses the AST. If postorder traversal
 /// is needed, the \c shouldTraversePostOrder method needs to be overridden
 /// to return \c true.
+#ifdef __clang__
+#pragma clang attribute push(__attribute__((minsize)), apply_to = function)
+#endif
+
 template <typename Derived> class RecursiveASTVisitor {
 public:
   /// A queue used for performing data recursion over statements.
@@ -4350,6 +4354,10 @@ DEF_TRAVERSE_STMT(HLSLOutArgExpr, {})
 #undef TRAVERSE_STMT
 #undef TRAVERSE_STMT_BASE
 
+#ifdef __clang__
+#pragma clang attribute pop
+#endif
+
 #undef TRY_TO
 
 } // end namespace clang

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to