Skip to content

Commit 5c9eab0

Browse files
committed
Update Swift's LLVM passes to include new pass manager versions
1 parent 5c4c12a commit 5c9eab0

File tree

11 files changed

+203
-100
lines changed

11 files changed

+203
-100
lines changed

include/swift/LLVMPasses/Passes.h

Lines changed: 60 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ namespace swift {
3131
bool invalidate(llvm::Function &,
3232
const llvm::PreservedAnalyses &) { return false; }
3333

34+
bool invalidate(llvm::Function &, const llvm::PreservedAnalyses &,
35+
llvm::FunctionAnalysisManager::Invalidator &) {
36+
return false;
37+
}
38+
3439
using AAResultBase::getModRefInfo;
3540
llvm::ModRefInfo getModRefInfo(const llvm::CallBase *Call,
3641
const llvm::MemoryLocation &Loc) {
@@ -57,51 +62,97 @@ namespace swift {
5762
void getAnalysisUsage(llvm::AnalysisUsage &AU) const override;
5863
};
5964

60-
class SwiftRCIdentity : public llvm::ImmutablePass {
65+
class SwiftAA : public llvm::AnalysisInfoMixin<SwiftAA> {
66+
friend llvm::AnalysisInfoMixin<SwiftAA>;
67+
68+
static llvm::AnalysisKey Key;
69+
6170
public:
62-
static char ID; // Class identification, replacement for typeinfo
63-
SwiftRCIdentity() : ImmutablePass(ID) {}
71+
using Result = SwiftAAResult;
72+
73+
SwiftAAResult run(llvm::Function &F, llvm::FunctionAnalysisManager &AM);
74+
};
75+
76+
class SwiftRCIdentity {
77+
public:
78+
SwiftRCIdentity() {}
6479

6580
/// Returns the root of the RC-equivalent value for the given V.
6681
llvm::Value *getSwiftRCIdentityRoot(llvm::Value *V);
82+
6783
private:
6884
enum { MaxRecursionDepth = 16 };
69-
bool doInitialization(llvm::Module &M) override;
7085

71-
void getAnalysisUsage(llvm::AnalysisUsage &AU) const override {
72-
AU.setPreservesAll();
73-
}
7486
llvm::Value *stripPointerCasts(llvm::Value *Val);
7587
llvm::Value *stripReferenceForwarding(llvm::Value *Val);
7688
};
7789

7890
class SwiftARCOpt : public llvm::FunctionPass {
7991
/// Swift RC Identity analysis.
80-
SwiftRCIdentity *RC;
92+
SwiftRCIdentity RC;
8193
virtual void getAnalysisUsage(llvm::AnalysisUsage &AU) const override;
8294
virtual bool runOnFunction(llvm::Function &F) override;
8395
public:
8496
static char ID;
8597
SwiftARCOpt();
8698
};
8799

100+
struct SwiftARCOptPass : public llvm::PassInfoMixin<SwiftARCOptPass> {
101+
SwiftRCIdentity RC;
102+
103+
llvm::PreservedAnalyses run(llvm::Function &F,
104+
llvm::FunctionAnalysisManager &AM);
105+
};
106+
88107
class SwiftARCContract : public llvm::FunctionPass {
89108
/// Swift RC Identity analysis.
90-
SwiftRCIdentity *RC;
109+
SwiftRCIdentity RC;
91110
virtual void getAnalysisUsage(llvm::AnalysisUsage &AU) const override;
92111
virtual bool runOnFunction(llvm::Function &F) override;
93112
public:
94113
static char ID;
95114
SwiftARCContract() : llvm::FunctionPass(ID) {}
96115
};
97116

117+
struct SwiftARCContractPass
118+
: public llvm::PassInfoMixin<SwiftARCContractPass> {
119+
SwiftRCIdentity RC;
120+
121+
llvm::PreservedAnalyses run(llvm::Function &F,
122+
llvm::FunctionAnalysisManager &AM);
123+
};
124+
98125
class InlineTreePrinter : public llvm::ModulePass {
99126
virtual void getAnalysisUsage(llvm::AnalysisUsage &AU) const override;
100127
virtual bool runOnModule(llvm::Module &M) override;
101128
public:
102129
static char ID;
103130
InlineTreePrinter() : llvm::ModulePass(ID) {}
104131
};
132+
133+
class SwiftMergeFunctionsPass
134+
: public llvm::PassInfoMixin<SwiftMergeFunctionsPass> {
135+
bool ptrAuthEnabled = false;
136+
unsigned ptrAuthKey = 0;
137+
138+
public:
139+
SwiftMergeFunctionsPass(bool ptrAuthEnabled, unsigned ptrAuthKey)
140+
: ptrAuthEnabled(ptrAuthEnabled), ptrAuthKey(ptrAuthKey) {}
141+
llvm::PreservedAnalyses run(llvm::Module &M,
142+
llvm::ModuleAnalysisManager &AM);
143+
};
144+
145+
struct SwiftDbgAddrBlockSplitterPass
146+
: public llvm::PassInfoMixin<SwiftDbgAddrBlockSplitterPass> {
147+
llvm::PreservedAnalyses run(llvm::Function &F,
148+
llvm::FunctionAnalysisManager &AM);
149+
};
150+
151+
struct InlineTreePrinterPass
152+
: public llvm::PassInfoMixin<InlineTreePrinterPass> {
153+
llvm::PreservedAnalyses run(llvm::Module &M,
154+
llvm::ModuleAnalysisManager &AM);
155+
};
105156
} // end namespace swift
106157

107158
#endif

include/swift/LLVMPasses/PassesFwd.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,21 @@ namespace llvm {
2020
class PassRegistry;
2121

2222
void initializeSwiftAAWrapperPassPass(PassRegistry &);
23-
void initializeSwiftRCIdentityPass(PassRegistry &);
2423
void initializeSwiftARCOptPass(PassRegistry &);
2524
void initializeSwiftARCContractPass(PassRegistry &);
2625
void initializeInlineTreePrinterPass(PassRegistry &);
27-
void initializeSwiftMergeFunctionsPass(PassRegistry &);
26+
void initializeLegacySwiftMergeFunctionsPass(PassRegistry &);
2827
void initializeSwiftDbgAddrBlockSplitterPass(PassRegistry &);
2928
}
3029

3130
namespace swift {
3231
llvm::FunctionPass *createSwiftARCOptPass();
3332
llvm::FunctionPass *createSwiftARCContractPass();
3433
llvm::ModulePass *createInlineTreePrinterPass();
35-
llvm::ModulePass *createSwiftMergeFunctionsPass(bool ptrAuthEnabled,
36-
unsigned ptrAuthKey);
34+
llvm::ModulePass *createLegacySwiftMergeFunctionsPass(bool ptrAuthEnabled,
35+
unsigned ptrAuthKey);
3736
llvm::FunctionPass *createSwiftDbgAddrBlockSplitter();
3837
llvm::ImmutablePass *createSwiftAAWrapperPass();
39-
llvm::ImmutablePass *createSwiftRCIdentityPass();
4038
} // end namespace swift
4139

4240
#endif

lib/IRGen/IRGen.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ performOptimizationsUsingLegacyPassManger(const IRGenOptions &Opts,
290290
if (Builder.OptLevel > 0) {
291291
const PointerAuthSchema &schema = Opts.PointerAuth.FunctionPointers;
292292
unsigned key = (schema.isEnabled() ? schema.getKey() : 0);
293-
PM.add(createSwiftMergeFunctionsPass(schema.isEnabled(), key));
293+
PM.add(createLegacySwiftMergeFunctionsPass(schema.isEnabled(), key));
294294
}
295295
});
296296
}

