Skip to content

[Serialization] Add a helper for serializing nodes in an object graph #26800

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 23, 2019

Conversation

jrose-apple
Copy link
Contributor

The AST block in a compiled module represents an object graph, which is essentially serialized in four steps:

  • An entity (such as a Decl or Type) is encountered, given an ID, and added to a worklist.
  • The next entity is popped from the worklist and its offset in the output stream is recorded.
  • During the course of writing that entity, more entities will be referenced and added to the worklist.
  • Once the entire worklist is drained, the offsets get written to a table in the Index block.

The implementation of this was duplicated for each kind of entity in the AST block; this commit factors that out into a reusable helper. No intended high-level functionality change, but the order in which Decls and Types get emitted might change a little now that they're not in the same queue.

@jrose-apple
Copy link
Contributor Author

I promise I'm almost done with these Serialization cleanup commits.

@swift-ci Please test

@jrose-apple
Copy link
Contributor Author

@swift-ci Please test compiler performance

/// \tparam RecordCode_ The code for the offsets record in the Index block for
/// referring to these entities.
template <typename T, typename ID, unsigned RecordCode_>
class Serialized {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The naming is slightly misleading here (although the doc comment clarifies the intent) -- the class is called "Serialized" even though it keeps track of both things that have already been serialized and things that need to be serialized. I don't have a good alternative in mind though 🙁. Perhaps SerializationBookkeeper?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I don't love the name either. I'll go with yours if I can't think of anything better.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What this class does—issuing ID numbers, looking up IDs for entities, keeping track of work to be done—seems clerical to me. Clerk? Recorder (in the sense of "county recorder") or RecordKeeper?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One more potential name SerializationState. I like Brent's RecordKeeper suggestion too.

}

