Skip to content

Commit d61dad9

Browse files
authored
Merge pull request #18599 from jrose-apple/FABulous
[SIL] Clarify ownership in FunctionAnalysisBase w/ std::unique_ptr
2 parents 1543f15 + 793b335 commit d61dad9

File tree

9 files changed

+37
-33
lines changed

9 files changed

+37
-33
lines changed

include/swift/SILOptimizer/Analysis/Analysis.h

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -174,14 +174,16 @@ class AnalysisPreserver {
174174
/// ```
175175
template <typename FunctionInfoTy>
176176
class FunctionAnalysisBase : public SILAnalysis {
177-
protected:
178-
using StorageTy = llvm::DenseMap<SILFunction *, FunctionInfoTy *>;
177+
using StorageTy = llvm::DenseMap<SILFunction *,
178+
std::unique_ptr<FunctionInfoTy>>;
179179

180180
/// Maps functions to their analysis provider.
181181
StorageTy storage;
182182

183+
protected:
183184
/// Construct a new empty function info for a specific function \p F.
184-
virtual FunctionInfoTy *newFunctionAnalysis(SILFunction *f) = 0;
185+
virtual std::unique_ptr<FunctionInfoTy>
186+
newFunctionAnalysis(SILFunction *f) = 0;
185187

186188
/// Return True if the analysis should be invalidated given trait \K is
187189
/// preserved.
@@ -192,8 +194,6 @@ class FunctionAnalysisBase : public SILAnalysis {
192194
virtual void verify(FunctionInfoTy *funcInfo) const {}
193195

194196
void deleteAllAnalysisProviders() {
195-
for (auto iter : storage)
196-
delete iter.second;
197197
storage.clear();
198198
}
199199

@@ -208,7 +208,7 @@ class FunctionAnalysisBase : public SILAnalysis {
208208
auto iter = storage.find(f);
209209
if (iter == storage.end())
210210
return nullptr;
211-
return iter->second;
211+
return iter->second.get();
212212
}
213213

214214
/// Returns a function info structure for a specific function \p F.
@@ -219,7 +219,7 @@ class FunctionAnalysisBase : public SILAnalysis {
219219
auto &it = storage.FindAndConstruct(f);
220220
if (!it.second)
221221
it.second = newFunctionAnalysis(f);
222-
return it.second;
222+
return it.second.get();
223223
}
224224

225225
/// Invalidate all information in this analysis.
@@ -229,11 +229,7 @@ class FunctionAnalysisBase : public SILAnalysis {
229229

230230
/// Helper function to remove the function info for a specific function.
231231
void invalidateFunction(SILFunction *f) {
232-
auto &it = storage.FindAndConstruct(f);
233-
if (!it.second)
234-
return;
235-
delete it.second;
236-
it.second = nullptr;
232+
storage.erase(f);
237233
}
238234

239235
/// Invalidate all of the information for a specific function.
@@ -269,10 +265,10 @@ class FunctionAnalysisBase : public SILAnalysis {
269265
/// This is not meant to be overridden by subclasses. Instead please override
270266
/// void FunctionAnalysisBase::verify(FunctionInfoTy *fInfo).
271267
virtual void verify() const override final {
272-
for (auto iter : storage) {
273-
if (!iter.second)
268+
for (auto &entry : storage) {
269+
if (!entry.second)
274270
continue;
275-
verify(iter.second);
271+
verify(entry.second.get());
276272
}
277273
}
278274

@@ -287,7 +283,7 @@ class FunctionAnalysisBase : public SILAnalysis {
287283
return;
288284
if (!iter->second)
289285
return;
290-
verify(iter->second);
286+
verify(iter->second.get());
291287
}
292288
};
293289

include/swift/SILOptimizer/Analysis/DominanceAnalysis.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ class DominanceAnalysis : public FunctionAnalysisBase<DominanceInfo> {
4141
return S->getKind() == SILAnalysisKind::Dominance;
4242
}
4343

44-
DominanceInfo *newFunctionAnalysis(SILFunction *F) override {
45-
return new DominanceInfo(F);
44+
std::unique_ptr<DominanceInfo> newFunctionAnalysis(SILFunction *F) override {
45+
return llvm::make_unique<DominanceInfo>(F);
4646
}
4747

4848
virtual bool shouldInvalidate(SILAnalysis::InvalidationKind K) override {
@@ -70,8 +70,9 @@ class PostDominanceAnalysis : public FunctionAnalysisBase<PostDominanceInfo> {
7070
return S->getKind() == SILAnalysisKind::PostDominance;
7171
}
7272

73-
PostDominanceInfo *newFunctionAnalysis(SILFunction *F) override {
74-
return new PostDominanceInfo(F);
73+
std::unique_ptr<PostDominanceInfo>
74+
newFunctionAnalysis(SILFunction *F) override {
75+
return llvm::make_unique<PostDominanceInfo>(F);
7576
}
7677

7778
virtual bool shouldInvalidate(SILAnalysis::InvalidationKind K) override {

include/swift/SILOptimizer/Analysis/EpilogueARCAnalysis.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,8 +300,9 @@ class EpilogueARCAnalysis : public FunctionAnalysisBase<EpilogueARCFunctionInfo>
300300

301301
virtual void initialize(SILPassManager *PM) override;
302302

303-
virtual EpilogueARCFunctionInfo *newFunctionAnalysis(SILFunction *F) override {
304-
return new EpilogueARCFunctionInfo(F, PO, AA, RC);
303+
virtual std::unique_ptr<EpilogueARCFunctionInfo>
304+
newFunctionAnalysis(SILFunction *F) override {
305+
return llvm::make_unique<EpilogueARCFunctionInfo>(F, PO, AA, RC);
305306
}
306307

307308
virtual bool shouldInvalidate(SILAnalysis::InvalidationKind K) override {

include/swift/SILOptimizer/Analysis/IVAnalysis.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@ class IVAnalysis final : public FunctionAnalysisBase<IVInfo> {
9090
return S->getKind() == SILAnalysisKind::InductionVariable;
9191
}
9292

93-
IVInfo *newFunctionAnalysis(SILFunction *F) override {
94-
return new IVInfo(*F);
93+
std::unique_ptr<IVInfo> newFunctionAnalysis(SILFunction *F) override {
94+
return llvm::make_unique<IVInfo>(*F);
9595
}
9696

9797
/// For now we always invalidate.

include/swift/SILOptimizer/Analysis/LoopAnalysis.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ class SILLoopAnalysis : public FunctionAnalysisBase<SILLoopInfo> {
4444

4545
// Computes loop information for the given function using dominance
4646
// information.
47-
virtual SILLoopInfo *newFunctionAnalysis(SILFunction *F) override;
47+
virtual std::unique_ptr<SILLoopInfo>
48+
newFunctionAnalysis(SILFunction *F) override;
4849

4950
virtual void initialize(SILPassManager *PM) override;
5051
};

include/swift/SILOptimizer/Analysis/LoopRegionAnalysis.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1080,8 +1080,10 @@ class LoopRegionAnalysis : public FunctionAnalysisBase<LoopRegionFunctionInfo> {
10801080
return S->getKind() == SILAnalysisKind::LoopRegion;
10811081
}
10821082

1083-
virtual LoopRegionFunctionInfo *newFunctionAnalysis(SILFunction *F) override {
1084-
return new LoopRegionFunctionInfo(F, POA->get(F), SLA->get(F));
1083+
virtual std::unique_ptr<LoopRegionFunctionInfo>
1084+
newFunctionAnalysis(SILFunction *F) override {
1085+
return llvm::make_unique<LoopRegionFunctionInfo>(F, POA->get(F),
1086+
SLA->get(F));
10851087
}
10861088

10871089
virtual bool shouldInvalidate(SILAnalysis::InvalidationKind K) override {

include/swift/SILOptimizer/Analysis/PostOrderAnalysis.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,9 @@ class SILFunction;
3434
/// reform the post order over and over again (it can be expensive).
3535
class PostOrderAnalysis : public FunctionAnalysisBase<PostOrderFunctionInfo> {
3636
protected:
37-
virtual PostOrderFunctionInfo *newFunctionAnalysis(SILFunction *F) override {
38-
return new PostOrderFunctionInfo(F);
37+
virtual std::unique_ptr<PostOrderFunctionInfo>
38+
newFunctionAnalysis(SILFunction *F) override {
39+
return llvm::make_unique<PostOrderFunctionInfo>(F);
3940
}
4041

4142
virtual bool shouldInvalidate(SILAnalysis::InvalidationKind K) override {

include/swift/SILOptimizer/Analysis/RCIdentityAnalysis.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,9 @@ class RCIdentityAnalysis : public FunctionAnalysisBase<RCIdentityFunctionInfo> {
118118

119119
virtual void initialize(SILPassManager *PM) override;
120120

121-
virtual RCIdentityFunctionInfo *newFunctionAnalysis(SILFunction *F) override {
122-
return new RCIdentityFunctionInfo(DA);
121+
virtual std::unique_ptr<RCIdentityFunctionInfo>
122+
newFunctionAnalysis(SILFunction *F) override {
123+
return llvm::make_unique<RCIdentityFunctionInfo>(DA);
123124
}
124125

125126
virtual bool shouldInvalidate(SILAnalysis::InvalidationKind K) override {

lib/SILOptimizer/Analysis/LoopAnalysis.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@
1818

1919
using namespace swift;
2020

21-
SILLoopInfo *SILLoopAnalysis::newFunctionAnalysis(SILFunction *F) {
21+
std::unique_ptr<SILLoopInfo>
22+
SILLoopAnalysis::newFunctionAnalysis(SILFunction *F) {
2223
assert(DA != nullptr && "Expect a valid dominance analysis");
2324
DominanceInfo *DT = DA->get(F);
2425
assert(DT != nullptr && "Expect a valid dominance information");
25-
return new SILLoopInfo(F, DT);
26+
return llvm::make_unique<SILLoopInfo>(F, DT);
2627
}
2728

2829
void SILLoopAnalysis::initialize(SILPassManager *PM) {

0 commit comments

Comments
 (0)