Skip to content

Commit e26d907

Browse files
authored
[Reg2Mem] Add legacy pass wrapping Reg2Mem (#111024)
The SPIR-V backend will need to use Reg2Mem, hence this pass needs to be wrapped to be used with the legacy pass manager. --------- Signed-off-by: Nathan Gauër <[email protected]>
1 parent 08330db commit e26d907

File tree

4 files changed

+53
-0
lines changed

4 files changed

+53
-0
lines changed

llvm/include/llvm/InitializePasses.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ void initializeRegAllocFastPass(PassRegistry &);
256256
void initializeRegAllocPriorityAdvisorAnalysisPass(PassRegistry &);
257257
void initializeRegAllocScoringPass(PassRegistry &);
258258
void initializeRegBankSelectPass(PassRegistry &);
259+
void initializeRegToMemWrapperPassPass(PassRegistry &);
259260
void initializeRegUsageInfoCollectorPass(PassRegistry &);
260261
void initializeRegUsageInfoPropagationPass(PassRegistry &);
261262
void initializeRegionInfoPassPass(PassRegistry &);

llvm/include/llvm/LinkAllPasses.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ struct ForcePassLinking {
9898
(void)llvm::createNaryReassociatePass();
9999
(void)llvm::createObjCARCContractPass();
100100
(void)llvm::createPromoteMemoryToRegisterPass();
101+
(void)llvm::createRegToMemWrapperPass();
101102
(void)llvm::createPostDomOnlyPrinterWrapperPassPass();
102103
(void)llvm::createPostDomPrinterWrapperPassPass();
103104
(void)llvm::createPostDomOnlyViewerWrapperPassPass();

llvm/include/llvm/Transforms/Utils.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,14 @@ extern char &LCSSAID;
8181
//
8282
FunctionPass *createPromoteMemoryToRegisterPass();
8383

84+
//===----------------------------------------------------------------------===//
85+
//
86+
// RegToMemWrapperPass - This pass is used to demote registers to memory
87+
// references. In basically undoes the PromoteMemoryToRegister pass to make cfg
88+
// hacking easier.
89+
//
90+
FunctionPass *createRegToMemWrapperPass();
91+
8492
//===----------------------------------------------------------------------===//
8593
//
8694
// LoopSimplify - Insert Pre-header blocks into the CFG for every function in

llvm/lib/Transforms/Scalar/Reg2Mem.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "llvm/IR/InstIterator.h"
2626
#include "llvm/IR/Instructions.h"
2727
#include "llvm/IR/PassManager.h"
28+
#include "llvm/InitializePasses.h"
2829
#include "llvm/Transforms/Scalar.h"
2930
#include "llvm/Transforms/Utils.h"
3031
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
@@ -105,3 +106,45 @@ PreservedAnalyses RegToMemPass::run(Function &F, FunctionAnalysisManager &AM) {
105106
PA.preserve<LoopAnalysis>();
106107
return PA;
107108
}
109+
110+
namespace llvm {
111+
112+
void initializeRegToMemWrapperPassPass(PassRegistry &);
113+
114+
class RegToMemWrapperPass : public FunctionPass {
115+
public:
116+
static char ID;
117+
118+
RegToMemWrapperPass() : FunctionPass(ID) {}
119+
120+
void getAnalysisUsage(AnalysisUsage &AU) const override {
121+
AU.setPreservesAll();
122+
123+
AU.addPreserved<DominatorTreeWrapperPass>();
124+
AU.addRequired<DominatorTreeWrapperPass>();
125+
126+
AU.addPreserved<LoopInfoWrapperPass>();
127+
AU.addRequired<LoopInfoWrapperPass>();
128+
}
129+
130+
bool runOnFunction(Function &F) override {
131+
DominatorTree *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
132+
LoopInfo *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
133+
134+
unsigned N = SplitAllCriticalEdges(F, CriticalEdgeSplittingOptions(DT, LI));
135+
bool Changed = runPass(F);
136+
return N != 0 || Changed;
137+
}
138+
};
139+
} // namespace llvm
140+
141+
INITIALIZE_PASS_BEGIN(RegToMemWrapperPass, "reg2mem", "", true, true)
142+
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass);
143+
INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass);
144+
INITIALIZE_PASS_END(RegToMemWrapperPass, "reg2mem", "", true, true)
145+
146+
char RegToMemWrapperPass::ID = 0;
147+
148+
FunctionPass *llvm::createRegToMemWrapperPass() {
149+
return new RegToMemWrapperPass();
150+
}

0 commit comments

Comments
 (0)