11
11
// ===----------------------------------------------------------------------===//
12
12
13
13
#include " llvm/CodeGen/MachinePassManager.h"
14
+ #include " llvm/CodeGen/FreeMachineFunction.h"
15
+ #include " llvm/CodeGen/FunctionToMachineFunctionAnalysis.h"
14
16
#include " llvm/CodeGen/MachineFunction.h"
15
17
#include " llvm/CodeGen/MachineModuleInfo.h"
16
18
#include " llvm/IR/PassManagerImpl.h"
@@ -69,9 +71,34 @@ bool MachineFunctionAnalysisManagerModuleProxy::Result::invalidate(
69
71
return false ;
70
72
}
71
73
74
+ template <>
75
+ bool MachineFunctionAnalysisManagerFunctionProxy::Result::invalidate (
76
+ Function &F, const PreservedAnalyses &PA,
77
+ FunctionAnalysisManager::Invalidator &Inv) {
78
+ // If literally everything is preserved, we're done.
79
+ if (PA.areAllPreserved ())
80
+ return false ; // This is still a valid proxy.
81
+
82
+ // If this proxy isn't marked as preserved, then even if the result remains
83
+ // valid, the key itself may no longer be valid, so we clear everything.
84
+ //
85
+ // Once function changed by a non-trivial pass, we need to do instruction
86
+ // selection again.
87
+ auto PAC = PA.getChecker <MachineFunctionAnalysisManagerFunctionProxy>();
88
+ if (!PAC.preserved () && !PAC.preservedSet <AllAnalysesOn<Function>>()) {
89
+ InnerAM->clear ();
90
+ return true ;
91
+ }
92
+
93
+ // Return false to indicate that this result is still a valid proxy.
94
+ return false ;
95
+ }
96
+
72
97
PreservedAnalyses
73
98
ModuleToMachineFunctionPassAdaptor::run (Module &M, ModuleAnalysisManager &AM) {
74
- auto &MMI = AM.getResult <MachineModuleAnalysis>(M).getMMI ();
99
+ // Ensure we have a MachineModuleInfo
100
+ AM.getResult <MachineModuleAnalysis>(M).getMMI ();
101
+ auto &FAM = AM.getResult <FunctionAnalysisManagerModuleProxy>(M).getManager ();
75
102
MachineFunctionAnalysisManager &MFAM =
76
103
AM.getResult <MachineFunctionAnalysisManagerModuleProxy>(M).getManager ();
77
104
PassInstrumentation PI = AM.getResult <PassInstrumentationAnalysis>(M);
@@ -82,19 +109,51 @@ ModuleToMachineFunctionPassAdaptor::run(Module &M, ModuleAnalysisManager &AM) {
82
109
if (F.isDeclaration () || F.hasAvailableExternallyLinkage ())
83
110
continue ;
84
111
85
- MachineFunction &MF = MMI.getOrCreateMachineFunction (F);
112
+ MachineFunction &MF =
113
+ FAM.getResult <FunctionToMachineFunctionAnalysis>(F).getMF ();
86
114
87
115
if (!PI.runBeforePass <MachineFunction>(*Pass, MF))
88
116
continue ;
89
117
PreservedAnalyses PassPA = Pass->run (MF, MFAM);
90
- if (MMI. getMachineFunction (F)) {
91
- MFAM. invalidate (MF, PassPA);
118
+ MFAM. invalidate (MF, PassPA);
119
+ if (Pass-> name () != FreeMachineFunctionPass::name ()) {
92
120
PI.runAfterPass (*Pass, MF, PassPA);
121
+ PA.intersect (std::move (PassPA));
93
122
} else {
94
- MFAM.clear (MF, F.getName ());
95
- PI.runAfterPassInvalidated <MachineFunction>(*Pass, PassPA);
123
+ PA.intersect (std::move (PassPA));
124
+ FAM.invalidate (F, PA);
125
+ PI.runAfterPassInvalidated <MachineFunction>(*Pass, PA);
96
126
}
127
+ }
128
+
129
+ return PA;
130
+ }
131
+
132
+ PreservedAnalyses
133
+ FunctionToMachineFunctionPassAdaptor::run (Function &F,
134
+ FunctionAnalysisManager &FAM) {
135
+ // Do not codegen any 'available_externally' functions at all, they have
136
+ // definitions outside the translation unit.
137
+ if (F.isDeclaration () || F.hasAvailableExternallyLinkage ())
138
+ return PreservedAnalyses::all ();
139
+
140
+ auto &MF = FAM.getResult <FunctionToMachineFunctionAnalysis>(F).getMF ();
141
+ auto &MFAM = FAM.getResult <MachineFunctionAnalysisManagerFunctionProxy>(F)
142
+ .getManager ();
143
+ auto PI = FAM.getResult <PassInstrumentationAnalysis>(F);
144
+ PreservedAnalyses PA = PreservedAnalyses::all ();
145
+
146
+ if (!PI.runBeforePass <MachineFunction>(*Pass, MF))
147
+ return PreservedAnalyses::all ();
148
+ PreservedAnalyses PassPA = Pass->run (MF, MFAM);
149
+ MFAM.invalidate (MF, PassPA);
150
+ if (Pass->name () != FreeMachineFunctionPass::name ()) {
151
+ PI.runAfterPass (*Pass, MF, PassPA);
152
+ PA.intersect (std::move (PassPA));
153
+ } else {
97
154
PA.intersect (std::move (PassPA));
155
+ FAM.invalidate (F, PA);
156
+ PI.runAfterPassInvalidated <MachineFunction>(*Pass, PA);
98
157
}
99
158
100
159
return PA;
@@ -112,25 +171,24 @@ PreservedAnalyses
112
171
PassManager<MachineFunction>::run(MachineFunction &MF,
113
172
AnalysisManager<MachineFunction> &MFAM) {
114
173
PassInstrumentation PI = MFAM.getResult <PassInstrumentationAnalysis>(MF);
115
- Function &F = MF.getFunction ();
116
- MachineModuleInfo &MMI =
117
- MFAM.getResult <ModuleAnalysisManagerMachineFunctionProxy>(MF)
118
- .getCachedResult <MachineModuleAnalysis>(*F.getParent ())
119
- ->getMMI ();
174
+ FunctionAnalysisManager &FAM =
175
+ MFAM.getResult <FunctionAnalysisManagerMachineFunctionProxy>(MF)
176
+ .getManager ();
120
177
PreservedAnalyses PA = PreservedAnalyses::all ();
121
178
for (auto &Pass : Passes) {
122
179
if (!PI.runBeforePass <MachineFunction>(*Pass, MF))
123
180
continue ;
124
181
125
182
PreservedAnalyses PassPA = Pass->run (MF, MFAM);
126
- if (MMI. getMachineFunction (F)) {
127
- MFAM. invalidate (MF, PassPA);
183
+ MFAM. invalidate (MF, PassPA);
184
+ if (Pass-> name () != FreeMachineFunctionPass::name ()) {
128
185
PI.runAfterPass (*Pass, MF, PassPA);
186
+ PA.intersect (std::move (PassPA));
129
187
} else {
130
- MFAM.clear (MF, F.getName ());
131
- PI.runAfterPassInvalidated <MachineFunction>(*Pass, PassPA);
188
+ PA.intersect (std::move (PassPA));
189
+ FAM.invalidate (MF.getFunction (), PA);
190
+ PI.runAfterPassInvalidated <MachineFunction>(*Pass, PA);
132
191
}
133
- PA.intersect (std::move (PassPA));
134
192
}
135
193
return PA;
136
194
}
0 commit comments