@@ -155,6 +155,9 @@ static void splitConcreteEquivalenceClasses(
155
155
TypeArrayView<GenericTypeParamType> genericParams,
156
156
SmallVectorImpl<StructuralRequirement> &splitRequirements,
157
157
unsigned &attempt) {
158
+ bool debug = machine->getDebugOptions ().contains (
159
+ DebugFlags::SplitConcreteEquivalenceClass);
160
+
158
161
unsigned maxAttempts =
159
162
ctx.LangOpts .RequirementMachineMaxSplitConcreteEquivClassAttempts ;
160
163
@@ -172,6 +175,10 @@ static void splitConcreteEquivalenceClasses(
172
175
173
176
splitRequirements.clear ();
174
177
178
+ if (debug) {
179
+ llvm::dbgs () << " \n # Splitting concrete equivalence classes:\n " ;
180
+ }
181
+
175
182
for (auto req : requirements) {
176
183
if (shouldSplitConcreteEquivalenceClass (req, proto, machine)) {
177
184
auto concreteType = machine->getConcreteType (
@@ -183,10 +190,24 @@ static void splitConcreteEquivalenceClasses(
183
190
req.getSecondType (), concreteType);
184
191
splitRequirements.push_back ({firstReq, SourceLoc (), /* inferred=*/ false });
185
192
splitRequirements.push_back ({secondReq, SourceLoc (), /* inferred=*/ false });
193
+
194
+ if (debug) {
195
+ llvm::dbgs () << " - First split: " ;
196
+ firstReq.dump (llvm::dbgs ());
197
+ llvm::dbgs () << " \n - Second split: " ;
198
+ secondReq.dump (llvm::dbgs ());
199
+ llvm::dbgs () << " \n " ;
200
+ }
186
201
continue ;
187
202
}
188
203
189
204
splitRequirements.push_back ({req, SourceLoc (), /* inferred=*/ false });
205
+
206
+ if (debug) {
207
+ llvm::dbgs () << " - Not split: " ;
208
+ req.dump (llvm::dbgs ());
209
+ llvm::dbgs () << " \n " ;
210
+ }
190
211
}
191
212
}
192
213
@@ -299,20 +320,6 @@ RequirementSignatureRequest::evaluate(Evaluator &evaluator,
299
320
requirements.push_back (req);
300
321
for (auto req : proto->getTypeAliasRequirements ())
301
322
requirements.push_back ({req, SourceLoc (), /* inferred=*/ false });
302
-
303
- // Preprocess requirements to eliminate conformances on type parameters
304
- // which are made concrete.
305
- if (ctx.LangOpts .EnableRequirementMachineConcreteContraction ) {
306
- SmallVector<StructuralRequirement, 4 > contractedRequirements;
307
-
308
- bool debug = rewriteCtx.getDebugOptions ()
309
- .contains (DebugFlags::ConcreteContraction);
310
-
311
- if (performConcreteContraction (requirements, contractedRequirements,
312
- errors, debug)) {
313
- std::swap (contractedRequirements, requirements);
314
- }
315
- }
316
323
}
317
324
318
325
if (rewriteCtx.getDebugOptions ().contains (DebugFlags::Timers)) {
@@ -335,6 +342,24 @@ RequirementSignatureRequest::evaluate(Evaluator &evaluator,
335
342
336
343
unsigned attempt = 0 ;
337
344
for (;;) {
345
+ for (const auto *proto : component) {
346
+ auto &requirements = protos[proto];
347
+
348
+ // Preprocess requirements to eliminate conformances on type parameters
349
+ // which are made concrete.
350
+ if (ctx.LangOpts .EnableRequirementMachineConcreteContraction ) {
351
+ SmallVector<StructuralRequirement, 4 > contractedRequirements;
352
+
353
+ bool debug = rewriteCtx.getDebugOptions ()
354
+ .contains (DebugFlags::ConcreteContraction);
355
+
356
+ if (performConcreteContraction (requirements, contractedRequirements,
357
+ errors, debug)) {
358
+ std::swap (contractedRequirements, requirements);
359
+ }
360
+ }
361
+ }
362
+
338
363
// Heap-allocate the requirement machine to save stack space.
339
364
std::unique_ptr<RequirementMachine> machine (new RequirementMachine (
340
365
rewriteCtx));
@@ -639,20 +664,20 @@ AbstractGenericSignatureRequest::evaluate(
639
664
llvm::dbgs () << " \n " ;
640
665
}
641
666
642
- // Preprocess requirements to eliminate conformances on generic parameters
643
- // which are made concrete.
644
- if (ctx.LangOpts .EnableRequirementMachineConcreteContraction ) {
645
- SmallVector<StructuralRequirement, 4 > contractedRequirements;
646
- bool debug = rewriteCtx.getDebugOptions ()
647
- .contains (DebugFlags::ConcreteContraction);
648
- if (performConcreteContraction (requirements, contractedRequirements,
649
- errors, debug)) {
650
- std::swap (contractedRequirements, requirements);
651
- }
652
- }
653
-
654
667
unsigned attempt = 0 ;
655
668
for (;;) {
669
+ // Preprocess requirements to eliminate conformances on generic parameters
670
+ // which are made concrete.
671
+ if (ctx.LangOpts .EnableRequirementMachineConcreteContraction ) {
672
+ SmallVector<StructuralRequirement, 4 > contractedRequirements;
673
+ bool debug = rewriteCtx.getDebugOptions ()
674
+ .contains (DebugFlags::ConcreteContraction);
675
+ if (performConcreteContraction (requirements, contractedRequirements,
676
+ errors, debug)) {
677
+ std::swap (contractedRequirements, requirements);
678
+ }
679
+ }
680
+
656
681
// Heap-allocate the requirement machine to save stack space.
657
682
std::unique_ptr<RequirementMachine> machine (new RequirementMachine (
658
683
rewriteCtx));
@@ -834,20 +859,20 @@ InferredGenericSignatureRequest::evaluate(
834
859
llvm::dbgs () << " \n " ;
835
860
}
836
861
837
- // Preprocess requirements to eliminate conformances on generic parameters
838
- // which are made concrete.
839
- if (ctx.LangOpts .EnableRequirementMachineConcreteContraction ) {
840
- SmallVector<StructuralRequirement, 4 > contractedRequirements;
841
- bool debug = rewriteCtx.getDebugOptions ()
842
- .contains (DebugFlags::ConcreteContraction);
843
- if (performConcreteContraction (requirements, contractedRequirements,
844
- errors, debug)) {
845
- std::swap (contractedRequirements, requirements);
846
- }
847
- }
848
-
849
862
unsigned attempt = 0 ;
850
863
for (;;) {
864
+ // Preprocess requirements to eliminate conformances on generic parameters
865
+ // which are made concrete.
866
+ if (ctx.LangOpts .EnableRequirementMachineConcreteContraction ) {
867
+ SmallVector<StructuralRequirement, 4 > contractedRequirements;
868
+ bool debug = rewriteCtx.getDebugOptions ()
869
+ .contains (DebugFlags::ConcreteContraction);
870
+ if (performConcreteContraction (requirements, contractedRequirements,
871
+ errors, debug)) {
872
+ std::swap (contractedRequirements, requirements);
873
+ }
874
+ }
875
+
851
876
// Heap-allocate the requirement machine to save stack space.
852
877
std::unique_ptr<RequirementMachine> machine (new RequirementMachine (
853
878
rewriteCtx));
0 commit comments