/// Returns the next entity to be written.
T peekNext() const {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Potential crash if someone forgot to check hasMoreToSerialize() before calling peekNext() -- instead we could combine the two functions and return optional<T>.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's true, but I don't think it improves the clarity of code at these particular use sites.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would make sense to document this precondition, though.

/// Records that the next entity will be written at \p offset, and returns
/// it so it can be written.
T popNext(BitOffset offset) {
T result = EntitiesToWrite.front();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as above -- potential crash if someone forgot to check hasMoreToSerialize().

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I see -- this function is only being called in a particular context where you check the condition so perhaps this is fine...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I could make it an explicit assertion instead of relying on the STL to catch it. Would that help?

Copy link
Contributor

@varungandhi-apple varungandhi-apple Aug 23, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Returning an optional (1) is safe, (2) let's you shorten the while loops (except the one case which uses peekNext()) :

    while (DeclsToSerialize.hasMoreToSerialize()) {
      auto next = DeclsToSerialize.popNext(Out.GetCurrentBitNo());
      writeDecl(next);
    }

becomes

    while (auto next = DeclsToSerialize.popNext(Out.getCurrentBitNo()))
      writeDecl(next.getValue());

and (3) let's you put an assertion when forcibly popping, so

    (void)GenericEnvironmentsToSerialize.popNext((genericSigID << 1) | 0x01);

becomes

    assert(GenericEnvironmentsToSerialize.popNext((genericSigID << 1) | 0x01).hasValue() && "[add justification here]");

Seems like a win-win -- what do you think?

Copy link
Contributor Author

@jrose-apple jrose-apple Aug 23, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:-/ Take a closer look at writeNextGenericEnvironment. (I wouldn't have added peek at all if not for that.)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I see, you don't propose to get rid of hasMoreToSerialize. All right.

Copy link
Contributor

@beccadax beccadax left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Refactoring like this really clarifies the code! I have a couple of suggestions, but they're optional because they might verge on being too clever.

/// \tparam RecordCode_ The code for the offsets record in the Index block for
/// referring to these entities.
template <typename T, typename ID, unsigned RecordCode_>
class Serialized {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What this class does—issuing ID numbers, looking up IDs for entities, keeping track of work to be done—seems clerical to me. Clerk? Recorder (in the sense of "county recorder") or RecordKeeper?

auto &entityID = IDs[entity];
if (entityID == ID()) {
EntitiesToWrite.push(entity);
entityID = ++LastID;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LastID is always the same as IDs.size(), isn't it? And it looks like all of the DenseMap implementations keep the size in a member variable, so it shouldn't be slow to access. Dropping LastID would save you four bytes and be one less invariant for someone to break.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, good point. This one I'll take. :-)

DeclsAndTypesToWrite.pop();
while (DeclsToSerialize.hasMoreToSerialize()) {
auto next = DeclsToSerialize.popNext(Out.GetCurrentBitNo());
writeDecl(next);
Copy link
Contributor

@beccadax beccadax Aug 23, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be nice to incorporate these repetitive loops into Serialized somehow. For instance, maybe you could rename writeDecl, writeType, etc. to just writeEntity, overloaded by parameter type, and then write:

/// Return value: True if this call did no work; false otherwise.
template <typename RecordWriter>
bool Serialized::writeMore(RecordWriter &writer, llvm::BitstreamWriter &Out) {
  if (!hasMoreToSerialize())
    return true;

  do {
    auto next = popNext(Out.GetCurrentBitNo());
    writer.writeEntity(next);
  } while (hasMoreToSerialize());

  return false;
}

With that, the loop in writeAllDeclsAndTypes() condenses to something like:

bool quiescent;
do {
  quiescent  = DeclsToSerialize.writeMore(*this, Out);
  quiescent &= TypesToSerialize.writeMore(*this, Out);
  quiescent &= LocalDeclContextsToSerialize.writeMore(*this, Out);
  // ...and so on...
} while (!quiescent);

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ooh, clever. I'll look into it tomorrow.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Neat idea :). Nitpick: if "writeMore" returns "true", I would expect that it means "yes, I wrote more stuff" but we're doing the opposite.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I struggled a bit with the name for quiescent, which is why the method returns the value it does. In any case, Jordan can figure it out. 😀

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll come back to the full-on refactoring in a follow-up PR; it would mean eliminating the ambiguity between DeclContextsToSerialize and LocalDeclContextsToSerialize.

@jrose-apple
Copy link
Contributor Author

Compiler perf tests (still not done)

The AST block in a compiled module represents an object graph, which
is essentially serialized in four steps:

- An entity (such as a Decl or Type) is encountered, given an ID, and
  added to a worklist.
- The next entity is popped from the worklist and its offset in the
  output stream is recorded.
- During the course of writing that entity, more entities will be
  referenced and added to the worklist.
- Once the entire worklist is drained, the offsets get written to a
  table in the Index block.

The implementation of this was duplicated for each kind of entity in
the AST block; this commit factors that out into a reusable helper.
No intended high-level functionality change, but the order in which
Decls and Types get emitted might change a little now that they're not
in the same queue.
@jrose-apple
Copy link
Contributor Author

@swift-ci Please smoke test

@swift-ci
Copy link
Contributor

Summary for master full

Unexpected test results, excluded stats for RxCocoa, Base64CoderSwiftUI, SwifterSwift

Regressions found (see below)

Debug-batch

debug-batch brief

Regressed (0)
name old new delta delta_pct
Improved (0)
name old new delta delta_pct
Unchanged (delta < 1.0% or delta < 100.0ms) (3)
name old new delta delta_pct
Frontend.NumInstructionsExecuted 46,320,956,421,835 45,948,713,946,537 -372,242,475,298 -0.8%
LLVM.NumLLVMBytesOutput 1,786,903,638 1,786,905,946 2,308 0.0%
time.swift-driver.wall 5122.7s 5117.3s -5.4s -0.11%

debug-batch detailed

Regressed (2)
name old new delta delta_pct
Driver.NumDriverPipePolls 55,882 57,332 1,450 2.59% ⛔
Driver.NumDriverPipeReads 43,010 44,346 1,336 3.11% ⛔
Improved (9)
name old new delta delta_pct
AST.NumASTBytesAllocated 63,765,304,247 62,767,341,005 -997,963,242 -1.57% ✅
Sema.AccessLevelRequest 11,925,125 11,573,229 -351,896 -2.95% ✅
Sema.CollectOverriddenDeclsRequest 7,304,217 7,083,368 -220,849 -3.02% ✅
Sema.NumConformancesDeserialized 9,366,055 9,241,593 -124,462 -1.33% ✅
Sema.NumDeclsDeserialized 75,357,716 74,511,433 -846,283 -1.12% ✅
Sema.NumLazyGenericEnvironments 13,699,478 13,503,848 -195,630 -1.43% ✅
Sema.OverriddenDeclsRequest 2,396,223 2,367,610 -28,613 -1.19% ✅
Sema.ProvideDefaultImplForRequest 7,304,217 7,083,368 -220,849 -3.02% ✅
Sema.USRGenerationRequest 8,518,160 8,305,514 -212,646 -2.5% ✅
Unchanged (delta < 1.0% or delta < 100.0ms) (141)
name old new delta delta_pct
AST.NumDecls 140,002 140,002 0 0.0%
AST.NumDependencies 321,519 321,529 10 0.0%
AST.NumInfixOperators 53,782 53,782 0 0.0%
AST.NumLinkLibraries 0 0 0 0.0%
AST.NumLoadedModules 399,488 399,488 0 0.0%
AST.NumLocalTypeDecls 253 253 0 0.0%
AST.NumLookupInModule 6,744,777 6,762,749 17,972 0.27%
AST.NumLookupQualifiedInAnyObject 281 281 0 0.0%
AST.NumLookupQualifiedInModule 3,253,555 3,271,245 17,690 0.54%
AST.NumLookupQualifiedInNominal 8,164,178 8,141,331 -22,847 -0.28%
AST.NumModuleLookupClassMember 15,754 15,754 0 0.0%
AST.NumModuleLookupValue 45,553,819 45,574,080 20,261 0.04%
AST.NumObjCMethods 24,701 24,701 0 0.0%
AST.NumPostfixOperators 23 23 0 0.0%
AST.NumPrecedenceGroups 25,668 25,668 0 0.0%
AST.NumPrefixOperators 99 99 0 0.0%
AST.NumReferencedDynamicNames 189 189 0 0.0%
AST.NumReferencedMemberNames 6,322,449 6,322,449 0 0.0%
AST.NumReferencedTopLevelNames 476,992 476,992 0 0.0%
AST.NumSourceBuffers 566,010 566,010 0 0.0%
AST.NumSourceLines 4,685,544 4,685,544 0 0.0%
AST.NumSourceLinesPerSecond 3,435,796 3,442,681 6,885 0.2%
AST.NumTotalClangImportedEntities 6,441,952 6,435,563 -6,389 -0.1%
AST.NumUnqualifiedLookup 4,381,771 4,382,062 291 0.01%
Driver.ChildrenMaxRSS 237,439,770,624 236,689,186,816 -750,583,808 -0.32%
Driver.DriverDepCascadingDynamic 0 0 0 0.0%
Driver.DriverDepCascadingExternal 0 0 0 0.0%
Driver.DriverDepCascadingMember 0 0 0 0.0%
Driver.DriverDepCascadingNominal 0 0 0 0.0%
Driver.DriverDepCascadingTopLevel 0 0 0 0.0%
Driver.DriverDepDynamic 0 0 0 0.0%
Driver.DriverDepExternal 0 0 0 0.0%
Driver.DriverDepMember 0 0 0 0.0%
Driver.DriverDepNominal 0 0 0 0.0%
Driver.DriverDepTopLevel 0 0 0 0.0%
Driver.NumDriverJobsRun 27,904 27,904 0 0.0%
Driver.NumDriverJobsSkipped 0 0 0 0.0%
Driver.NumProcessFailures 0 0 0 0.0%
Frontend.MaxMallocUsage 1,321,813,401,968 1,315,328,820,816 -6,484,581,152 -0.49%
Frontend.NumInstructionsExecuted 46,320,956,421,835 45,948,713,946,537 -372,242,475,298 -0.8%
Frontend.NumProcessFailures 0 0 0 0.0%
IRModule.NumIRAliases 197,197 197,197 0 0.0%
IRModule.NumIRBasicBlocks 6,800,554 6,800,554 0 0.0%
IRModule.NumIRComdatSymbols 0 0 0 0.0%
IRModule.NumIRFunctions 3,364,031 3,364,031 0 0.0%
IRModule.NumIRGlobals 3,522,315 3,522,315 0 0.0%
IRModule.NumIRIFuncs 0 0 0 0.0%
IRModule.NumIRInsts 86,650,634 86,650,634 0 0.0%
IRModule.NumIRNamedMetaData 134,220 134,220 0 0.0%
IRModule.NumIRValueSymbols 6,231,344 6,231,344 0 0.0%
LLVM.NumLLVMBytesOutput 1,786,903,638 1,786,905,946 2,308 0.0%
Parse.NumFunctionsParsed 267,971 267,971 0 0.0%
Parse.NumIterableDeclContextParsed 908,643 908,641 -2 -0.0%
SILModule.NumSILGenDefaultWitnessTables 0 0 0 0.0%
SILModule.NumSILGenFunctions 1,709,476 1,709,476 0 0.0%
SILModule.NumSILGenGlobalVariables 53,884 53,884 0 0.0%
SILModule.NumSILGenVtables 18,576 18,576 0 0.0%
SILModule.NumSILGenWitnessTables 72,169 72,169 0 0.0%
SILModule.NumSILOptDefaultWitnessTables 0 0 0 0.0%
SILModule.NumSILOptFunctions 2,441,619 2,441,619 0 0.0%
SILModule.NumSILOptGlobalVariables 55,508 55,508 0 0.0%
SILModule.NumSILOptVtables 31,332 31,332 0 0.0%
SILModule.NumSILOptWitnessTables 157,751 157,751 0 0.0%
Sema.AttachedFunctionBuilderRequest 3 3 0 0.0%
Sema.AttachedPropertyWrapperTypeRequest 515,933 515,933 0 0.0%
Sema.AttachedPropertyWrappersRequest 2,173,991 2,173,991 0 0.0%
Sema.CursorInfoRequest 0 0 0 0.0%
Sema.CustomAttrNominalRequest 3 3 0 0.0%
Sema.DefaultAndMaxAccessLevelRequest 57,737 57,751 14 0.02%
Sema.DefaultDefinitionTypeRequest 8,104 8,104 0 0.0%
Sema.DefaultTypeRequest 460,583 460,583 0 0.0%
Sema.EmittedMembersRequest 27,953 27,953 0 0.0%
Sema.EnumRawTypeRequest 25,102 25,102 0 0.0%
Sema.ExistentialConformsToSelfRequest 23,311 23,298 -13 -0.06%
Sema.ExistentialTypeSupportedRequest 17,731 17,731 0 0.0%
Sema.ExtendedNominalRequest 6,882,926 6,858,972 -23,954 -0.35%
Sema.FunctionBuilderTypeRequest 3 3 0 0.0%
Sema.GetDestructorRequest 28,360 28,360 0 0.0%
Sema.HasDynamicMemberLookupAttributeRequest 0 0 0 0.0%
Sema.InheritedDeclsReferencedRequest 6,200,626 6,179,594 -21,032 -0.34%
Sema.InheritedTypeRequest 332,170 332,657 487 0.15%
Sema.InitKindRequest 112,507 112,507 0 0.0%
Sema.IsAccessorTransparentRequest 320,248 320,248 0 0.0%
Sema.IsDeclApplicableRequest 0 0 0 0.0%
Sema.IsDynamicRequest 1,664,601 1,664,601 0 0.0%
Sema.IsFinalRequest 2,619,098 2,594,527 -24,571 -0.94%
Sema.IsGetterMutatingRequest 443,263 443,263 0 0.0%
Sema.IsImplicitlyUnwrappedOptionalRequest 2,533,125 2,533,431 306 0.01%
Sema.IsObjCRequest 1,602,830 1,599,659 -3,171 -0.2%
Sema.IsSetterMutatingRequest 350,119 350,119 0 0.0%
Sema.LazyStoragePropertyRequest 2,603 2,603 0 0.0%
Sema.MangleLocalTypeDeclRequest 506 506 0 0.0%
Sema.NamedLazyMemberLoadFailureCount 22,331 22,352 21 0.09%
Sema.NamedLazyMemberLoadSuccessCount 29,774,639 29,789,647 15,008 0.05%
Sema.NominalTypeLookupDirectCount 36,681,555 36,563,278 -118,277 -0.32%
Sema.NumAccessorBodiesSynthesized 189,296 189,296 0 0.0%
Sema.NumAccessorsSynthesized 296,229 296,229 0 0.0%
Sema.NumConstraintScopes 27,061,979 27,050,010 -11,969 -0.04%
Sema.NumConstraintsConsideredForEdgeContraction 86,057,003 86,056,351 -652 -0.0%
Sema.NumCyclicOneWayComponentsCollapsed 0 0 0 0.0%
Sema.NumDeclsTypechecked 1,403,524 1,403,524 0 0.0%
Sema.NumDeclsValidated 2,589,306 2,589,314 8 0.0%
Sema.NumFunctionsTypechecked 527,252 527,252 0 0.0%
Sema.NumGenericSignatureBuilders 1,480,666 1,471,564 -9,102 -0.61%
Sema.NumLazyGenericEnvironmentsLoaded 323,308 323,551 243 0.08%
Sema.NumLazyIterableDeclContexts 9,729,095 9,695,046 -34,049 -0.35%
Sema.NumLazyRequirementSignatures 1,031,540 1,029,875 -1,665 -0.16%
Sema.NumLazyRequirementSignaturesLoaded 662,707 661,451 -1,256 -0.19%
Sema.NumLeafScopes 17,411,012 17,399,995 -11,017 -0.06%
Sema.NumTypesDeserialized 22,421,808 22,253,105 -168,703 -0.75%
Sema.NumTypesValidated 1,817,224 1,817,234 10 0.0%
Sema.NumUnloadedLazyIterableDeclContexts 6,324,121 6,348,469 24,348 0.39%
Sema.OpaqueReadOwnershipRequest 282,386 282,386 0 0.0%
Sema.PropertyWrapperBackingPropertyInfoRequest 510,547 510,547 0 0.0%
Sema.PropertyWrapperBackingPropertyTypeRequest 515,933 515,933 0 0.0%
Sema.PropertyWrapperMutabilityRequest 621,976 621,976 0 0.0%
Sema.PropertyWrapperTypeInfoRequest 1 1 0 0.0%
Sema.ProtocolRequiresClassRequest 92,060 92,537 477 0.52%
Sema.RangeInfoRequest 0 0 0 0.0%
Sema.RequirementRequest 112,209 112,215 6 0.01%
Sema.RequirementSignatureRequest 763,935 763,180 -755 -0.1%
Sema.RequiresOpaqueAccessorsRequest 1,325,458 1,325,458 0 0.0%
Sema.RequiresOpaqueModifyCoroutineRequest 273,633 273,633 0 0.0%
Sema.ResilienceExpansionRequest 1,843,121 1,843,138 17 0.0%
Sema.ResolveProtocolNameRequest 0 0 0 0.0%
Sema.RootAndResultTypeOfKeypathDynamicMemberRequest 0 0 0 0.0%
Sema.RootTypeOfKeypathDynamicMemberRequest 0 0 0 0.0%
Sema.SelfAccessKindRequest 6,366,612 6,371,034 4,422 0.07%
Sema.SelfBoundsFromWhereClauseRequest 8,045,524 8,008,956 -36,568 -0.45%
Sema.SetterAccessLevelRequest 151,118 151,118 0 0.0%
Sema.StorageImplInfoRequest 1,209,538 1,209,538 0 0.0%
Sema.StoredPropertiesAndMissingMembersRequest 32,443 32,443 0 0.0%
Sema.StoredPropertiesRequest 350,308 350,308 0 0.0%
Sema.StructuralTypeRequest 0 0 0 0.0%
Sema.SuperclassDeclRequest 500,200 499,202 -998 -0.2%
Sema.SuperclassTypeRequest 56,563 56,563 0 0.0%
Sema.SynthesizeAccessorRequest 296,229 296,229 0 0.0%
Sema.TypeCheckFunctionBodyUntilRequest 527,252 527,252 0 0.0%
Sema.TypeDeclsFromWhereClauseRequest 29,951 29,965 14 0.05%
Sema.TypeRelationCheckRequest 0 0 0 0.0%
Sema.UnderlyingTypeDeclsReferencedRequest 295,533 293,877 -1,656 -0.56%

Release

release brief

Regressed (0)
name old new delta delta_pct
Improved (0)
name old new delta delta_pct
Unchanged (delta < 1.0% or delta < 100.0ms) (3)
name old new delta delta_pct
Frontend.NumInstructionsExecuted 47,283,022,638,793 47,278,177,426,229 -4,845,212,564 -0.01%
LLVM.NumLLVMBytesOutput 1,541,595,330 1,541,600,278 4,948 0.0%
time.swift-driver.wall 8598.9s 8599.1s 172.7ms 0.0%

release detailed

Regressed (0)
name old new delta delta_pct
Improved (0)
name old new delta delta_pct
Unchanged (delta < 1.0% or delta < 100.0ms) (21)
name old new delta delta_pct
AST.NumLoadedModules 30,333 30,333 0 0.0%
AST.NumTotalClangImportedEntities 1,231,537 1,231,537 0 0.0%
IRModule.NumIRBasicBlocks 5,632,945 5,632,945 0 0.0%
IRModule.NumIRFunctions 2,856,736 2,856,736 0 0.0%
IRModule.NumIRGlobals 3,026,851 3,026,851 0 0.0%
IRModule.NumIRInsts 53,112,848 53,112,848 0 0.0%
IRModule.NumIRValueSymbols 5,526,332 5,526,332 0 0.0%
LLVM.NumLLVMBytesOutput 1,541,595,330 1,541,600,278 4,948 0.0%
SILModule.NumSILGenFunctions 1,191,466 1,191,466 0 0.0%
SILModule.NumSILOptFunctions 1,681,840 1,681,840 0 0.0%
Sema.NumConformancesDeserialized 3,930,087 3,930,087 0 0.0%
Sema.NumConstraintScopes 26,603,733 26,603,733 0 0.0%
Sema.NumDeclsDeserialized 10,453,700 10,453,700 0 0.0%
Sema.NumDeclsValidated 1,826,146 1,826,146 0 0.0%
Sema.NumFunctionsTypechecked 530,874 530,874 0 0.0%
Sema.NumGenericSignatureBuilders 295,642 295,642 0 0.0%
Sema.NumLazyGenericEnvironments 2,062,676 2,062,676 0 0.0%
Sema.NumLazyGenericEnvironmentsLoaded 35,748 35,748 0 0.0%
Sema.NumLazyIterableDeclContexts 1,330,132 1,330,132 0 0.0%
Sema.NumTypesDeserialized 5,621,264 5,621,264 0 0.0%
Sema.NumTypesValidated 947,067 947,067 0 0.0%

@jrose-apple
Copy link
Contributor Author

Are we sure this bot is excluding XFAILs properly? Or is batch mode non-deterministic in how it chooses batches these days?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants