Skip to content

Commit b0fd4c3

Browse files
Merge pull request #61408 from nate-chandler/rdar99618502
[CanonicalizeOSSALifetime] Used PrunedLiveness to find boundary.
2 parents 7b58e41 + 4fc42a6 commit b0fd4c3

15 files changed

+310
-284
lines changed

include/swift/SILOptimizer/Utils/CanonicalOSSALifetime.h renamed to include/swift/SILOptimizer/Utils/CanonicalizeOSSALifetime.h

Lines changed: 7 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//===--- CanonicalOSSALifetime.h - Canonicalize OSSA lifetimes --*- C++ -*-===//
1+
//===- CanonicalizeOSSALifetime.h - Canonicalize OSSA lifetimes -*- C++ -*-===//
22
//
33
// This source file is part of the Swift.org open source project
44
//
@@ -134,39 +134,10 @@ class CanonicalOSSAConsumeInfo {
134134
/// Map blocks on the lifetime boundary to the last consuming instruction.
135135
llvm::SmallDenseMap<SILBasicBlock *, SILInstruction *, 4> finalBlockConsumes;
136136

137-
/// Record any debug_value instructions found after a final consume.
138-
SmallVector<DebugValueInst *, 8> debugAfterConsume;
139-
140-
/// The set of non-destroy consumes that need to be poisoned. This is
141-
/// determined in two steps. First findOrInsertDestroyInBlock() checks if the
142-
/// lifetime shrank within the block. Second rewriteCopies() checks if the
143-
/// consume is in remnantLiveOutBlock(). Finally injectPoison() inserts new
144-
/// copies and poison destroys for everything in this set.
145-
SmallPtrSetVector<SILInstruction *, 4> needsPoisonConsumes;
146-
147137
public:
148-
void clear() {
149-
finalBlockConsumes.clear();
150-
debugAfterConsume.clear();
151-
needsPoisonConsumes.clear();
152-
}
153-
154-
bool empty() {
155-
return finalBlockConsumes.empty() && debugAfterConsume.empty()
156-
&& needsPoisonConsumes.empty();
157-
}
138+
void clear() { finalBlockConsumes.clear(); }
158139

159-
void recordNeedsPoison(SILInstruction *consume) {
160-
needsPoisonConsumes.insert(consume);
161-
}
162-
163-
bool needsPoison(SILInstruction *consume) const {
164-
return needsPoisonConsumes.count(consume);
165-
}
166-
167-
ArrayRef<SILInstruction *> getNeedsPoisonConsumes() const {
168-
return needsPoisonConsumes.getArrayRef();
169-
}
140+
bool empty() { return finalBlockConsumes.empty(); }
170141

171142
bool hasUnclaimedConsumes() const { return !finalBlockConsumes.empty(); }
172143

@@ -188,21 +159,6 @@ class CanonicalOSSAConsumeInfo {
188159
return false;
189160
}
190161

191-
/// Record a debug_value that is known to be outside pruned liveness. Assumes
192-
/// that instructions are only visited once.
193-
void recordDebugAfterConsume(DebugValueInst *dvi) {
194-
debugAfterConsume.push_back(dvi);
195-
}
196-
197-
void popDebugAfterConsume(DebugValueInst *dvi) {
198-
if (!debugAfterConsume.empty() && debugAfterConsume.back() == dvi)
199-
debugAfterConsume.pop_back();
200-
}
201-
202-
ArrayRef<DebugValueInst *> getDebugInstsAfterConsume() const {
203-
return debugAfterConsume;
204-
}
205-
206162
SWIFT_ASSERT_ONLY_DECL(void dump() const LLVM_ATTRIBUTE_USED);
207163
};
208164

