AST: Optimize the layout of AvailabilityRange
#79784
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
AvailabilityRange
is now being used as a currency type in more of the compiler, and some of those uses are in permanentASTContext
allocations. The class wraps theVersionRange
utility, which is itself a wrapper aroundllvm::VersionTuple
with some additional storage for representing sentinel values. Even though the two sentinel values can be be represented with just a single bit of additional storage on top of the 16 bytes required to representVersionTuple
, because of alignment requirements the sentinel values end up bloating the layout ofVersionRange
by many bytes.To make
AvailabilityRange
andVersionRange
more efficient to store, we can instead reserve two unlikelyllvm::VersionTuple
bit patterns as the sentinel values instead. The values chosen are the same ones LLVM uses to represent version tuple tombstones and empty keys in aDenseMap
.