@@ -225,12 +225,27 @@ class DeinitBarriers {
225
225
const KnownStorageUses &knownUses;
226
226
SILInstruction *storageDefInst = nullptr ;
227
227
228
+ enum class Classification { DeadUser, Barrier, Other };
229
+
230
+ Classification classifyInstruction (SILInstruction *inst) {
231
+ return classifyInstruction (inst, ignoreDeinitBarriers, storageDefInst,
232
+ knownUses);
233
+ }
234
+
235
+ static Classification classifyInstruction (SILInstruction *inst,
236
+ bool ignoreDeinitBarriers,
237
+ SILInstruction *storageDefInst,
238
+ const KnownStorageUses &knownUses);
239
+
240
+ void visitedInstruction (SILInstruction *instruction,
241
+ Classification classification);
242
+
243
+ static bool classificationIsBarrier (Classification classification);
244
+
228
245
// Implements BackwardReachability::BlockReachability
229
246
class DestroyReachability {
230
247
DeinitBarriers &result;
231
248
232
- enum class Classification { DeadUser, Barrier, Other };
233
-
234
249
BackwardReachability<DestroyReachability> reachability;
235
250
236
251
public:
@@ -254,13 +269,6 @@ class DeinitBarriers {
254
269
result.destroyReachesEndBlocks .insert (block);
255
270
}
256
271
257
- Classification classifyInstruction (SILInstruction *inst);
258
-
259
- bool classificationIsBarrier (Classification classification);
260
-
261
- void visitedInstruction (SILInstruction *instruction,
262
- Classification classification);
263
-
264
272
bool checkReachableBarrier (SILInstruction *);
265
273
266
274
bool checkReachablePhiBarrier (SILBasicBlock *);
@@ -269,25 +277,25 @@ class DeinitBarriers {
269
277
};
270
278
};
271
279
272
- DeinitBarriers::DestroyReachability::Classification
273
- DeinitBarriers::DestroyReachability::classifyInstruction (SILInstruction *inst) {
274
- if (result.knownUses .debugInsts .contains (inst)) {
280
+ DeinitBarriers::Classification DeinitBarriers::classifyInstruction (
281
+ SILInstruction *inst, bool ignoreDeinitBarriers,
282
+ SILInstruction *storageDefInst, const KnownStorageUses &knownUses) {
283
+ if (knownUses.debugInsts .contains (inst)) {
275
284
return Classification::DeadUser;
276
285
}
277
- if (inst == result. storageDefInst ) {
286
+ if (inst == storageDefInst) {
278
287
return Classification::Barrier;
279
288
}
280
- if (result. knownUses .storageUsers .contains (inst)) {
289
+ if (knownUses.storageUsers .contains (inst)) {
281
290
return Classification::Barrier;
282
291
}
283
- if (!result. ignoreDeinitBarriers && isDeinitBarrier (inst)) {
292
+ if (!ignoreDeinitBarriers && isDeinitBarrier (inst)) {
284
293
return Classification::Barrier;
285
294
}
286
295
return Classification::Other;
287
296
}
288
297
289
- bool DeinitBarriers::DestroyReachability::classificationIsBarrier (
290
- Classification classification) {
298
+ bool DeinitBarriers::classificationIsBarrier (Classification classification) {
291
299
switch (classification) {
292
300
case Classification::DeadUser:
293
301
case Classification::Other:
@@ -298,15 +306,15 @@ bool DeinitBarriers::DestroyReachability::classificationIsBarrier(
298
306
llvm_unreachable (" exhaustive switch is not exhaustive?!" );
299
307
}
300
308
301
- void DeinitBarriers::DestroyReachability:: visitedInstruction (
302
- SILInstruction *instruction, Classification classification) {
309
+ void DeinitBarriers::visitedInstruction (SILInstruction *instruction,
310
+ Classification classification) {
303
311
assert (classifyInstruction (instruction) == classification);
304
312
switch (classification) {
305
313
case Classification::DeadUser:
306
- result. deadUsers .push_back (instruction);
314
+ deadUsers.push_back (instruction);
307
315
break ;
308
316
case Classification::Barrier:
309
- result. barriers .push_back (instruction);
317
+ barriers.push_back (instruction);
310
318
break ;
311
319
case Classification::Other:
312
320
break ;
@@ -321,18 +329,18 @@ void DeinitBarriers::DestroyReachability::visitedInstruction(
321
329
// / which is a storageUser and therefore a barrier.
322
330
bool DeinitBarriers::DestroyReachability::checkReachableBarrier (
323
331
SILInstruction *instruction) {
324
- auto classification = classifyInstruction (instruction);
325
- visitedInstruction (instruction, classification);
326
- return classificationIsBarrier (classification);
332
+ auto classification = result. classifyInstruction (instruction);
333
+ result. visitedInstruction (instruction, classification);
334
+ return result. classificationIsBarrier (classification);
327
335
}
328
336
329
337
bool DeinitBarriers::DestroyReachability::checkReachablePhiBarrier (
330
338
SILBasicBlock *block) {
331
339
assert (llvm::all_of (block->getArguments (),
332
340
[&](auto argument) { return PhiValue (argument); }));
333
341
return llvm::any_of (block->getPredecessorBlocks (), [&](auto *predecessor) {
334
- return classificationIsBarrier (
335
- classifyInstruction (predecessor->getTerminator ()));
342
+ return result. classificationIsBarrier (
343
+ result. classifyInstruction (predecessor->getTerminator ()));
336
344
});
337
345
}
338
346
0 commit comments