Skip to content

Commit 02db632

Browse files
committed
RequirementMachine: Re-use a single global RewriteContext
1 parent 8c91cca commit 02db632

File tree

4 files changed

+28
-7
lines changed

4 files changed

+28
-7
lines changed

include/swift/AST/RequirementMachine.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ class raw_ostream;
2121

2222
namespace swift {
2323

24+
namespace rewriting {
25+
class RewriteContext;
26+
}
27+
2428
class ASTContext;
2529
class AssociatedTypeDecl;
2630
class CanType;
@@ -40,7 +44,7 @@ class RequirementMachine final {
4044
ASTContext &Context;
4145
Implementation *Impl;
4246

43-
explicit RequirementMachine(ASTContext &ctx);
47+
explicit RequirementMachine(rewriting::RewriteContext &rewriteCtx);
4448

4549
RequirementMachine(const RequirementMachine &) = delete;
4650
RequirementMachine(RequirementMachine &&) = delete;

lib/AST/ASTContext.cpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@
6767
#include <algorithm>
6868
#include <memory>
6969

70+
#include "RequirementMachine/RewriteContext.h"
71+
7072
using namespace swift;
7173

7274
#define DEBUG_TYPE "ASTContext"
@@ -531,6 +533,9 @@ struct ASTContext::Implementation {
531533
/// The scratch context used to allocate intrinsic data on behalf of \c swift::IntrinsicInfo
532534
std::unique_ptr<llvm::LLVMContext> IntrinsicScratchContext;
533535
#endif
536+
537+
/// Memory allocation arena for the term rewriting system.
538+
std::unique_ptr<rewriting::RewriteContext> TheRewriteContext;
534539
};
535540

536541
ASTContext::Implementation::Implementation()
@@ -1771,15 +1776,20 @@ static AllocationArena getArena(GenericSignature genericSig) {
17711776
if (!genericSig)
17721777
return AllocationArena::Permanent;
17731778

1774-
if (genericSig->hasTypeVariable())
1779+
if (genericSig->hasTypeVariable()) {
1780+
assert(false && "What's going on");
17751781
return AllocationArena::ConstraintSolver;
1782+
}
17761783

17771784
return AllocationArena::Permanent;
17781785
}
17791786

17801787
void ASTContext::registerGenericSignatureBuilder(
17811788
GenericSignature sig,
17821789
GenericSignatureBuilder &&builder) {
1790+
if (LangOpts.EnableRequirementMachine == RequirementMachineMode::Enabled)
1791+
return;
1792+
17831793
auto canSig = sig.getCanonicalSignature();
17841794
auto arena = getArena(sig);
17851795
auto &genericSignatureBuilders =
@@ -1885,6 +1895,12 @@ GenericSignatureBuilder *ASTContext::getOrCreateGenericSignatureBuilder(
18851895

18861896
RequirementMachine *ASTContext::getOrCreateRequirementMachine(
18871897
CanGenericSignature sig) {
1898+
assert(!sig->hasTypeVariable());
1899+
1900+
auto &rewriteCtx = getImpl().TheRewriteContext;
1901+
if (!rewriteCtx)
1902+
rewriteCtx.reset(new rewriting::RewriteContext(*this));
1903+
18881904
// Check whether we already have a requirement machine for this
18891905
// signature.
18901906
auto arena = getArena(sig);
@@ -1902,12 +1918,12 @@ RequirementMachine *ASTContext::getOrCreateRequirementMachine(
19021918
return machine;
19031919
}
19041920

1905-
auto *machine = new RequirementMachine(*this);
1921+
auto *machine = new RequirementMachine(*rewriteCtx);
19061922

19071923
// Store this requirement machine before adding the signature,
19081924
// to catch re-entrant construction via addGenericSignature()
19091925
// below.
1910-
machinePtr = std::unique_ptr<RequirementMachine>(machine);
1926+
machinePtr.reset(machine);
19111927

19121928
machine->addGenericSignature(sig);
19131929

lib/AST/RequirementMachine/RequirementMachine.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,8 @@ void RequirementMachine::Implementation::dump(llvm::raw_ostream &out) {
295295
Map.dump(out);
296296
}
297297

298-
RequirementMachine::RequirementMachine(ASTContext &ctx) : Context(ctx) {
298+
RequirementMachine::RequirementMachine(RewriteContext &ctx)
299+
: Context(ctx.getASTContext()) {
299300
Impl = new Implementation(ctx);
300301
}
301302

lib/AST/RequirementMachine/RequirementMachineImpl.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ namespace swift {
2828

2929
/// We use the PIMPL pattern to avoid creeping header dependencies.
3030
struct RequirementMachine::Implementation {
31-
rewriting::RewriteContext Context;
31+
rewriting::RewriteContext &Context;
3232
rewriting::RewriteSystem System;
3333
rewriting::EquivalenceClassMap Map;
3434
CanGenericSignature Sig;
@@ -45,7 +45,7 @@ struct RequirementMachine::Implementation {
4545
std::vector<std::pair<CanType, ConformanceAccessPath>>
4646
CurrentConformanceAccessPaths;
4747

48-
explicit Implementation(ASTContext &ctx)
48+
explicit Implementation(rewriting::RewriteContext &ctx)
4949
: Context(ctx),
5050
System(Context),
5151
Map(Context, System.getProtocols()) {}

0 commit comments

Comments
 (0)