Skip to content

Commit 6bd817c

Browse files
committed
RequirementMachine: Add -debug-requirement-machine=split-concrete-equiv-class flag
1 parent cfb6f8c commit 6bd817c

File tree

3 files changed

+26
-0
lines changed

3 files changed

+26
-0
lines changed

lib/AST/RequirementMachine/Debug.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ enum class DebugFlags : unsigned {
7878

7979
/// Print conflicting rules.
8080
ConflictingRules = (1<<18),
81+
82+
/// Print debug output from concrete equivalence class splitting during
83+
/// minimization.
84+
SplitConcreteEquivalenceClass = (1<<19),
8185
};
8286

8387
using DebugOptions = OptionSet<DebugFlags>;

lib/AST/RequirementMachine/RequirementMachineRequests.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,9 @@ static void splitConcreteEquivalenceClasses(
155155
TypeArrayView<GenericTypeParamType> genericParams,
156156
SmallVectorImpl<StructuralRequirement> &splitRequirements,
157157
unsigned &attempt) {
158+
bool debug = machine->getDebugOptions().contains(
159+
DebugFlags::SplitConcreteEquivalenceClass);
160+
158161
unsigned maxAttempts =
159162
ctx.LangOpts.RequirementMachineMaxSplitConcreteEquivClassAttempts;
160163

@@ -172,6 +175,10 @@ static void splitConcreteEquivalenceClasses(
172175

173176
splitRequirements.clear();
174177

178+
if (debug) {
179+
llvm::dbgs() << "\n# Splitting concrete equivalence classes:\n";
180+
}
181+
175182
for (auto req : requirements) {
176183
if (shouldSplitConcreteEquivalenceClass(req, proto, machine)) {
177184
auto concreteType = machine->getConcreteType(
@@ -183,10 +190,24 @@ static void splitConcreteEquivalenceClasses(
183190
req.getSecondType(), concreteType);
184191
splitRequirements.push_back({firstReq, SourceLoc(), /*inferred=*/false});
185192
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+
}
186201
continue;
187202
}
188203

189204
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+
}
190211
}
191212
}
192213

lib/AST/RequirementMachine/RewriteContext.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ static DebugOptions parseDebugFlags(StringRef debugFlags) {
179179
.Case("propagate-requirement-ids", DebugFlags::PropagateRequirementIDs)
180180
.Case("timers", DebugFlags::Timers)
181181
.Case("conflicting-rules", DebugFlags::ConflictingRules)
182+
.Case("split-concrete-equiv-class", DebugFlags::SplitConcreteEquivalenceClass)
182183
.Default(None);
183184
if (!flag) {
184185
llvm::errs() << "Unknown debug flag in -debug-requirement-machine "

0 commit comments

Comments
 (0)