https://github.com/dzbarsky updated https://github.com/llvm/llvm-project/pull/203125
>From 21132d1b0dcb8b8742726183b534037e35116dff Mon Sep 17 00:00:00 2001 From: David Zbarsky <[email protected]> Date: Wed, 10 Jun 2026 19:48:13 -0400 Subject: [PATCH] [clang][AST] Inline StmtVisitor fallback methods Mark the trivial StmtVisitorBase fallback methods always_inline so each VisitFoo-to-VisitParent delegation is folded into its caller instead of retained as an out-of-line template thunk. In matched Release assertions-off Darwin arm64 builds, stripped clang decreases by 266,656 bytes, stripped clangd decreases by 232,912 bytes, and the stripped upstream llvm-driver multicall decreases by 266,336 bytes. Linked fixups are unchanged in all three binaries. A 16-pair constexpr-heavy compilation benchmark measured -1.63% CPU time with a 95% confidence interval of [-2.23%, -1.02%]. Five focused AST-dump and constant-expression lit tests pass. Co-authored-by: OpenAI Codex <[email protected]> --- clang/include/clang/AST/StmtVisitor.h | 32 +++++++++++++++++---------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/clang/include/clang/AST/StmtVisitor.h b/clang/include/clang/AST/StmtVisitor.h index 8b7b728deaff2..45e203578c9fd 100644 --- a/clang/include/clang/AST/StmtVisitor.h +++ b/clang/include/clang/AST/StmtVisitor.h @@ -115,16 +115,19 @@ class StmtVisitorBase { // If the implementation chooses not to implement a certain visit method, fall // back on VisitExpr or whatever else is the superclass. -#define STMT(CLASS, PARENT) \ - RetTy Visit ## CLASS(PTR(CLASS) S, ParamTys... P) { DISPATCH(PARENT, PARENT); } +#define STMT(CLASS, PARENT) \ + LLVM_ATTRIBUTE_ALWAYS_INLINE \ + RetTy Visit##CLASS(PTR(CLASS) S, ParamTys... P) { DISPATCH(PARENT, PARENT); } #include "clang/AST/StmtNodes.inc" // If the implementation doesn't implement binary operator methods, fall back // on VisitBinaryOperator. -#define BINOP_FALLBACK(NAME) \ - RetTy VisitBin ## NAME(PTR(BinaryOperator) S, ParamTys... P) { \ - DISPATCH(BinaryOperator, BinaryOperator); \ +#define BINOP_FALLBACK(NAME) \ + LLVM_ATTRIBUTE_ALWAYS_INLINE \ + RetTy VisitBin##NAME(PTR(BinaryOperator) S, ParamTys... P) { \ + DISPATCH(BinaryOperator, BinaryOperator); \ } + // clang-format off BINOP_FALLBACK(PtrMemD) BINOP_FALLBACK(PtrMemI) BINOP_FALLBACK(Mul) BINOP_FALLBACK(Div) BINOP_FALLBACK(Rem) BINOP_FALLBACK(Add) BINOP_FALLBACK(Sub) BINOP_FALLBACK(Shl) @@ -143,9 +146,10 @@ class StmtVisitorBase { // If the implementation doesn't implement compound assignment operator // methods, fall back on VisitCompoundAssignOperator. -#define CAO_FALLBACK(NAME) \ - RetTy VisitBin ## NAME(PTR(CompoundAssignOperator) S, ParamTys... P) { \ - DISPATCH(CompoundAssignOperator, CompoundAssignOperator); \ +#define CAO_FALLBACK(NAME) \ + LLVM_ATTRIBUTE_ALWAYS_INLINE \ + RetTy VisitBin##NAME(PTR(CompoundAssignOperator) S, ParamTys... P) { \ + DISPATCH(CompoundAssignOperator, CompoundAssignOperator); \ } CAO_FALLBACK(MulAssign) CAO_FALLBACK(DivAssign) CAO_FALLBACK(RemAssign) CAO_FALLBACK(AddAssign) CAO_FALLBACK(SubAssign) CAO_FALLBACK(ShlAssign) @@ -155,9 +159,10 @@ class StmtVisitorBase { // If the implementation doesn't implement unary operator methods, fall back // on VisitUnaryOperator. -#define UNARYOP_FALLBACK(NAME) \ - RetTy VisitUnary ## NAME(PTR(UnaryOperator) S, ParamTys... P) { \ - DISPATCH(UnaryOperator, UnaryOperator); \ +#define UNARYOP_FALLBACK(NAME) \ + LLVM_ATTRIBUTE_ALWAYS_INLINE \ + RetTy VisitUnary##NAME(PTR(UnaryOperator) S, ParamTys... P) { \ + DISPATCH(UnaryOperator, UnaryOperator); \ } UNARYOP_FALLBACK(PostInc) UNARYOP_FALLBACK(PostDec) UNARYOP_FALLBACK(PreInc) UNARYOP_FALLBACK(PreDec) @@ -170,7 +175,10 @@ class StmtVisitorBase { #undef UNARYOP_FALLBACK // Base case, ignore it. :) - RetTy VisitStmt(PTR(Stmt) Node, ParamTys... P) { return RetTy(); } + LLVM_ATTRIBUTE_ALWAYS_INLINE RetTy VisitStmt(PTR(Stmt) Node, ParamTys... P) { + return RetTy(); + } + // clang-format on #undef PTR #undef DISPATCH _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
