Skip to content

Commit 65b12a8

Browse files
committed
Recommit [NFC] [Serialization] Packing more bits
This patch tries to reduce the size of the BMIs by packing more bits into an unsigned integer. This patch was reverted due to buildbot failure report. But it should be irrevelent after I took a double look. So I tried to recommit this NFC change again.
1 parent 86763a8 commit 65b12a8

File tree

6 files changed

+178
-153
lines changed

6 files changed

+178
-153
lines changed

clang/include/clang/Serialization/ASTReader.h

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2415,12 +2415,7 @@ class BitsUnpacker {
24152415
BitsUnpacker(BitsUnpacker &&) = delete;
24162416
BitsUnpacker operator=(const BitsUnpacker &) = delete;
24172417
BitsUnpacker operator=(BitsUnpacker &&) = delete;
2418-
~BitsUnpacker() {
2419-
#ifndef NDEBUG
2420-
while (isValid())
2421-
assert(!getNextBit() && "There are unprocessed bits!");
2422-
#endif
2423-
}
2418+
~BitsUnpacker() = default;
24242419

24252420
void updateValue(uint32_t V) {
24262421
Value = V;

clang/lib/Serialization/ASTReaderDecl.cpp

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,9 @@ void ASTDeclReader::Visit(Decl *D) {
583583
}
584584

585585
void ASTDeclReader::VisitDecl(Decl *D) {
586+
BitsUnpacker DeclBits(Record.readInt());
587+
bool HasStandaloneLexicalDC = DeclBits.getNextBit();
588+
586589
if (D->isTemplateParameter() || D->isTemplateParameterPack() ||
587590
isa<ParmVarDecl, ObjCTypeParamDecl>(D)) {
588591
// We don't want to deserialize the DeclContext of a template
@@ -592,7 +595,8 @@ void ASTDeclReader::VisitDecl(Decl *D) {
592595
// return type of the function). Use the translation unit DeclContext as a
593596
// placeholder.
594597
GlobalDeclID SemaDCIDForTemplateParmDecl = readDeclID();
595-
GlobalDeclID LexicalDCIDForTemplateParmDecl = readDeclID();
598+
GlobalDeclID LexicalDCIDForTemplateParmDecl =
599+
HasStandaloneLexicalDC ? readDeclID() : 0;
596600
if (!LexicalDCIDForTemplateParmDecl)
597601
LexicalDCIDForTemplateParmDecl = SemaDCIDForTemplateParmDecl;
598602
Reader.addPendingDeclContextInfo(D,
@@ -601,7 +605,8 @@ void ASTDeclReader::VisitDecl(Decl *D) {
601605
D->setDeclContext(Reader.getContext().getTranslationUnitDecl());
602606
} else {
603607
auto *SemaDC = readDeclAs<DeclContext>();
604-
auto *LexicalDC = readDeclAs<DeclContext>();
608+
auto *LexicalDC =
609+
HasStandaloneLexicalDC ? readDeclAs<DeclContext>() : nullptr;
605610
if (!LexicalDC)
606611
LexicalDC = SemaDC;
607612
// If the context is a class, we might not have actually merged it yet, in
@@ -618,7 +623,6 @@ void ASTDeclReader::VisitDecl(Decl *D) {
618623
}
619624
D->setLocation(ThisDeclLoc);
620625

621-
BitsUnpacker DeclBits(Record.readInt());
622626
D->InvalidDecl = DeclBits.getNextBit();
623627
bool HasAttrs = DeclBits.getNextBit();
624628
D->setImplicit(DeclBits.getNextBit());
@@ -765,7 +769,7 @@ ASTDeclReader::RedeclarableResult ASTDeclReader::VisitTagDecl(TagDecl *TD) {
765769
TD->setCompleteDefinitionRequired(TagDeclBits.getNextBit());
766770
TD->setBraceRange(readSourceRange());
767771

768-
switch (Record.readInt()) {
772+
switch (TagDeclBits.getNextBits(/*Width=*/2)) {
769773
case 0:
770774
break;
771775
case 1: { // ExtInfo
@@ -1089,7 +1093,8 @@ void ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) {
10891093
FD->setCachedLinkage((Linkage)FunctionDeclBits.getNextBits(/*Width=*/3));
10901094

10911095
FD->EndRangeLoc = readSourceLocation();
1092-
FD->setDefaultLoc(readSourceLocation());
1096+
if (FD->isExplicitlyDefaulted())
1097+
FD->setDefaultLoc(readSourceLocation());
10931098

10941099
FD->ODRHash = Record.readInt();
10951100
FD->setHasODRHash(true);
@@ -1703,7 +1708,7 @@ void ASTDeclReader::VisitParmVarDecl(ParmVarDecl *PD) {
17031708
unsigned isObjCMethodParam = ParmVarDeclBits.getNextBit();
17041709
unsigned scopeDepth = ParmVarDeclBits.getNextBits(/*Width=*/7);
17051710
unsigned scopeIndex = ParmVarDeclBits.getNextBits(/*Width=*/8);
1706-
unsigned declQualifier = Record.readInt();
1711+
unsigned declQualifier = ParmVarDeclBits.getNextBits(/*Width=*/7);
17071712
if (isObjCMethodParam) {
17081713
assert(scopeDepth == 0);
17091714
PD->setObjCMethodScopeInfo(scopeIndex);
@@ -1716,7 +1721,9 @@ void ASTDeclReader::VisitParmVarDecl(ParmVarDecl *PD) {
17161721
PD->ParmVarDeclBits.HasInheritedDefaultArg = ParmVarDeclBits.getNextBit();
17171722
if (ParmVarDeclBits.getNextBit()) // hasUninstantiatedDefaultArg.
17181723
PD->setUninstantiatedDefaultArg(Record.readExpr());
1719-
PD->ExplicitObjectParameterIntroducerLoc = Record.readSourceLocation();
1724+
1725+
if (ParmVarDeclBits.getNextBit()) // Valid explicit object parameter
1726+
PD->ExplicitObjectParameterIntroducerLoc = Record.readSourceLocation();
17201727

17211728
// FIXME: If this is a redeclaration of a function from another module, handle
17221729
// inheritance of default arguments.

clang/lib/Serialization/ASTReaderStmt.cpp

Lines changed: 57 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ namespace clang {
108108

109109
/// The number of record fields required for the Expr class
110110
/// itself.
111-
static const unsigned NumExprFields = NumStmtFields + 4;
111+
static const unsigned NumExprFields = NumStmtFields + 2;
112112

113113
/// Read and initialize a ExplicitTemplateArgumentList structure.
114114
void ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args,
@@ -524,9 +524,13 @@ void ASTStmtReader::VisitCapturedStmt(CapturedStmt *S) {
524524
void ASTStmtReader::VisitExpr(Expr *E) {
525525
VisitStmt(E);
526526
E->setType(Record.readType());
527-
E->setDependence(static_cast<ExprDependence>(Record.readInt()));
528-
E->setValueKind(static_cast<ExprValueKind>(Record.readInt()));
529-
E->setObjectKind(static_cast<ExprObjectKind>(Record.readInt()));
527+
BitsUnpacker ExprBits(Record.readInt());
528+
E->setDependence(
529+
static_cast<ExprDependence>(ExprBits.getNextBits(/*Width=*/5)));
530+
E->setValueKind(
531+
static_cast<ExprValueKind>(ExprBits.getNextBits(/*Width=*/2)));
532+
E->setObjectKind(
533+
static_cast<ExprObjectKind>(ExprBits.getNextBits(/*Width=*/3)));
530534
assert(Record.getIdx() == NumExprFields &&
531535
"Incorrect expression field count");
532536
}
@@ -995,14 +999,19 @@ void ASTStmtReader::VisitOMPIteratorExpr(OMPIteratorExpr *E) {
995999

9961000
void ASTStmtReader::VisitCallExpr(CallExpr *E) {
9971001
VisitExpr(E);
998-
unsigned NumArgs = Record.readInt();
999-
bool HasFPFeatures = Record.readInt();
1002+
1003+
BitsUnpacker CallExprBits = Record.readInt();
1004+
1005+
unsigned NumArgs = CallExprBits.getNextBits(/*Width=*/16);
1006+
bool HasFPFeatures = CallExprBits.getNextBit();
1007+
E->setADLCallKind(
1008+
static_cast<CallExpr::ADLCallKind>(CallExprBits.getNextBit()));
10001009
assert((NumArgs == E->getNumArgs()) && "Wrong NumArgs!");
10011010
E->setRParenLoc(readSourceLocation());
10021011
E->setCallee(Record.readSubExpr());
10031012
for (unsigned I = 0; I != NumArgs; ++I)
10041013
E->setArg(I, Record.readSubExpr());
1005-
E->setADLCallKind(static_cast<CallExpr::ADLCallKind>(Record.readInt()));
1014+
10061015
if (HasFPFeatures)
10071016
E->setStoredFPFeatures(
10081017
FPOptionsOverride::getFromOpaqueInt(Record.readInt()));
@@ -2013,14 +2022,15 @@ ASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
20132022
void ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) {
20142023
VisitExpr(E);
20152024

2016-
unsigned NumResults = Record.readInt();
2017-
bool HasTemplateKWAndArgsInfo = Record.readInt();
2025+
BitsUnpacker OverloadExprBits = Record.readInt();
2026+
unsigned NumResults = OverloadExprBits.getNextBits(/*Width=*/14);
2027+
bool HasTemplateKWAndArgsInfo = OverloadExprBits.getNextBit();
20182028
assert((E->getNumDecls() == NumResults) && "Wrong NumResults!");
20192029
assert((E->hasTemplateKWAndArgsInfo() == HasTemplateKWAndArgsInfo) &&
20202030
"Wrong HasTemplateKWAndArgsInfo!");
20212031

20222032
if (HasTemplateKWAndArgsInfo) {
2023-
unsigned NumTemplateArgs = Record.readInt();
2033+
unsigned NumTemplateArgs = OverloadExprBits.getNextBits(/*Width=*/14);
20242034
ReadTemplateKWAndArgsInfo(*E->getTrailingASTTemplateKWAndArgsInfo(),
20252035
E->getTrailingTemplateArgumentLoc(),
20262036
NumTemplateArgs);
@@ -3022,11 +3032,13 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
30223032
Record[ASTStmtReader::NumExprFields]);
30233033
break;
30243034

3025-
case EXPR_CALL:
3026-
S = CallExpr::CreateEmpty(
3027-
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields],
3028-
/*HasFPFeatures=*/Record[ASTStmtReader::NumExprFields + 1], Empty);
3035+
case EXPR_CALL: {
3036+
BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields]);
3037+
auto NumArgs = CallExprBits.getNextBits(/*Width=*/16);
3038+
auto HasFPFeatures = CallExprBits.getNextBit();
3039+
S = CallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures, Empty);
30293040
break;
3041+
}
30303042

30313043
case EXPR_RECOVERY:
30323044
S = RecoveryExpr::CreateEmpty(
@@ -3764,17 +3776,23 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
37643776
break;
37653777
}
37663778

3767-
case EXPR_CXX_OPERATOR_CALL:
3768-
S = CXXOperatorCallExpr::CreateEmpty(
3769-
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields],
3770-
/*HasFPFeatures=*/Record[ASTStmtReader::NumExprFields + 1], Empty);
3779+
case EXPR_CXX_OPERATOR_CALL: {
3780+
BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields]);
3781+
auto NumArgs = CallExprBits.getNextBits(/*Width=*/16);
3782+
auto HasFPFeatures = CallExprBits.getNextBit();
3783+
S = CXXOperatorCallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures,
3784+
Empty);
37713785
break;
3786+
}
37723787

3773-
case EXPR_CXX_MEMBER_CALL:
3774-
S = CXXMemberCallExpr::CreateEmpty(
3775-
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields],
3776-
/*HasFPFeatures=*/Record[ASTStmtReader::NumExprFields + 1], Empty);
3788+
case EXPR_CXX_MEMBER_CALL: {
3789+
BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields]);
3790+
auto NumArgs = CallExprBits.getNextBits(/*Width=*/16);
3791+
auto HasFPFeatures = CallExprBits.getNextBit();
3792+
S = CXXMemberCallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures,
3793+
Empty);
37773794
break;
3795+
}
37783796

37793797
case EXPR_CXX_REWRITTEN_BINARY_OPERATOR:
37803798
S = new (Context) CXXRewrittenBinaryOperator(Empty);
@@ -3948,23 +3966,21 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
39483966
case EXPR_CXX_UNRESOLVED_MEMBER:
39493967
S = UnresolvedMemberExpr::CreateEmpty(
39503968
Context,
3951-
/*NumResults=*/Record[ASTStmtReader::NumExprFields],
3952-
/*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields + 1],
3953-
/*NumTemplateArgs=*/
3954-
Record[ASTStmtReader::NumExprFields + 1]
3955-
? Record[ASTStmtReader::NumExprFields + 2]
3956-
: 0);
3969+
/*NumResults=*/Record[ASTStmtReader::NumExprFields] & ((1 << 14) - 1),
3970+
/*HasTemplateKWAndArgsInfo=*/
3971+
(Record[ASTStmtReader::NumExprFields] >> 14) & (0x1),
3972+
/*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] >> 14 &
3973+
((1 << 14) - 1));
39573974
break;
39583975

39593976
case EXPR_CXX_UNRESOLVED_LOOKUP:
39603977
S = UnresolvedLookupExpr::CreateEmpty(
39613978
Context,
3962-
/*NumResults=*/Record[ASTStmtReader::NumExprFields],
3963-
/*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields + 1],
3964-
/*NumTemplateArgs=*/
3965-
Record[ASTStmtReader::NumExprFields + 1]
3966-
? Record[ASTStmtReader::NumExprFields + 2]
3967-
: 0);
3979+
/*NumResults=*/Record[ASTStmtReader::NumExprFields] & ((1 << 14) - 1),
3980+
/*HasTemplateKWAndArgsInfo=*/
3981+
(Record[ASTStmtReader::NumExprFields] >> 14) & (0x1),
3982+
/*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] >> 14 &
3983+
((1 << 14) - 1));
39683984
break;
39693985

39703986
case EXPR_TYPE_TRAIT:
@@ -4024,11 +4040,14 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
40244040
S = new (Context) OpaqueValueExpr(Empty);
40254041
break;
40264042

4027-
case EXPR_CUDA_KERNEL_CALL:
4028-
S = CUDAKernelCallExpr::CreateEmpty(
4029-
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields],
4030-
/*HasFPFeatures=*/Record[ASTStmtReader::NumExprFields + 1], Empty);
4043+
case EXPR_CUDA_KERNEL_CALL: {
4044+
BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields]);
4045+
auto NumArgs = CallExprBits.getNextBits(/*Width=*/16);
4046+
auto HasFPFeatures = CallExprBits.getNextBit();
4047+
S = CUDAKernelCallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures,
4048+
Empty);
40314049
break;
4050+
}
40324051

40334052
case EXPR_ASTYPE:
40344053
S = new (Context) AsTypeExpr(Empty);

0 commit comments

Comments
 (0)