Skip to content

Commit 0b2b9a3

Browse files
Merge pull request swiftlang#59057 from nate-chandler/perf/20220524/use-setvector-for-gens
[SILOpt] Used SetVector for fast contains check.
2 parents ebd04d8 + 8775148 commit 0b2b9a3

File tree

4 files changed

+13
-16
lines changed

4 files changed

+13
-16
lines changed

include/swift/SILOptimizer/Analysis/Reachability.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ class BackwardReachability {
149149
/// Effect effectForPhi(SILBasicBlock *);
150150
///
151151
/// /// The uses from which reachability will begin.
152-
/// ArrayRef<SILInstruction *> gens();
152+
/// iterable gens();
153153
/// }
154154
template <typename Effects>
155155
class IterativeBackwardReachability final {

lib/SILOptimizer/Transforms/SSADestroyHoisting.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ struct KnownStorageUses : UniqueStorageUseVisitor {
111111
bool preserveDebugInfo;
112112

113113
SmallPtrSet<SILInstruction *, 16> storageUsers;
114-
SmallVector<SILInstruction *, 4> originalDestroys;
114+
SmallSetVector<SILInstruction *, 4> originalDestroys;
115115
SmallPtrSet<SILInstruction *, 4> debugInsts;
116116

117117
KnownStorageUses(AccessStorage storage, SILFunction *function)
@@ -158,7 +158,7 @@ struct KnownStorageUses : UniqueStorageUseVisitor {
158158
bool visitStore(Operand *use) override { return recordUser(use->getUser()); }
159159

160160
bool visitDestroy(Operand *use) override {
161-
originalDestroys.push_back(use->getUser());
161+
originalDestroys.insert(use->getUser());
162162
return true;
163163
}
164164

@@ -283,9 +283,7 @@ class DeinitBarriers final {
283283
/// IterativeBackwardReachability::Effects
284284
/// VisitBarrierAccessScopes::Effects
285285

286-
ArrayRef<SILInstruction *> gens() {
287-
return result.knownUses.originalDestroys;
288-
}
286+
auto gens() { return result.knownUses.originalDestroys; }
289287

290288
Effect effectForInstruction(SILInstruction *instruction);
291289

@@ -366,8 +364,7 @@ bool DeinitBarriers::classificationIsBarrier(Classification classification) {
366364
DeinitBarriers::DestroyReachability::Effect
367365
DeinitBarriers::DestroyReachability::effectForInstruction(
368366
SILInstruction *instruction) {
369-
if (llvm::find(result.knownUses.originalDestroys, instruction) !=
370-
result.knownUses.originalDestroys.end())
367+
if (result.knownUses.originalDestroys.contains(instruction))
371368
return Effect::Gen();
372369
auto classification = result.classifyInstruction(instruction);
373370
if (recordDeadUsers && classification == Classification::DeadUser)

lib/SILOptimizer/Utils/LexicalDestroyHoisting.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ struct Usage final {
6767
/// Instructions which are users of the simple (i.e. not reborrowed) value.
6868
SmallPtrSet<SILInstruction *, 16> users;
6969
// The instructions from which the hoisting starts, the destroy_values.
70-
llvm::SmallVector<SILInstruction *, 4> ends;
70+
llvm::SmallSetVector<SILInstruction *, 4> ends;
7171

7272
Usage(){};
7373
Usage(Usage const &) = delete;
@@ -89,7 +89,7 @@ bool findUsage(Context const &context, Usage &usage) {
8989
// flow and determine whether any were reused. They aren't uses over which
9090
// we can't hoist though.
9191
if (isa<DestroyValueInst>(use->getUser())) {
92-
usage.ends.push_back(use->getUser());
92+
usage.ends.insert(use->getUser());
9393
} else {
9494
usage.users.insert(use->getUser());
9595
}
@@ -155,7 +155,7 @@ class Dataflow final {
155155
/// IterativeBackwardReachability::Effects
156156
/// VisitBarrierAccessScopes::Effects
157157

158-
ArrayRef<SILInstruction *> gens() { return uses.ends; }
158+
auto gens() { return uses.ends; }
159159

160160
Effect effectForInstruction(SILInstruction *);
161161
Effect effectForPhi(SILBasicBlock *);
@@ -211,7 +211,7 @@ bool Dataflow::classificationIsBarrier(Classification classification) {
211211
}
212212

213213
Dataflow::Effect Dataflow::effectForInstruction(SILInstruction *instruction) {
214-
if (llvm::find(uses.ends, instruction) != uses.ends.end())
214+
if (uses.ends.contains(instruction))
215215
return Effect::Gen();
216216
auto classification = classifyInstruction(instruction);
217217
return classificationIsBarrier(classification) ? Effect::Kill()

lib/SILOptimizer/Utils/ShrinkBorrowScope.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ struct Usage final {
7979
SmallPtrSet<SILInstruction *, 16> users;
8080
// The instructions from which the shrinking starts, the scope ending
8181
// instructions.
82-
llvm::SmallVector<SILInstruction *, 4> ends;
82+
llvm::SmallSetVector<SILInstruction *, 4> ends;
8383

8484
Usage(){};
8585
Usage(Usage const &) = delete;
@@ -99,7 +99,7 @@ bool findUsage(Context const &context, Usage &usage) {
9999
// If a scope ending instruction is not an end_borrow, bail out.
100100
if (!isa<EndBorrowInst>(instruction))
101101
return false;
102-
usage.ends.push_back(instruction);
102+
usage.ends.insert(instruction);
103103
}
104104

105105
SmallVector<Operand *, 16> uses;
@@ -181,7 +181,7 @@ class Dataflow final {
181181
/// IterativeBackwardReachability::Effects
182182
/// VisitBarrierAccessScopes::Effects
183183

184-
ArrayRef<SILInstruction *> gens() { return uses.ends; }
184+
auto gens() { return uses.ends; }
185185

186186
Effect effectForInstruction(SILInstruction *);
187187

@@ -262,7 +262,7 @@ bool Dataflow::classificationIsBarrier(Classification classification) {
262262
}
263263

264264
Dataflow::Effect Dataflow::effectForInstruction(SILInstruction *instruction) {
265-
if (llvm::find(uses.ends, instruction) != uses.ends.end())
265+
if (uses.ends.contains(instruction))
266266
return Effect::Gen();
267267
auto classification = classifyInstruction(instruction);
268268
if (recordCopies && classification == Classification::Copy)

0 commit comments

Comments
 (0)