Skip to content

Commit 760eefd

Browse files
committed
[Reg2Mem] Add legacy pass wrapping Reg2Mem
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 06c8210 commit 760eefd

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

llvm/include/llvm/Transforms/Scalar/Reg2Mem.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@
1313
#ifndef LLVM_TRANSFORMS_SCALAR_REG2MEM_H
1414
#define LLVM_TRANSFORMS_SCALAR_REG2MEM_H
1515

16+
#include "llvm/Analysis/LoopInfo.h"
17+
#include "llvm/IR/Dominators.h"
1618
#include "llvm/IR/PassManager.h"
19+
#include "llvm/InitializePasses.h"
20+
#include "llvm/Pass.h"
1721

1822
namespace llvm {
1923

@@ -22,6 +26,27 @@ class RegToMemPass : public PassInfoMixin<RegToMemPass> {
2226
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
2327
};
2428

29+
class RegToMemWrapperPass : public FunctionPass {
30+
public:
31+
static char ID;
32+
33+
RegToMemWrapperPass();
34+
35+
void getAnalysisUsage(AnalysisUsage &AU) const override {
36+
AU.setPreservesAll();
37+
38+
AU.addPreserved<DominatorTreeWrapperPass>();
39+
AU.addRequired<DominatorTreeWrapperPass>();
40+
41+
AU.addPreserved<LoopInfoWrapperPass>();
42+
AU.addRequired<LoopInfoWrapperPass>();
43+
}
44+
45+
bool runOnFunction(Function &F) override;
46+
};
47+
48+
FunctionPass *createRegToMemWrapperPass();
49+
2550
} // end namespace llvm
2651

2752
#endif // LLVM_TRANSFORMS_SCALAR_REG2MEM_H

llvm/lib/Transforms/Scalar/Reg2Mem.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,31 @@ PreservedAnalyses RegToMemPass::run(Function &F, FunctionAnalysisManager &AM) {
105105
PA.preserve<LoopAnalysis>();
106106
return PA;
107107
}
108+
109+
namespace llvm {
110+
void initializeRegToMemWrapperPassPass(PassRegistry &);
111+
} // namespace llvm
112+
113+
INITIALIZE_PASS_BEGIN(RegToMemWrapperPass, "reg-to-mem", "", true, true)
114+
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass);
115+
INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass);
116+
INITIALIZE_PASS_END(RegToMemWrapperPass, "reg-to-mem", "", true, true)
117+
118+
char RegToMemWrapperPass::ID = 0;
119+
120+
RegToMemWrapperPass::RegToMemWrapperPass() : FunctionPass(ID) {}
121+
122+
bool RegToMemWrapperPass::runOnFunction(Function &F) {
123+
DominatorTree *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
124+
LoopInfo *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
125+
126+
unsigned N = SplitAllCriticalEdges(F, CriticalEdgeSplittingOptions(DT, LI));
127+
bool Changed = runPass(F);
128+
if (N == 0 && !Changed)
129+
return false;
130+
return true;
131+
}
132+
133+
FunctionPass *llvm::createRegToMemWrapperPass() {
134+
return new RegToMemWrapperPass();
135+
}

0 commit comments

Comments
 (0)