Skip to content

Commit 1663b1d

Browse files
Merge pull request #60077 from aschwaighofer/add_option_to_run_new_llvm_pass_manager
Add option to run new llvm pass manager in IRGen
2 parents 787891e + d44b792 commit 1663b1d

17 files changed

+449
-124
lines changed

include/swift/AST/IRGenOptions.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,9 @@ class IRGenOptions {
237237
/// well-formed?
238238
unsigned Verify : 1;
239239

240+
/// Should we use the legacy pass manager.
241+
unsigned LegacyPassManager : 1;
242+
240243
OptimizationMode OptMode;
241244

242245
/// Which sanitizer is turned on.
@@ -443,7 +446,7 @@ class IRGenOptions {
443446
IRGenOptions()
444447
: DWARFVersion(2),
445448
OutputKind(IRGenOutputKind::LLVMAssemblyAfterOptimization),
446-
Verify(true), OptMode(OptimizationMode::NotSet),
449+
Verify(true), LegacyPassManager(1), OptMode(OptimizationMode::NotSet),
447450
Sanitizers(OptionSet<SanitizerKind>()),
448451
SanitizersWithRecoveryInstrumentation(OptionSet<SanitizerKind>()),
449452
SanitizeAddressUseODRIndicator(false),

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

include/swift/Option/FrontendOptions.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1072,4 +1072,8 @@ def concurrency_model :
10721072
def concurrency_model_EQ :
10731073
Joined<["-"], "concurrency-model=">,
10741074
Alias<concurrency_model>;
1075+
1076+
def enable_new_llvm_pass_manager :
1077+
Flag<["-"], "enable-new-llvm-pass-manager">,
1078+
HelpText<"Enable new llvm pass manager">;
10751079
} // end let Flags = [FrontendOption, NoDriverOption, HelpHidden]

lib/Frontend/CompilerInvocation.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2365,6 +2365,9 @@ static bool ParseIRGenArgs(IRGenOptions &Opts, ArgList &Args,
23652365
Opts.SwiftAsyncFramePointer = SwiftAsyncFramePointerKind::Never;
23662366
}
23672367

2368+
if (Args.hasArg(OPT_enable_new_llvm_pass_manager))
2369+
Opts.LegacyPassManager = false;
2370+
23682371
return false;
23692372
}
23702373

0 commit comments

Comments
 (0)