Skip to content

Commit ff3df20

Browse files
committed
[arc] Wire up ProgramTerminationFunctionInfo into ARCSequenceOpts.
1 parent 05ac596 commit ff3df20

10 files changed

+51
-43
lines changed

lib/SILPasses/ARC/ARCBBState.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,6 @@ void ARCBBState::initPredTopDown(ARCBBState &PredBBState) {
140140
PtrToTopDownState = PredBBState.PtrToTopDownState;
141141
}
142142

143-
void ARCBBState::initializeTrapStatus() { IsTrapBB = isARCInertTrapBB(BB); }
144-
145143
//===----------------------------------------------------------------------===//
146144
// ARCBBStateInfo
147145
//===----------------------------------------------------------------------===//
@@ -153,7 +151,8 @@ using ARCBBStateInfoHandle = ARCSequenceDataflowEvaluator::ARCBBStateInfoHandle;
153151

154152
} // end anonymous namespace
155153

156-
ARCBBStateInfo::ARCBBStateInfo(SILFunction *F, PostOrderAnalysis *POA)
154+
ARCBBStateInfo::ARCBBStateInfo(SILFunction *F, PostOrderAnalysis *POA,
155+
ProgramTerminationFunctionInfo *PTFI)
157156
: BBToBBIDMap(), BBIDToBottomUpBBStateMap(POA->get(F)->size()),
158157
BBIDToTopDownBBStateMap(POA->get(F)->size()), BackedgeMap() {
159158

@@ -164,8 +163,9 @@ ARCBBStateInfo::ARCBBStateInfo(SILFunction *F, PostOrderAnalysis *POA)
164163
unsigned BBID = BBToBBIDMap.size();
165164
BBToBBIDMap[BB] = BBID;
166165

167-
BBIDToBottomUpBBStateMap[BBID].init(BB);
168-
BBIDToTopDownBBStateMap[BBID].init(BB);
166+
bool IsLeakingBB = PTFI->isProgramTerminatingBlock(BB);
167+
BBIDToBottomUpBBStateMap[BBID].init(BB, IsLeakingBB);
168+
BBIDToTopDownBBStateMap[BBID].init(BB, IsLeakingBB);
169169

170170
for (auto &Succ : BB->getSuccessors())
171171
if (SILBasicBlock *SuccBB = Succ.getBB())

lib/SILPasses/ARC/ARCBBState.h

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,10 @@ class ARCSequenceDataflowEvaluator::ARCBBState {
4242
ARCBBState() : BB() {}
4343
ARCBBState(SILBasicBlock *BB) : BB(BB) {}
4444

45-
void init(SILBasicBlock *NewBB) {
45+
void init(SILBasicBlock *NewBB, bool NewIsTrapBB) {
4646
assert(NewBB && "Cannot set NewBB to a nullptr.");
4747
BB = NewBB;
48-
IsTrapBB = false;
49-
initializeTrapStatus();
48+
IsTrapBB = NewIsTrapBB;
5049
}
5150

5251
/// Is this BB a BB that fits the canonical form of a trap?
@@ -138,9 +137,6 @@ class ARCSequenceDataflowEvaluator::ARCBBState {
138137
/// BB. Used to create an initial state before we merge in other
139138
/// predecessors. This is currently a stub.
140139
void initPredTopDown(ARCBBState &PredBB);
141-
142-
private:
143-
void initializeTrapStatus();
144140
};
145141

146142
class ARCSequenceDataflowEvaluator::ARCBBStateInfoHandle {
@@ -191,7 +187,8 @@ class ARCSequenceDataflowEvaluator::ARCBBStateInfo {
191187
BackedgeMap;
192188

193189
public:
194-
ARCBBStateInfo(SILFunction *F, PostOrderAnalysis *POTA);
190+
ARCBBStateInfo(SILFunction *F, PostOrderAnalysis *POTA,
191+
ProgramTerminationFunctionInfo *PTFI);
195192

196193
llvm::Optional<ARCBBStateInfoHandle> getBottomUpBBHandle(SILBasicBlock *BB);
197194
llvm::Optional<ARCBBStateInfoHandle> getTopDownBBHandle(SILBasicBlock *BB);

lib/SILPasses/ARC/ARCRegionState.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,9 @@ using namespace swift;
2525
// ARCRegionState
2626
//===----------------------------------------------------------------------===//
2727

28-
ARCRegionState::ARCRegionState(LoopRegion *R)
29-
: Region(R), PtrToTopDownState(), PtrToBottomUpState(), AllowsLeaks(false) {
30-
if (R->isBlock())
31-
AllowsLeaks = isARCInertTrapBB(R->getBlock());
32-
}
28+
ARCRegionState::ARCRegionState(LoopRegion *R, bool AllowsLeaks)
29+
: Region(R), PtrToTopDownState(), PtrToBottomUpState(),
30+
AllowsLeaks(AllowsLeaks) {}
3331

3432
//===---
3533
// Bottom Up Merge

lib/SILPasses/ARC/ARCRegionState.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class ARCRegionState {
6565
llvm::SmallVector<SILInstruction *, 4> SummarizedInterestingInsts;
6666

6767
public:
68-
ARCRegionState(LoopRegion *R);
68+
ARCRegionState(LoopRegion *R, bool AllowsLeaks);
6969

7070
/// Is this Region from which we can leak memory safely?
7171
bool allowsLeaks() const { return AllowsLeaks; }

lib/SILPasses/ARC/ARCSequenceOpts.cpp

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "swift/SILAnalysis/ARCAnalysis.h"
2323
#include "swift/SILAnalysis/AliasAnalysis.h"
2424
#include "swift/SILAnalysis/PostOrderAnalysis.h"
25+
#include "swift/SILAnalysis/ProgramTerminationAnalysis.h"
2526
#include "swift/SILAnalysis/RCIdentityAnalysis.h"
2627
#include "swift/SILAnalysis/LoopRegionAnalysis.h"
2728
#include "swift/SILAnalysis/LoopAnalysis.h"
@@ -141,11 +142,11 @@ void CodeMotionOrDeleteCallback::processMatchingSet(ARCMatchingSet &MatchSet) {
141142
// Non Loop Optimizer
142143
//===----------------------------------------------------------------------===//
143144

144-
static bool processFunctionWithoutLoopSupport(SILFunction &F,
145-
bool FreezePostDomReleases,
146-
AliasAnalysis *AA,
147-
PostOrderAnalysis *POTA,
148-
RCIdentityFunctionInfo *RCIA) {
145+
static bool
146+
processFunctionWithoutLoopSupport(SILFunction &F, bool FreezePostDomReleases,
147+
AliasAnalysis *AA, PostOrderAnalysis *POTA,
148+
RCIdentityFunctionInfo *RCIA,
149+
ProgramTerminationFunctionInfo *PTFI) {
149150
// GlobalARCOpts seems to be taking up a lot of compile time when running on
150151
// globalinit_func. Since that is not *that* interesting from an ARC
151152
// perspective (i.e. no ref count operations in a loop), disable it on such
@@ -156,7 +157,7 @@ static bool processFunctionWithoutLoopSupport(SILFunction &F,
156157
DEBUG(llvm::dbgs() << "***** Processing " << F.getName() << " *****\n");
157158

158159
bool Changed = false;
159-
BlockARCPairingContext Context(F, AA, POTA, RCIA);
160+
BlockARCPairingContext Context(F, AA, POTA, RCIA, PTFI);
160161
CodeMotionOrDeleteCallback Callback;
161162
// Until we do not remove any instructions or have nested increments,
162163
// decrements...
@@ -190,11 +191,10 @@ static bool processFunctionWithoutLoopSupport(SILFunction &F,
190191
// Loop Optimizer
191192
//===----------------------------------------------------------------------===//
192193

193-
static bool
194-
processFunctionWithLoopSupport(SILFunction &F, bool FreezePostDomReleases,
195-
AliasAnalysis *AA, PostOrderAnalysis *POTA,
196-
LoopRegionFunctionInfo *LRFI, SILLoopInfo *LI,
197-
RCIdentityFunctionInfo *RCFI) {
194+
static bool processFunctionWithLoopSupport(
195+
SILFunction &F, bool FreezePostDomReleases, AliasAnalysis *AA,
196+
PostOrderAnalysis *POTA, LoopRegionFunctionInfo *LRFI, SILLoopInfo *LI,
197+
RCIdentityFunctionInfo *RCFI, ProgramTerminationFunctionInfo *PTFI) {
198198
// GlobalARCOpts seems to be taking up a lot of compile time when running on
199199
// globalinit_func. Since that is not *that* interesting from an ARC
200200
// perspective (i.e. no ref count operations in a loop), disable it on such
@@ -204,7 +204,7 @@ processFunctionWithLoopSupport(SILFunction &F, bool FreezePostDomReleases,
204204

205205
DEBUG(llvm::dbgs() << "***** Processing " << F.getName() << " *****\n");
206206

207-
LoopARCPairingContext Context(F, AA, LRFI, LI, RCFI);
207+
LoopARCPairingContext Context(F, AA, LRFI, LI, RCFI, PTFI);
208208
return Context.process(FreezePostDomReleases);
209209
}
210210

@@ -226,9 +226,10 @@ class ARCSequenceOpts : public SILFunctionTransform {
226226
auto *AA = getAnalysis<AliasAnalysis>();
227227
auto *POTA = getAnalysis<PostOrderAnalysis>();
228228
auto *RCFI = getAnalysis<RCIdentityAnalysis>()->get(F);
229+
auto *PTFI = getAnalysis<ProgramTerminationAnalysis>()->get(F);
229230

230-
if (processFunctionWithoutLoopSupport(*F, false, AA, POTA, RCFI)) {
231-
processFunctionWithoutLoopSupport(*F, true, AA, POTA, RCFI);
231+
if (processFunctionWithoutLoopSupport(*F, false, AA, POTA, RCFI, PTFI)) {
232+
processFunctionWithoutLoopSupport(*F, true, AA, POTA, RCFI, PTFI);
232233
invalidateAnalysis(SILAnalysis::InvalidationKind::CallsAndInstructions);
233234
}
234235
return;
@@ -253,9 +254,11 @@ class ARCSequenceOpts : public SILFunctionTransform {
253254
auto *POTA = getAnalysis<PostOrderAnalysis>();
254255
auto *RCFI = getAnalysis<RCIdentityAnalysis>()->get(F);
255256
auto *LRFI = getAnalysis<LoopRegionAnalysis>()->get(F);
257+
auto *PTFI = getAnalysis<ProgramTerminationAnalysis>()->get(F);
256258

257-
if (processFunctionWithLoopSupport(*F, false, AA, POTA, LRFI, LI, RCFI)) {
258-
processFunctionWithLoopSupport(*F, true, AA, POTA, LRFI, LI, RCFI);
259+
if (processFunctionWithLoopSupport(*F, false, AA, POTA, LRFI, LI, RCFI,
260+
PTFI)) {
261+
processFunctionWithLoopSupport(*F, true, AA, POTA, LRFI, LI, RCFI, PTFI);
259262
invalidateAnalysis(SILAnalysis::InvalidationKind::CallsAndInstructions);
260263
}
261264
}

lib/SILPasses/ARC/GlobalARCPairingAnalysis.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,11 @@ struct BlockARCPairingContext {
118118
ARCSequenceDataflowEvaluator Evaluator;
119119

120120
BlockARCPairingContext(SILFunction &F, AliasAnalysis *AA,
121-
PostOrderAnalysis *POTA, RCIdentityFunctionInfo *RCFI)
122-
: Context(F, RCFI), Evaluator(F, AA, POTA, RCFI, Context.DecToIncStateMap,
123-
Context.IncToDecStateMap) {}
121+
PostOrderAnalysis *POTA, RCIdentityFunctionInfo *RCFI,
122+
ProgramTerminationFunctionInfo *PTFI)
123+
: Context(F, RCFI),
124+
Evaluator(F, AA, POTA, RCFI, PTFI, Context.DecToIncStateMap,
125+
Context.IncToDecStateMap) {}
124126

125127
bool run(bool FreezePostDomReleases, CodeMotionOrDeleteCallback &Callback) {
126128
bool NestingDetected = Evaluator.run(FreezePostDomReleases);
@@ -145,9 +147,10 @@ struct LoopARCPairingContext : SILLoopVisitor {
145147

146148
LoopARCPairingContext(SILFunction &F, AliasAnalysis *AA,
147149
LoopRegionFunctionInfo *LRFI, SILLoopInfo *SLI,
148-
RCIdentityFunctionInfo *RCFI)
150+
RCIdentityFunctionInfo *RCFI,
151+
ProgramTerminationFunctionInfo *PTFI)
149152
: SILLoopVisitor(&F, SLI), Context(F, RCFI),
150-
Evaluator(F, AA, LRFI, SLI, RCFI, Context.DecToIncStateMap,
153+
Evaluator(F, AA, LRFI, SLI, RCFI, PTFI, Context.DecToIncStateMap,
151154
Context.IncToDecStateMap),
152155
LRFI(LRFI), SLI(SLI), Callback() {}
153156

lib/SILPasses/ARC/GlobalARCSequenceDataflow.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -350,14 +350,14 @@ bool ARCSequenceDataflowEvaluator::processBottomUp(
350350

351351
ARCSequenceDataflowEvaluator::ARCSequenceDataflowEvaluator(
352352
SILFunction &F, AliasAnalysis *AA, PostOrderAnalysis *POA,
353-
RCIdentityFunctionInfo *RCIA,
353+
RCIdentityFunctionInfo *RCIA, ProgramTerminationFunctionInfo *PTFI,
354354
BlotMapVector<SILInstruction *, TopDownRefCountState> &DecToIncStateMap,
355355
BlotMapVector<SILInstruction *, BottomUpRefCountState> &IncToDecStateMap)
356356
: F(F), AA(AA), POA(POA), RCIA(RCIA), DecToIncStateMap(DecToIncStateMap),
357357
IncToDecStateMap(IncToDecStateMap),
358358
// We use a malloced pointer here so we don't need to expose
359359
// ARCBBStateInfo in the header.
360-
BBStateInfo(new ARCBBStateInfo(&F, POA)),
360+
BBStateInfo(new ARCBBStateInfo(&F, POA, PTFI)),
361361
ConsumedArgToReleaseMap(RCIA, &F) {}
362362

363363
bool ARCSequenceDataflowEvaluator::run(bool FreezeOwnedReleases) {

lib/SILPasses/ARC/GlobalARCSequenceDataflow.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include "RefCountState.h"
1717
#include "swift/SILAnalysis/PostOrderAnalysis.h"
18+
#include "swift/SILAnalysis/ProgramTerminationAnalysis.h"
1819
#include "swift/Basic/BlotMapVector.h"
1920
#include "swift/Basic/NullablePtr.h"
2021
#include "llvm/ADT/MapVector.h"
@@ -67,7 +68,7 @@ class ARCSequenceDataflowEvaluator {
6768
public:
6869
ARCSequenceDataflowEvaluator(
6970
SILFunction &F, AliasAnalysis *AA, PostOrderAnalysis *POA,
70-
RCIdentityFunctionInfo *RCIA,
71+
RCIdentityFunctionInfo *RCIA, ProgramTerminationFunctionInfo *PTFI,
7172
BlotMapVector<SILInstruction *, TopDownRefCountState> &DecToIncStateMap,
7273
BlotMapVector<SILInstruction *, BottomUpRefCountState> &IncToDecStateMap);
7374
~ARCSequenceDataflowEvaluator();

lib/SILPasses/ARC/GlobalLoopARCSequenceDataflow.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,13 +250,17 @@ bool LoopARCSequenceDataflowEvaluator::processLoopBottomUp(
250250
LoopARCSequenceDataflowEvaluator::LoopARCSequenceDataflowEvaluator(
251251
SILFunction &F, AliasAnalysis *AA, LoopRegionFunctionInfo *LRFI,
252252
SILLoopInfo *SLI, RCIdentityFunctionInfo *RCFI,
253+
ProgramTerminationFunctionInfo *PTFI,
253254
BlotMapVector<SILInstruction *, TopDownRefCountState> &DecToIncStateMap,
254255
BlotMapVector<SILInstruction *, BottomUpRefCountState> &IncToDecStateMap)
255256
: F(F), AA(AA), LRFI(LRFI), SLI(SLI), RCFI(RCFI),
256257
DecToIncStateMap(DecToIncStateMap), IncToDecStateMap(IncToDecStateMap),
257258
ConsumedArgToReleaseMap(RCFI, &F) {
258259
for (auto *R : LRFI->getRegions()) {
259-
RegionStateInfo[R] = new (Allocator) ARCRegionState(R);
260+
bool AllowsLeaks = false;
261+
if (R->isBlock())
262+
AllowsLeaks |= PTFI->isProgramTerminatingBlock(R->getBlock());
263+
RegionStateInfo[R] = new (Allocator) ARCRegionState(R, AllowsLeaks);
260264
}
261265
}
262266

lib/SILPasses/ARC/GlobalLoopARCSequenceDataflow.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include "RefCountState.h"
1717
#include "swift/SILAnalysis/LoopRegionAnalysis.h"
18+
#include "swift/SILAnalysis/ProgramTerminationAnalysis.h"
1819
#include "swift/Basic/BlotMapVector.h"
1920
#include "swift/Basic/NullablePtr.h"
2021
#include "llvm/ADT/MapVector.h"
@@ -74,6 +75,7 @@ class LoopARCSequenceDataflowEvaluator {
7475
LoopARCSequenceDataflowEvaluator(
7576
SILFunction &F, AliasAnalysis *AA, LoopRegionFunctionInfo *LRFI,
7677
SILLoopInfo *SLI, RCIdentityFunctionInfo *RCIA,
78+
ProgramTerminationFunctionInfo *PTFI,
7779
BlotMapVector<SILInstruction *, TopDownRefCountState> &DecToIncStateMap,
7880
BlotMapVector<SILInstruction *, BottomUpRefCountState> &IncToDecStateMap);
7981
~LoopARCSequenceDataflowEvaluator();

0 commit comments

Comments
 (0)