@@ -44,17 +44,17 @@ using namespace llvm;
4444
4545#define DEBUG_TYPE " spill-code-placement"
4646
47- char SpillPlacement ::ID = 0 ;
47+ char SpillPlacementWrapperLegacy ::ID = 0 ;
4848
49- char &llvm::SpillPlacementID = SpillPlacement ::ID;
49+ char &llvm::SpillPlacementID = SpillPlacementWrapperLegacy ::ID;
5050
51- INITIALIZE_PASS_BEGIN (SpillPlacement , DEBUG_TYPE,
51+ INITIALIZE_PASS_BEGIN (SpillPlacementWrapperLegacy , DEBUG_TYPE,
5252 " Spill Code Placement Analysis" , true , true )
5353INITIALIZE_PASS_DEPENDENCY(EdgeBundlesWrapperLegacy)
54- INITIALIZE_PASS_END(SpillPlacement , DEBUG_TYPE,
54+ INITIALIZE_PASS_END(SpillPlacementWrapperLegacy , DEBUG_TYPE,
5555 " Spill Code Placement Analysis" , true , true )
5656
57- void SpillPlacement ::getAnalysisUsage(AnalysisUsage &AU) const {
57+ void SpillPlacementWrapperLegacy ::getAnalysisUsage(AnalysisUsage &AU) const {
5858 AU.setPreservesAll ();
5959 AU.addRequired <MachineBlockFrequencyInfoWrapperPass>();
6060 AU.addRequiredTransitive <EdgeBundlesWrapperLegacy>();
@@ -189,32 +189,57 @@ struct SpillPlacement::Node {
189189 }
190190};
191191
192- bool SpillPlacement::runOnMachineFunction (MachineFunction &mf) {
192+ bool SpillPlacementWrapperLegacy::runOnMachineFunction (MachineFunction &MF) {
193+ auto *Bundles = &getAnalysis<EdgeBundlesWrapperLegacy>().getEdgeBundles ();
194+ auto *MBFI = &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI ();
195+
196+ Impl.reset (new SpillPlacement (Bundles, MBFI));
197+ Impl->run (MF);
198+ return false ;
199+ }
200+
201+ AnalysisKey SpillPlacementAnalysis::Key;
202+
203+ SpillPlacement
204+ SpillPlacementAnalysis::run (MachineFunction &MF,
205+ MachineFunctionAnalysisManager &MFAM) {
206+ auto *Bundles = &MFAM.getResult <EdgeBundlesAnalysis>(MF);
207+ auto *MBFI = &MFAM.getResult <MachineBlockFrequencyAnalysis>(MF);
208+ SpillPlacement Impl (Bundles, MBFI);
209+ Impl.run (MF);
210+ return Impl;
211+ }
212+
213+ bool SpillPlacementAnalysis::Result::invalidate (
214+ MachineFunction &MF, const PreservedAnalyses &PA,
215+ MachineFunctionAnalysisManager::Invalidator &Inv) {
216+ auto PAC = PA.getChecker <SpillPlacementAnalysis>();
217+ return !(PAC.preserved () ||
218+ PAC.preservedSet <AllAnalysesOn<MachineFunction>>()) ||
219+ Inv.invalidate <EdgeBundlesAnalysis>(MF, PA) ||
220+ Inv.invalidate <MachineBlockFrequencyAnalysis>(MF, PA);
221+ }
222+
223+ void SpillPlacement::arrayDeleter (Node *N) {
224+ if (N)
225+ delete[] N;
226+ }
227+
228+ void SpillPlacement::run (MachineFunction &mf) {
193229 MF = &mf;
194- bundles = &getAnalysis<EdgeBundlesWrapperLegacy>().getEdgeBundles ();
195230
196231 assert (!nodes && " Leaking node array" );
197- nodes = new Node[bundles->getNumBundles ()];
232+ nodes. reset ( new Node[bundles->getNumBundles ()]) ;
198233 TodoList.clear ();
199234 TodoList.setUniverse (bundles->getNumBundles ());
200235
201236 // Compute total ingoing and outgoing block frequencies for all bundles.
202237 BlockFrequencies.resize (mf.getNumBlockIDs ());
203- MBFI = &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI ();
204238 setThreshold (MBFI->getEntryFreq ());
205239 for (auto &I : mf) {
206240 unsigned Num = I.getNumber ();
207241 BlockFrequencies[Num] = MBFI->getBlockFreq (&I);
208242 }
209-
210- // We never change the function.
211- return false ;
212- }
213-
214- void SpillPlacement::releaseMemory () {
215- delete[] nodes;
216- nodes = nullptr ;
217- TodoList.clear ();
218243}
219244
220245// / activate - mark node n as active if it wasn't already.
@@ -223,7 +248,7 @@ void SpillPlacement::activate(unsigned n) {
223248 if (ActiveNodes->test (n))
224249 return ;
225250 ActiveNodes->set (n);
226- nodes[n].clear (Threshold);
251+ nodes. get () [n].clear (Threshold);
227252
228253 // Very large bundles usually come from big switches, indirect branches,
229254 // landing pads, or loops with many 'continue' statements. It is difficult to
@@ -235,10 +260,10 @@ void SpillPlacement::activate(unsigned n) {
235260 // limiting the number of blocks visited and the number of links in the
236261 // Hopfield network.
237262 if (bundles->getBlocks (n).size () > 100 ) {
238- nodes[n].BiasP = BlockFrequency (0 );
263+ nodes. get () [n].BiasP = BlockFrequency (0 );
239264 BlockFrequency BiasN = MBFI->getEntryFreq ();
240265 BiasN >>= 4 ;
241- nodes[n].BiasN = BiasN;
266+ nodes. get () [n].BiasN = BiasN;
242267 }
243268}
244269
@@ -265,14 +290,14 @@ void SpillPlacement::addConstraints(ArrayRef<BlockConstraint> LiveBlocks) {
265290 if (LB.Entry != DontCare) {
266291 unsigned ib = bundles->getBundle (LB.Number , false );
267292 activate (ib);
268- nodes[ib].addBias (Freq, LB.Entry );
293+ nodes. get () [ib].addBias (Freq, LB.Entry );
269294 }
270295
271296 // Live-out from block?
272297 if (LB.Exit != DontCare) {
273298 unsigned ob = bundles->getBundle (LB.Number , true );
274299 activate (ob);
275- nodes[ob].addBias (Freq, LB.Exit );
300+ nodes. get () [ob].addBias (Freq, LB.Exit );
276301 }
277302 }
278303}
@@ -287,8 +312,8 @@ void SpillPlacement::addPrefSpill(ArrayRef<unsigned> Blocks, bool Strong) {
287312 unsigned ob = bundles->getBundle (B, true );
288313 activate (ib);
289314 activate (ob);
290- nodes[ib].addBias (Freq, PrefSpill);
291- nodes[ob].addBias (Freq, PrefSpill);
315+ nodes. get () [ib].addBias (Freq, PrefSpill);
316+ nodes. get () [ob].addBias (Freq, PrefSpill);
292317 }
293318}
294319
@@ -303,8 +328,8 @@ void SpillPlacement::addLinks(ArrayRef<unsigned> Links) {
303328 activate (ib);
304329 activate (ob);
305330 BlockFrequency Freq = BlockFrequencies[Number];
306- nodes[ib].addLink (ob, Freq);
307- nodes[ob].addLink (ib, Freq);
331+ nodes. get () [ib].addLink (ob, Freq);
332+ nodes. get () [ob].addLink (ib, Freq);
308333 }
309334}
310335
@@ -314,18 +339,18 @@ bool SpillPlacement::scanActiveBundles() {
314339 update (n);
315340 // A node that must spill, or a node without any links is not going to
316341 // change its value ever again, so exclude it from iterations.
317- if (nodes[n].mustSpill ())
342+ if (nodes. get () [n].mustSpill ())
318343 continue ;
319- if (nodes[n].preferReg ())
344+ if (nodes. get () [n].preferReg ())
320345 RecentPositive.push_back (n);
321346 }
322347 return !RecentPositive.empty ();
323348}
324349
325350bool SpillPlacement::update (unsigned n) {
326- if (!nodes[n].update (nodes, Threshold))
351+ if (!nodes. get () [n].update (nodes. get () , Threshold))
327352 return false ;
328- nodes[n].getDissentingNeighbors (TodoList, nodes);
353+ nodes. get () [n].getDissentingNeighbors (TodoList, nodes. get () );
329354 return true ;
330355}
331356
@@ -345,7 +370,7 @@ void SpillPlacement::iterate() {
345370 unsigned n = TodoList.pop_back_val ();
346371 if (!update (n))
347372 continue ;
348- if (nodes[n].preferReg ())
373+ if (nodes. get () [n].preferReg ())
349374 RecentPositive.push_back (n);
350375 }
351376}
@@ -366,7 +391,7 @@ SpillPlacement::finish() {
366391 // Write preferences back to ActiveNodes.
367392 bool Perfect = true ;
368393 for (unsigned n : ActiveNodes->set_bits ())
369- if (!nodes[n].preferReg ()) {
394+ if (!nodes. get () [n].preferReg ()) {
370395 ActiveNodes->reset (n);
371396 Perfect = false ;
372397 }
0 commit comments