2626//
2727// ===----------------------------------------------------------------------===//
2828
29- #include " SpillPlacement.h"
29+ #include " llvm/CodeGen/ SpillPlacement.h"
3030#include " llvm/ADT/BitVector.h"
3131#include " llvm/CodeGen/EdgeBundles.h"
3232#include " llvm/CodeGen/MachineBasicBlock.h"
@@ -193,8 +193,7 @@ bool SpillPlacementWrapperLegacy::runOnMachineFunction(MachineFunction &MF) {
193193 auto *Bundles = &getAnalysis<EdgeBundlesWrapperLegacy>().getEdgeBundles ();
194194 auto *MBFI = &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI ();
195195
196- Impl.reset (new SpillPlacement (Bundles, MBFI));
197- Impl->run (MF);
196+ Impl.run (MF, Bundles, MBFI);
198197 return false ;
199198}
200199
@@ -205,17 +204,17 @@ SpillPlacementAnalysis::run(MachineFunction &MF,
205204 MachineFunctionAnalysisManager &MFAM) {
206205 auto *Bundles = &MFAM.getResult <EdgeBundlesAnalysis>(MF);
207206 auto *MBFI = &MFAM.getResult <MachineBlockFrequencyAnalysis>(MF);
208- SpillPlacement Impl (Bundles, MBFI) ;
209- Impl.run (MF);
207+ SpillPlacement Impl;
208+ Impl.run (MF, Bundles, MBFI );
210209 return Impl;
211210}
212211
213212bool SpillPlacementAnalysis::Result::invalidate (
214213 MachineFunction &MF, const PreservedAnalyses &PA,
215214 MachineFunctionAnalysisManager::Invalidator &Inv) {
216215 auto PAC = PA.getChecker <SpillPlacementAnalysis>();
217- return !( PAC.preserved () ||
218- PAC.preservedSet <AllAnalysesOn<MachineFunction>>()) ||
216+ return (! PAC.preserved () &&
217+ ! PAC.preservedSet <AllAnalysesOn<MachineFunction>>()) ||
219218 Inv.invalidate <EdgeBundlesAnalysis>(MF, PA) ||
220219 Inv.invalidate <MachineBlockFrequencyAnalysis>(MF, PA);
221220}
@@ -225,8 +224,11 @@ void SpillPlacement::arrayDeleter(Node *N) {
225224 delete[] N;
226225}
227226
228- void SpillPlacement::run (MachineFunction &mf) {
227+ void SpillPlacement::run (MachineFunction &mf, EdgeBundles *Bundles,
228+ MachineBlockFrequencyInfo *MBFI) {
229229 MF = &mf;
230+ this ->bundles = Bundles;
231+ this ->MBFI = MBFI;
230232
231233 assert (!nodes && " Leaking node array" );
232234 nodes.reset (new Node[bundles->getNumBundles ()]);
@@ -248,7 +250,7 @@ void SpillPlacement::activate(unsigned n) {
248250 if (ActiveNodes->test (n))
249251 return ;
250252 ActiveNodes->set (n);
251- nodes. get () [n].clear (Threshold);
253+ nodes[n].clear (Threshold);
252254
253255 // Very large bundles usually come from big switches, indirect branches,
254256 // landing pads, or loops with many 'continue' statements. It is difficult to
@@ -260,10 +262,10 @@ void SpillPlacement::activate(unsigned n) {
260262 // limiting the number of blocks visited and the number of links in the
261263 // Hopfield network.
262264 if (bundles->getBlocks (n).size () > 100 ) {
263- nodes. get () [n].BiasP = BlockFrequency (0 );
265+ nodes[n].BiasP = BlockFrequency (0 );
264266 BlockFrequency BiasN = MBFI->getEntryFreq ();
265267 BiasN >>= 4 ;
266- nodes. get () [n].BiasN = BiasN;
268+ nodes[n].BiasN = BiasN;
267269 }
268270}
269271
@@ -290,14 +292,14 @@ void SpillPlacement::addConstraints(ArrayRef<BlockConstraint> LiveBlocks) {
290292 if (LB.Entry != DontCare) {
291293 unsigned ib = bundles->getBundle (LB.Number , false );
292294 activate (ib);
293- nodes. get () [ib].addBias (Freq, LB.Entry );
295+ nodes[ib].addBias (Freq, LB.Entry );
294296 }
295297
296298 // Live-out from block?
297299 if (LB.Exit != DontCare) {
298300 unsigned ob = bundles->getBundle (LB.Number , true );
299301 activate (ob);
300- nodes. get () [ob].addBias (Freq, LB.Exit );
302+ nodes[ob].addBias (Freq, LB.Exit );
301303 }
302304 }
303305}
@@ -312,8 +314,8 @@ void SpillPlacement::addPrefSpill(ArrayRef<unsigned> Blocks, bool Strong) {
312314 unsigned ob = bundles->getBundle (B, true );
313315 activate (ib);
314316 activate (ob);
315- nodes. get () [ib].addBias (Freq, PrefSpill);
316- nodes. get () [ob].addBias (Freq, PrefSpill);
317+ nodes[ib].addBias (Freq, PrefSpill);
318+ nodes[ob].addBias (Freq, PrefSpill);
317319 }
318320}
319321
@@ -328,8 +330,8 @@ void SpillPlacement::addLinks(ArrayRef<unsigned> Links) {
328330 activate (ib);
329331 activate (ob);
330332 BlockFrequency Freq = BlockFrequencies[Number];
331- nodes. get () [ib].addLink (ob, Freq);
332- nodes. get () [ob].addLink (ib, Freq);
333+ nodes[ib].addLink (ob, Freq);
334+ nodes[ob].addLink (ib, Freq);
333335 }
334336}
335337
@@ -339,18 +341,18 @@ bool SpillPlacement::scanActiveBundles() {
339341 update (n);
340342 // A node that must spill, or a node without any links is not going to
341343 // change its value ever again, so exclude it from iterations.
342- if (nodes. get () [n].mustSpill ())
344+ if (nodes[n].mustSpill ())
343345 continue ;
344- if (nodes. get () [n].preferReg ())
346+ if (nodes[n].preferReg ())
345347 RecentPositive.push_back (n);
346348 }
347349 return !RecentPositive.empty ();
348350}
349351
350352bool SpillPlacement::update (unsigned n) {
351- if (!nodes. get () [n].update (nodes.get (), Threshold))
353+ if (!nodes[n].update (nodes.get (), Threshold))
352354 return false ;
353- nodes. get () [n].getDissentingNeighbors (TodoList, nodes.get ());
355+ nodes[n].getDissentingNeighbors (TodoList, nodes.get ());
354356 return true ;
355357}
356358
@@ -370,7 +372,7 @@ void SpillPlacement::iterate() {
370372 unsigned n = TodoList.pop_back_val ();
371373 if (!update (n))
372374 continue ;
373- if (nodes. get () [n].preferReg ())
375+ if (nodes[n].preferReg ())
374376 RecentPositive.push_back (n);
375377 }
376378}
@@ -391,7 +393,7 @@ SpillPlacement::finish() {
391393 // Write preferences back to ActiveNodes.
392394 bool Perfect = true ;
393395 for (unsigned n : ActiveNodes->set_bits ())
394- if (!nodes. get () [n].preferReg ()) {
396+ if (!nodes[n].preferReg ()) {
395397 ActiveNodes->reset (n);
396398 Perfect = false ;
397399 }
0 commit comments