@@ -297,16 +253,6 @@ class CanonicalizeOSSALifetime {
297253
/// repeatedly do use-def walks from destroys).
298254
SmallPtrSet<SILInstruction *, 8> destroys;
299255

300-
/// remnantLiveOutBlocks are part of the original extended lifetime that are
301-
/// not in canonical pruned liveness. There is a path from a PrunedLiveness
302-
/// boundary to an original destroy that passes through a remnant block.
303-
///
304-
/// These blocks would be equivalent to PrunedLiveness::LiveOut if
305-
/// PrunedLiveness were recomputed using all original destroys as interesting
306-
/// uses, minus blocks already marked PrunedLiveness::LiveOut. (Remnant blocks
307-
/// may be in PrunedLiveness::LiveWithin).
308-
SmallSetVector<SILBasicBlock *, 8> remnantLiveOutBlocks;
309-
310256
/// Information about consuming instructions discovered in this canonical OSSA
311257
/// lifetime.
312258
CanonicalOSSAConsumeInfo consumes;
@@ -316,6 +262,7 @@ class CanonicalizeOSSALifetime {
316262
/// be hoisted over to avoid churn and infinite looping.
317263
static bool ignoredByDestroyHoisting(SILInstructionKind kind) {
318264
switch (kind) {
265+
case SILInstructionKind::DebugValueInst:
319266
case SILInstructionKind::DestroyValueInst:
320267
case SILInstructionKind::CopyValueInst:
321268
case SILInstructionKind::BeginBorrowInst:
@@ -368,7 +315,6 @@ class CanonicalizeOSSALifetime {
368315
consumingBlocks.clear();
369316
debugValues.clear();
370317
liveness.clear();
371-
remnantLiveOutBlocks.clear();
372318
}
373319

374320
/// Top-Level API: rewrites copies and destroys within \p def's extended
@@ -388,9 +334,7 @@ class CanonicalizeOSSALifetime {
388334
InstModCallbacks &getCallbacks() { return deleter.getCallbacks(); }
389335

390336
protected:
391-
void recordDebugValue(DebugValueInst *dvi) {
392-
debugValues.insert(dvi);
393-
}
337+
void recordDebugValue(DebugValueInst *dvi) { debugValues.insert(dvi); }
394338

395339
void recordConsumingUse(Operand *use) {
396340
consumingBlocks.insert(use->getUser()->getParent());
@@ -401,12 +345,9 @@ class CanonicalizeOSSALifetime {
401345

402346
void extendLivenessThroughOverlappingAccess();
403347

404-
void findOrInsertDestroyInBlock(SILBasicBlock *bb);
405-
406-
void findOrInsertDestroys();
348+
void findExtendedBoundary(PrunedLivenessBoundary &boundary);
407349

408-
void findOrInsertDestroyOnCFGEdge(SILBasicBlock *predBB,
409-
SILBasicBlock *succBB);
350+
void insertDestroysOnBoundary(PrunedLivenessBoundary &boundary);
410351

411352
void rewriteCopies();
412353
};

lib/SILOptimizer/Mandatory/MoveKillsCopyableAddressesChecker.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@
161161
#include "swift/SILOptimizer/Analysis/LoopAnalysis.h"
162162
#include "swift/SILOptimizer/PassManager/Transforms.h"
163163
#include "swift/SILOptimizer/Utils/CFGOptUtils.h"
164-
#include "swift/SILOptimizer/Utils/CanonicalOSSALifetime.h"
164+
#include "swift/SILOptimizer/Utils/CanonicalizeOSSALifetime.h"
165165
#include "swift/SILOptimizer/Utils/InstOptUtils.h"
166166
#include "swift/SILOptimizer/Utils/SILOptFunctionBuilder.h"
167167
#include "swift/SILOptimizer/Utils/SpecializationMangler.h"

lib/SILOptimizer/Mandatory/MoveKillsCopyableValuesChecker.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
#include "swift/SILOptimizer/Analysis/LoopAnalysis.h"
3131
#include "swift/SILOptimizer/PassManager/Transforms.h"
3232
#include "swift/SILOptimizer/Utils/CFGOptUtils.h"
33-
#include "swift/SILOptimizer/Utils/CanonicalOSSALifetime.h"
33+
#include "swift/SILOptimizer/Utils/CanonicalizeOSSALifetime.h"
3434

3535
using namespace swift;
3636

lib/SILOptimizer/Mandatory/MoveOnlyAddressChecker.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@
141141
#include "swift/SILOptimizer/Analysis/NonLocalAccessBlockAnalysis.h"
142142
#include "swift/SILOptimizer/Analysis/PostOrderAnalysis.h"
143143
#include "swift/SILOptimizer/PassManager/Transforms.h"
144-
#include "swift/SILOptimizer/Utils/CanonicalOSSALifetime.h"
144+
#include "swift/SILOptimizer/Utils/CanonicalizeOSSALifetime.h"
145145
#include "swift/SILOptimizer/Utils/InstructionDeleter.h"
146146
#include "llvm/ADT/DenseMap.h"
147147
#include "llvm/ADT/PointerIntPair.h"

lib/SILOptimizer/Mandatory/MoveOnlyObjectChecker.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
#include "swift/SILOptimizer/Analysis/NonLocalAccessBlockAnalysis.h"
3232
#include "swift/SILOptimizer/Analysis/PostOrderAnalysis.h"
3333
#include "swift/SILOptimizer/PassManager/Transforms.h"
34-
#include "swift/SILOptimizer/Utils/CanonicalOSSALifetime.h"
34+
#include "swift/SILOptimizer/Utils/CanonicalizeOSSALifetime.h"
3535
#include "swift/SILOptimizer/Utils/InstructionDeleter.h"
3636
#include "llvm/ADT/PointerIntPair.h"
3737
#include "llvm/ADT/PointerUnion.h"

lib/SILOptimizer/Mandatory/MoveOnlyWrappedTypeEliminator.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
#include "swift/SILOptimizer/Analysis/NonLocalAccessBlockAnalysis.h"
4040
#include "swift/SILOptimizer/Analysis/PostOrderAnalysis.h"
4141
#include "swift/SILOptimizer/PassManager/Transforms.h"
42-
#include "swift/SILOptimizer/Utils/CanonicalOSSALifetime.h"
42+
#include "swift/SILOptimizer/Utils/CanonicalizeOSSALifetime.h"
4343

4444
using namespace swift;
4545

lib/SILOptimizer/SILCombiner/SILCombine.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@
3333
#include "swift/SILOptimizer/Analysis/SimplifyInstruction.h"
3434
#include "swift/SILOptimizer/PassManager/PassManager.h"
3535
#include "swift/SILOptimizer/PassManager/Transforms.h"
36-
#include "swift/SILOptimizer/Utils/CanonicalOSSALifetime.h"
3736
#include "swift/SILOptimizer/Utils/CanonicalizeBorrowScope.h"
3837
#include "swift/SILOptimizer/Utils/CanonicalizeInstruction.h"
38+
#include "swift/SILOptimizer/Utils/CanonicalizeOSSALifetime.h"
3939
#include "swift/SILOptimizer/Utils/DebugOptUtils.h"
4040
#include "swift/SILOptimizer/Utils/InstOptUtils.h"
4141
#include "swift/SILOptimizer/Utils/SILOptFunctionBuilder.h"

lib/SILOptimizer/Transforms/CopyPropagation.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@
4646
#include "swift/SILOptimizer/Analysis/DeadEndBlocksAnalysis.h"
4747
#include "swift/SILOptimizer/PassManager/Passes.h"
4848
#include "swift/SILOptimizer/PassManager/Transforms.h"
49-
#include "swift/SILOptimizer/Utils/CanonicalOSSALifetime.h"
5049
#include "swift/SILOptimizer/Utils/CanonicalizeBorrowScope.h"
50+
#include "swift/SILOptimizer/Utils/CanonicalizeOSSALifetime.h"
5151
#include "swift/SILOptimizer/Utils/InstOptUtils.h"
5252
#include "llvm/ADT/SetVector.h"
5353

@@ -306,7 +306,7 @@ static void findPreheadersOnControlEquivalentPath(
306306
/// Sink \p ownedForward to its uses.
307307
///
308308
/// Owned forwarding instructions are identified by
309-
/// CanonicalOSSALifetime::isRewritableOSSAForward().
309+
/// CanonicalizeOSSALifetime::isRewritableOSSAForward().
310310
///
311311
/// Assumes that the uses of ownedForward jointly postdominate it (valid OSSA).
312312
///

lib/SILOptimizer/Utils/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ target_sources(swiftSILOptimizer PRIVATE
22
BasicBlockOptUtils.cpp
33
CFGOptUtils.cpp
44
CanonicalizeInstruction.cpp
5-
CanonicalOSSALifetime.cpp
5+
CanonicalizeOSSALifetime.cpp
66
CanonicalizeBorrowScope.cpp
77
CastOptimizer.cpp
88
CheckedCastBrJumpThreading.cpp

lib/SILOptimizer/Utils/CanonicalizeBorrowScope.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
#include "swift/SIL/InstructionUtils.h"
2828
#include "swift/SIL/OwnershipUtils.h"
2929
#include "swift/SILOptimizer/Utils/CFGOptUtils.h"
30-
#include "swift/SILOptimizer/Utils/CanonicalOSSALifetime.h"
30+
#include "swift/SILOptimizer/Utils/CanonicalizeOSSALifetime.h"
3131
#include "swift/SILOptimizer/Utils/DebugOptUtils.h"
3232
#include "swift/SILOptimizer/Utils/InstructionDeleter.h"
3333
#include "swift/SILOptimizer/Utils/ValueLifetime.h"

0 commit comments

Comments
 (0)