11
11
//
12
12
// ===----------------------------------------------------------------------===//
13
13
14
+ #include " llvm/CodeGen/OptimizePHIs.h"
14
15
#include " llvm/ADT/SmallPtrSet.h"
15
16
#include " llvm/ADT/Statistic.h"
16
17
#include " llvm/CodeGen/MachineBasicBlock.h"
17
- #include " llvm/CodeGen/MachineFunction.h"
18
18
#include " llvm/CodeGen/MachineFunctionPass.h"
19
19
#include " llvm/CodeGen/MachineInstr.h"
20
20
#include " llvm/CodeGen/MachineOperand.h"
21
21
#include " llvm/CodeGen/MachineRegisterInfo.h"
22
22
#include " llvm/CodeGen/TargetSubtargetInfo.h"
23
+ #include " llvm/IR/Function.h"
23
24
#include " llvm/InitializePasses.h"
24
25
#include " llvm/Pass.h"
25
26
#include < cassert>
@@ -33,47 +34,65 @@ STATISTIC(NumDeadPHICycles, "Number of dead PHI cycles");
33
34
34
35
namespace {
35
36
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 ;
39
40
40
- public:
41
- static char ID; // Pass identification
41
+ public:
42
+ bool run (MachineFunction &Fn);
42
43
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 *>;
48
47
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
+ };
53
53
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
+ }
57
60
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
+ }
63
67
68
+ void getAnalysisUsage (AnalysisUsage &AU) const override {
69
+ AU.setPreservesCFG ();
70
+ MachineFunctionPass::getAnalysisUsage (AU);
71
+ }
72
+ };
64
73
} // end anonymous namespace
65
74
66
- char OptimizePHIs ::ID = 0 ;
75
+ char OptimizePHIsLegacy ::ID = 0 ;
67
76
68
- char &llvm::OptimizePHIsID = OptimizePHIs ::ID;
77
+ char &llvm::OptimizePHIsLegacyID = OptimizePHIsLegacy ::ID;
69
78
70
- INITIALIZE_PASS (OptimizePHIs , DEBUG_TYPE,
79
+ INITIALIZE_PASS (OptimizePHIsLegacy , DEBUG_TYPE,
71
80
" Optimize machine instruction PHIs" , false , false )
72
81
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
+ }
76
94
95
+ bool OptimizePHIs::run (MachineFunction &Fn) {
77
96
MRI = &Fn.getRegInfo ();
78
97
TII = Fn.getSubtarget ().getInstrInfo ();
79
98
0 commit comments