[clang] [Clang] Optimize some `getBeginLoc` implementations (PR #141058)
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Thu May 22 06:02:09 PDT 2025
================
@@ -2901,34 +2907,44 @@ class CallExpr : public Expr {
//
// * An optional of type FPOptionsOverride.
//
- // Note that we store the offset in bytes from the this pointer to the start
- // of the trailing objects. It would be perfectly possible to compute it
- // based on the dynamic kind of the CallExpr. However 1.) we have plenty of
- // space in the bit-fields of Stmt. 2.) It was benchmarked to be faster to
- // compute this once and then load the offset from the bit-fields of Stmt,
- // instead of re-computing the offset each time the trailing objects are
- // accessed.
+ // CallExpr subclasses are asssumed to be 32 bytes or less, and CallExpr
+ // itself is 24 bytes. To avoid having to recompute or store the offset of the
+ // trailing objects, we put it at 32 bytes (such that it is suitable for all
+ // subclasses) We use the 8 bytes gap left for instances of CallExpr to store
+ // the begin and end source locations. Caching the begin source location in
+ // particular as a significant impact on perf as getBeginLoc is assumed to be
+ // cheap.
+ // The layourt is as follow:
+ // CallExpr | Begin | End | Trailing Objects
+ // CXXMemberCallExpr | Trailing Objects
+ // A bit in CallExprBitfields indicates if source locations are presents.
+protected:
+ static constexpr unsigned offsetToTrailingObjects = 32;
----------------
AaronBallman wrote:
```suggestion
static constexpr unsigned OffsetToTrailingObjects = 32;
```
https://github.com/llvm/llvm-project/pull/141058
More information about the cfe-commits
mailing list