lib/LLVMPasses/DbgAddrBlockSplitter.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ struct SwiftDbgAddrBlockSplitter : FunctionPass {
3636

3737
} // namespace
3838

39-
bool SwiftDbgAddrBlockSplitter::runOnFunction(Function &fn) {
39+
static bool split(Function &fn) {
4040
SmallVector<Instruction *, 32> breakBlockPoints;
4141

4242
// If we are in the first block,
@@ -65,6 +65,10 @@ bool SwiftDbgAddrBlockSplitter::runOnFunction(Function &fn) {
6565
return madeChange;
6666
}
6767

68+
bool SwiftDbgAddrBlockSplitter::runOnFunction(Function &fn) {
69+
return split(fn);
70+
}
71+
6872
char SwiftDbgAddrBlockSplitter::ID = 0;
6973
INITIALIZE_PASS_BEGIN(SwiftDbgAddrBlockSplitter,
7074
"swift-dbg-addr-block-splitter",
@@ -79,3 +83,12 @@ llvm::FunctionPass *swift::createSwiftDbgAddrBlockSplitter() {
7983
*llvm::PassRegistry::getPassRegistry());
8084
return new SwiftDbgAddrBlockSplitter();
8185
}
86+
87+
llvm::PreservedAnalyses
88+
swift::SwiftDbgAddrBlockSplitterPass::run(llvm::Function &F,
89+
llvm::FunctionAnalysisManager &AM) {
90+
bool changed = split(F);
91+
if (!changed)
92+
return PreservedAnalyses::all();
93+
return PreservedAnalyses::none();
94+
}

lib/LLVMPasses/LLVMARCContract.cpp

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -64,16 +64,15 @@ class SwiftARCContractImpl {
6464
bool Changed;
6565

6666
/// Swift RC Identity.
67-
SwiftRCIdentity *RC;
67+
SwiftRCIdentity RC;
6868

6969
/// The function that we are processing.
7070
Function &F;
7171

7272
/// The entry point builder that is used to construct ARC entry points.
7373
ARCEntryPointBuilder B;
7474
public:
75-
SwiftARCContractImpl(Function &InF, SwiftRCIdentity *InRC)
76-
: Changed(false), RC(InRC), F(InF), B(F) {}
75+
SwiftARCContractImpl(Function &InF) : Changed(false), F(InF), B(F) {}
7776

7877
// The top level run routine of the pass.
7978
bool run();
@@ -109,7 +108,7 @@ performRRNOptimization(DenseMap<Value *, LocalState> &PtrToLocalStateMap) {
109108
break;
110109
}
111110
}
112-
B.createRetainN(RC->getSwiftRCIdentityRoot(O), RetainList.size(), RI);
111+
B.createRetainN(RC.getSwiftRCIdentityRoot(O), RetainList.size(), RI);
113112

114113
// Replace all uses of the retain instructions with our new retainN and
115114
// then delete them.
@@ -135,7 +134,7 @@ performRRNOptimization(DenseMap<Value *, LocalState> &PtrToLocalStateMap) {
135134
break;
136135
}
137136
}
138-
B.createReleaseN(RC->getSwiftRCIdentityRoot(O), ReleaseList.size(), RI);
137+
B.createReleaseN(RC.getSwiftRCIdentityRoot(O), ReleaseList.size(), RI);
139138

140139
// Remove all old release instructions.
141140
for (auto *Inst : ReleaseList) {
@@ -159,7 +158,7 @@ performRRNOptimization(DenseMap<Value *, LocalState> &PtrToLocalStateMap) {
159158
break;
160159
}
161160
}
162-
B.createUnknownObjectRetainN(RC->getSwiftRCIdentityRoot(O),
161+
B.createUnknownObjectRetainN(RC.getSwiftRCIdentityRoot(O),
163162
UnknownObjectRetainList.size(), RI);
164163

165164
// Replace all uses of the retain instructions with our new retainN and
@@ -187,7 +186,7 @@ performRRNOptimization(DenseMap<Value *, LocalState> &PtrToLocalStateMap) {
187186
break;
188187
}
189188
}
190-
B.createUnknownObjectReleaseN(RC->getSwiftRCIdentityRoot(O),
189+
B.createUnknownObjectReleaseN(RC.getSwiftRCIdentityRoot(O),
191190
UnknownObjectReleaseList.size(), RI);
192191

193192
// Remove all old release instructions.
@@ -214,7 +213,7 @@ performRRNOptimization(DenseMap<Value *, LocalState> &PtrToLocalStateMap) {
214213
}
215214
}
216215
// Bridge retain may modify the input reference before forwarding it.
217-
auto *I = B.createBridgeRetainN(RC->getSwiftRCIdentityRoot(O),
216+
auto *I = B.createBridgeRetainN(RC.getSwiftRCIdentityRoot(O),
218217
BridgeRetainList.size(), RI);
219218

220219
// Remove all old retain instructions.
@@ -246,8 +245,8 @@ performRRNOptimization(DenseMap<Value *, LocalState> &PtrToLocalStateMap) {
246245
break;
247246
}
248247
}
249-
B.createBridgeReleaseN(RC->getSwiftRCIdentityRoot(O),
250-
BridgeReleaseList.size(), RI);
248+
B.createBridgeReleaseN(RC.getSwiftRCIdentityRoot(O),
249+
BridgeReleaseList.size(), RI);
251250

252251
// Remove all old release instructions.
253252
for (auto *Inst : BridgeReleaseList) {
@@ -290,15 +289,15 @@ bool SwiftARCContractImpl::run() {
290289
continue;
291290
case RT_Retain: {
292291
auto *CI = cast<CallInst>(&Inst);
293-
auto *ArgVal = RC->getSwiftRCIdentityRoot(CI->getArgOperand(0));
292+
auto *ArgVal = RC.getSwiftRCIdentityRoot(CI->getArgOperand(0));
294293

295294
LocalState &LocalEntry = PtrToLocalStateMap[ArgVal];
296295
LocalEntry.RetainList.push_back(CI);
297296
continue;
298297
}
299298
case RT_UnknownObjectRetain: {
300299
auto *CI = cast<CallInst>(&Inst);
301-
auto *ArgVal = RC->getSwiftRCIdentityRoot(CI->getArgOperand(0));
300+
auto *ArgVal = RC.getSwiftRCIdentityRoot(CI->getArgOperand(0));
302301

303302
LocalState &LocalEntry = PtrToLocalStateMap[ArgVal];
304303
LocalEntry.UnknownObjectRetainList.push_back(CI);
@@ -307,7 +306,7 @@ bool SwiftARCContractImpl::run() {
307306
case RT_Release: {
308307
// Stash any releases that we see.
309308
auto *CI = cast<CallInst>(&Inst);
310-
auto *ArgVal = RC->getSwiftRCIdentityRoot(CI->getArgOperand(0));
309+
auto *ArgVal = RC.getSwiftRCIdentityRoot(CI->getArgOperand(0));
311310

312311
LocalState &LocalEntry = PtrToLocalStateMap[ArgVal];
313312
LocalEntry.ReleaseList.push_back(CI);
@@ -316,23 +315,23 @@ bool SwiftARCContractImpl::run() {
316315
case RT_UnknownObjectRelease: {
317316
// Stash any releases that we see.
318317
auto *CI = cast<CallInst>(&Inst);
319-
auto *ArgVal = RC->getSwiftRCIdentityRoot(CI->getArgOperand(0));
318+
auto *ArgVal = RC.getSwiftRCIdentityRoot(CI->getArgOperand(0));
320319

321320
LocalState &LocalEntry = PtrToLocalStateMap[ArgVal];
322321
LocalEntry.UnknownObjectReleaseList.push_back(CI);
323322
continue;
324323
}
325324
case RT_BridgeRetain: {
326325
auto *CI = cast<CallInst>(&Inst);
327-
auto *ArgVal = RC->getSwiftRCIdentityRoot(CI->getArgOperand(0));
326+
auto *ArgVal = RC.getSwiftRCIdentityRoot(CI->getArgOperand(0));
328327

329328
LocalState &LocalEntry = PtrToLocalStateMap[ArgVal];
330329
LocalEntry.BridgeRetainList.push_back(CI);
331330
continue;
332331
}
333332
case RT_BridgeRelease: {
334333
auto *CI = cast<CallInst>(&Inst);
335-
auto *ArgVal = RC->getSwiftRCIdentityRoot(CI->getArgOperand(0));
334+
auto *ArgVal = RC.getSwiftRCIdentityRoot(CI->getArgOperand(0));
336335

337336
LocalState &LocalEntry = PtrToLocalStateMap[ArgVal];
338337
LocalEntry.BridgeReleaseList.push_back(CI);
@@ -382,15 +381,12 @@ bool SwiftARCContractImpl::run() {
382381
}
383382

384383
bool SwiftARCContract::runOnFunction(Function &F) {
385-
RC = &getAnalysis<SwiftRCIdentity>();
386-
return SwiftARCContractImpl(F, RC).run();
384+
return SwiftARCContractImpl(F).run();
387385
}
388386

389387
char SwiftARCContract::ID = 0;
390-
INITIALIZE_PASS_BEGIN(SwiftARCContract,
391-
"swift-arc-contract", "Swift ARC contraction",
392-
false, false)
393-
INITIALIZE_PASS_DEPENDENCY(SwiftRCIdentity)
388+
INITIALIZE_PASS_BEGIN(SwiftARCContract, "swift-arc-contract",
389+
"Swift ARC contraction", false, false)
394390
INITIALIZE_PASS_END(SwiftARCContract,
395391
"swift-arc-contract", "Swift ARC contraction",
396392
false, false)
@@ -401,6 +397,17 @@ llvm::FunctionPass *swift::createSwiftARCContractPass() {
401397
}
402398

403399
void SwiftARCContract::getAnalysisUsage(llvm::AnalysisUsage &AU) const {
404-
AU.addRequired<SwiftRCIdentity>();
405400
AU.setPreservesCFG();
406401
}
402+
403+
llvm::PreservedAnalyses
404+
SwiftARCContractPass::run(llvm::Function &F,
405+
llvm::FunctionAnalysisManager &AM) {
406+
bool changed = SwiftARCContractImpl(F).run();
407+
if (!changed)
408+
return PreservedAnalyses::all();
409+
410+
PreservedAnalyses PA;
411+
PA.preserveSet<CFGAnalyses>();
412+
return PA;
413+
}

0 commit comments

Comments
 (0)