1111//
1212// ===----------------------------------------------------------------------===//
1313
14+ #include " llvm/CodeGen/OptimizePHIs.h"
1415#include " llvm/ADT/SmallPtrSet.h"
1516#include " llvm/ADT/Statistic.h"
1617#include " llvm/CodeGen/MachineBasicBlock.h"
17- #include " llvm/CodeGen/MachineFunction.h"
1818#include " llvm/CodeGen/MachineFunctionPass.h"
1919#include " llvm/CodeGen/MachineInstr.h"
2020#include " llvm/CodeGen/MachineOperand.h"
2121#include " llvm/CodeGen/MachineRegisterInfo.h"
2222#include " llvm/CodeGen/TargetSubtargetInfo.h"
23+ #include " llvm/IR/Function.h"
2324#include " llvm/InitializePasses.h"
2425#include " llvm/Pass.h"
2526#include < cassert>
@@ -33,47 +34,65 @@ STATISTIC(NumDeadPHICycles, "Number of dead PHI cycles");
3334
3435namespace {
3536
36- class OptimizePHIs : public MachineFunctionPass {
37- MachineRegisterInfo *MRI = nullptr ;
38- const TargetInstrInfo *TII = nullptr ;
37+ class OptimizePHIs {
38+ MachineRegisterInfo *MRI = nullptr ;
39+ const TargetInstrInfo *TII = nullptr ;
3940
40- public:
41- static char ID; // Pass identification
41+ public:
42+ bool run (MachineFunction &Fn);
4243
43- OptimizePHIs () : MachineFunctionPass(ID) {
44- initializeOptimizePHIsPass (*PassRegistry::getPassRegistry ());
45- }
46-
47- bool runOnMachineFunction (MachineFunction &Fn) override ;
44+ private:
45+ using InstrSet = SmallPtrSet<MachineInstr *, 16 >;
46+ using InstrSetIterator = SmallPtrSetIterator<MachineInstr *>;
4847
49- void getAnalysisUsage (AnalysisUsage &AU) const override {
50- AU.setPreservesCFG ();
51- MachineFunctionPass::getAnalysisUsage (AU);
52- }
48+ bool IsSingleValuePHICycle (MachineInstr *MI, unsigned &SingleValReg,
49+ InstrSet &PHIsInCycle);
50+ bool IsDeadPHICycle (MachineInstr *MI, InstrSet &PHIsInCycle);
51+ bool OptimizeBB (MachineBasicBlock &MBB);
52+ };
5353
54- private:
55- using InstrSet = SmallPtrSet<MachineInstr *, 16 >;
56- using InstrSetIterator = SmallPtrSetIterator<MachineInstr *>;
54+ class OptimizePHIsLegacy : public MachineFunctionPass {
55+ public:
56+ static char ID;
57+ OptimizePHIsLegacy () : MachineFunctionPass(ID) {
58+ initializeOptimizePHIsLegacyPass (*PassRegistry::getPassRegistry ());
59+ }
5760
58- bool IsSingleValuePHICycle (MachineInstr *MI, unsigned &SingleValReg,
59- InstrSet &PHIsInCycle);
60- bool IsDeadPHICycle (MachineInstr *MI, InstrSet &PHIsInCycle);
61- bool OptimizeBB (MachineBasicBlock &MBB);
62- };
61+ bool runOnMachineFunction (MachineFunction &MF) override {
62+ if (skipFunction (MF.getFunction ()))
63+ return false ;
64+ OptimizePHIs OP;
65+ return OP.run (MF);
66+ }
6367
68+ void getAnalysisUsage (AnalysisUsage &AU) const override {
69+ AU.setPreservesCFG ();
70+ MachineFunctionPass::getAnalysisUsage (AU);
71+ }
72+ };
6473} // end anonymous namespace
6574
66- char OptimizePHIs ::ID = 0 ;
75+ char OptimizePHIsLegacy ::ID = 0 ;
6776
68- char &llvm::OptimizePHIsID = OptimizePHIs ::ID;
77+ char &llvm::OptimizePHIsLegacyID = OptimizePHIsLegacy ::ID;
6978
70- INITIALIZE_PASS (OptimizePHIs , DEBUG_TYPE,
79+ INITIALIZE_PASS (OptimizePHIsLegacy , DEBUG_TYPE,
7180 " Optimize machine instruction PHIs" , false , false )
7281
73- bool OptimizePHIs::runOnMachineFunction(MachineFunction &Fn) {
74- if (skipFunction (Fn.getFunction ()))
75- return false ;
82+ PreservedAnalyses OptimizePHIsPass::run(MachineFunction &MF,
83+ MachineFunctionAnalysisManager &MFAM) {
84+ if (MF.getFunction ().hasOptNone ())
85+ return PreservedAnalyses::all ();
86+
87+ OptimizePHIs OP;
88+ if (!OP.run (MF))
89+ return PreservedAnalyses::all ();
90+ auto PA = getMachineFunctionPassPreservedAnalyses ();
91+ PA.preserveSet <CFGAnalyses>();
92+ return PA;
93+ }
7694
95+ bool OptimizePHIs::run (MachineFunction &Fn) {
7796 MRI = &Fn.getRegInfo ();
7897 TII = Fn.getSubtarget ().getInstrInfo ();
7998
0 commit comments