@@ -33,36 +33,42 @@ using namespace llvm;
3333#define PASS_NAME " RISC-V CodeGenPrepare"
3434
3535namespace {
36-
37- class RISCVCodeGenPrepare : public FunctionPass ,
38- public InstVisitor<RISCVCodeGenPrepare, bool > {
36+ class RISCVCodeGenPrepare : public InstVisitor <RISCVCodeGenPrepare, bool > {
37+ Function &F;
3938 const DataLayout *DL;
4039 const DominatorTree *DT;
4140 const RISCVSubtarget *ST;
4241
42+ public:
43+ RISCVCodeGenPrepare (Function &F, const DominatorTree *DT,
44+ const RISCVSubtarget *ST)
45+ : F(F), DL(&F.getDataLayout()), DT(DT), ST(ST) {}
46+ bool run ();
47+ bool visitInstruction (Instruction &I) { return false ; }
48+ bool visitAnd (BinaryOperator &BO);
49+ bool visitIntrinsicInst (IntrinsicInst &I);
50+ bool expandVPStrideLoad (IntrinsicInst &I);
51+ bool widenVPMerge (IntrinsicInst &I);
52+ };
53+ } // namespace
54+
55+ namespace {
56+ class RISCVCodeGenPrepareLegacyPass : public FunctionPass {
4357public:
4458 static char ID;
4559
46- RISCVCodeGenPrepare () : FunctionPass(ID) {}
60+ RISCVCodeGenPrepareLegacyPass () : FunctionPass(ID) {}
4761
4862 bool runOnFunction (Function &F) override ;
49-
5063 StringRef getPassName () const override { return PASS_NAME; }
5164
5265 void getAnalysisUsage (AnalysisUsage &AU) const override {
5366 AU.setPreservesCFG ();
5467 AU.addRequired <DominatorTreeWrapperPass>();
5568 AU.addRequired <TargetPassConfig>();
5669 }
57-
58- bool visitInstruction (Instruction &I) { return false ; }
59- bool visitAnd (BinaryOperator &BO);
60- bool visitIntrinsicInst (IntrinsicInst &I);
61- bool expandVPStrideLoad (IntrinsicInst &I);
62- bool widenVPMerge (IntrinsicInst &I);
6370};
64-
65- } // end anonymous namespace
71+ } // namespace
6672
6773// Try to optimize (i64 (and (zext/sext (i32 X), C1))) if C1 has bit 31 set,
6874// but bits 63:32 are zero. If we know that bit 31 of X is 0, we can fill
@@ -273,17 +279,7 @@ bool RISCVCodeGenPrepare::expandVPStrideLoad(IntrinsicInst &II) {
273279 return true ;
274280}
275281
276- bool RISCVCodeGenPrepare::runOnFunction (Function &F) {
277- if (skipFunction (F))
278- return false ;
279-
280- auto &TPC = getAnalysis<TargetPassConfig>();
281- auto &TM = TPC.getTM <RISCVTargetMachine>();
282- ST = &TM.getSubtarget <RISCVSubtarget>(F);
283-
284- DL = &F.getDataLayout ();
285- DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree ();
286-
282+ bool RISCVCodeGenPrepare::run () {
287283 bool MadeChange = false ;
288284 for (auto &BB : F)
289285 for (Instruction &I : llvm::make_early_inc_range (BB))
@@ -292,12 +288,40 @@ bool RISCVCodeGenPrepare::runOnFunction(Function &F) {
292288 return MadeChange;
293289}
294290
295- INITIALIZE_PASS_BEGIN (RISCVCodeGenPrepare, DEBUG_TYPE, PASS_NAME, false , false )
291+ bool RISCVCodeGenPrepareLegacyPass::runOnFunction (Function &F) {
292+ if (skipFunction (F))
293+ return false ;
294+
295+ auto &TPC = getAnalysis<TargetPassConfig>();
296+ auto &TM = TPC.getTM <RISCVTargetMachine>();
297+ auto ST = &TM.getSubtarget <RISCVSubtarget>(F);
298+ auto DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree ();
299+
300+ RISCVCodeGenPrepare RVCGP (F, DT, ST);
301+ return RVCGP.run ();
302+ }
303+
304+ INITIALIZE_PASS_BEGIN (RISCVCodeGenPrepareLegacyPass, DEBUG_TYPE, PASS_NAME,
305+ false , false )
296306INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
297- INITIALIZE_PASS_END(RISCVCodeGenPrepare, DEBUG_TYPE, PASS_NAME, false , false )
307+ INITIALIZE_PASS_END(RISCVCodeGenPrepareLegacyPass, DEBUG_TYPE, PASS_NAME, false ,
308+ false )
298309
299- char RISCVCodeGenPrepare::ID = 0;
310+ char RISCVCodeGenPrepareLegacyPass::ID = 0;
311+
312+ FunctionPass *llvm::createRISCVCodeGenPrepareLegacyPass () {
313+ return new RISCVCodeGenPrepareLegacyPass ();
314+ }
300315
301- FunctionPass *llvm::createRISCVCodeGenPreparePass () {
302- return new RISCVCodeGenPrepare ();
316+ PreservedAnalyses RISCVCodeGenPreparePass::run (Function &F,
317+ FunctionAnalysisManager &FAM) {
318+ DominatorTree *DT = &FAM.getResult <DominatorTreeAnalysis>(F);
319+ auto ST = &TM->getSubtarget <RISCVSubtarget>(F);
320+ bool Changed = RISCVCodeGenPrepare (F, DT, ST).run ();
321+ if (!Changed)
322+ return PreservedAnalyses::all ();
323+
324+ PreservedAnalyses PA = PreservedAnalyses::none ();
325+ PA.preserveSet <CFGAnalyses>();
326+ return PA;
303327}
0 commit comments