26
26
//
27
27
// ===----------------------------------------------------------------------===//
28
28
29
- #include " SpillPlacement.h"
29
+ #include " llvm/CodeGen/ SpillPlacement.h"
30
30
#include " llvm/ADT/BitVector.h"
31
31
#include " llvm/CodeGen/EdgeBundles.h"
32
32
#include " llvm/CodeGen/MachineBasicBlock.h"
@@ -193,8 +193,7 @@ bool SpillPlacementWrapperLegacy::runOnMachineFunction(MachineFunction &MF) {
193
193
auto *Bundles = &getAnalysis<EdgeBundlesWrapperLegacy>().getEdgeBundles ();
194
194
auto *MBFI = &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI ();
195
195
196
- Impl.reset (new SpillPlacement (Bundles, MBFI));
197
- Impl->run (MF);
196
+ Impl.run (MF, Bundles, MBFI);
198
197
return false ;
199
198
}
200
199
@@ -205,17 +204,17 @@ SpillPlacementAnalysis::run(MachineFunction &MF,
205
204
MachineFunctionAnalysisManager &MFAM) {
206
205
auto *Bundles = &MFAM.getResult <EdgeBundlesAnalysis>(MF);
207
206
auto *MBFI = &MFAM.getResult <MachineBlockFrequencyAnalysis>(MF);
208
- SpillPlacement Impl (Bundles, MBFI) ;
209
- Impl.run (MF);
207
+ SpillPlacement Impl;
208
+ Impl.run (MF, Bundles, MBFI );
210
209
return Impl;
211
210
}
212
211
213
212
bool SpillPlacementAnalysis::Result::invalidate (
214
213
MachineFunction &MF, const PreservedAnalyses &PA,
215
214
MachineFunctionAnalysisManager::Invalidator &Inv) {
216
215
auto PAC = PA.getChecker <SpillPlacementAnalysis>();
217
- return !( PAC.preserved () ||
218
- PAC.preservedSet <AllAnalysesOn<MachineFunction>>()) ||
216
+ return (! PAC.preserved () &&
217
+ ! PAC.preservedSet <AllAnalysesOn<MachineFunction>>()) ||
219
218
Inv.invalidate <EdgeBundlesAnalysis>(MF, PA) ||
220
219
Inv.invalidate <MachineBlockFrequencyAnalysis>(MF, PA);
221
220
}
@@ -225,8 +224,11 @@ void SpillPlacement::arrayDeleter(Node *N) {
225
224
delete[] N;
226
225
}
227
226
228
- void SpillPlacement::run (MachineFunction &mf) {
227
+ void SpillPlacement::run (MachineFunction &mf, EdgeBundles *Bundles,
228
+ MachineBlockFrequencyInfo *MBFI) {
229
229
MF = &mf;
230
+ this ->bundles = Bundles;
231
+ this ->MBFI = MBFI;
230
232
231
233
assert (!nodes && " Leaking node array" );
232
234
nodes.reset (new Node[bundles->getNumBundles ()]);
@@ -248,7 +250,7 @@ void SpillPlacement::activate(unsigned n) {
248
250
if (ActiveNodes->test (n))
249
251
return ;
250
252
ActiveNodes->set (n);
251
- nodes. get () [n].clear (Threshold);
253
+ nodes[n].clear (Threshold);
252
254
253
255
// Very large bundles usually come from big switches, indirect branches,
254
256
// landing pads, or loops with many 'continue' statements. It is difficult to
@@ -260,10 +262,10 @@ void SpillPlacement::activate(unsigned n) {
260
262
// limiting the number of blocks visited and the number of links in the
261
263
// Hopfield network.
262
264
if (bundles->getBlocks (n).size () > 100 ) {
263
- nodes. get () [n].BiasP = BlockFrequency (0 );
265
+ nodes[n].BiasP = BlockFrequency (0 );
264
266
BlockFrequency BiasN = MBFI->getEntryFreq ();
265
267
BiasN >>= 4 ;
266
- nodes. get () [n].BiasN = BiasN;
268
+ nodes[n].BiasN = BiasN;
267
269
}
268
270
}
269
271
@@ -290,14 +292,14 @@ void SpillPlacement::addConstraints(ArrayRef<BlockConstraint> LiveBlocks) {
290
292
if (LB.Entry != DontCare) {
291
293
unsigned ib = bundles->getBundle (LB.Number , false );
292
294
activate (ib);
293
- nodes. get () [ib].addBias (Freq, LB.Entry );
295
+ nodes[ib].addBias (Freq, LB.Entry );
294
296
}
295
297
296
298
// Live-out from block?
297
299
if (LB.Exit != DontCare) {
298
300
unsigned ob = bundles->getBundle (LB.Number , true );
299
301
activate (ob);
300
- nodes. get () [ob].addBias (Freq, LB.Exit );
302
+ nodes[ob].addBias (Freq, LB.Exit );
301
303
}
302
304
}
303
305
}
@@ -312,8 +314,8 @@ void SpillPlacement::addPrefSpill(ArrayRef<unsigned> Blocks, bool Strong) {
312
314
unsigned ob = bundles->getBundle (B, true );
313
315
activate (ib);
314
316
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);
317
319
}
318
320
}
319
321
@@ -328,8 +330,8 @@ void SpillPlacement::addLinks(ArrayRef<unsigned> Links) {
328
330
activate (ib);
329
331
activate (ob);
330
332
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);
333
335
}
334
336
}
335
337
@@ -339,18 +341,18 @@ bool SpillPlacement::scanActiveBundles() {
339
341
update (n);
340
342
// A node that must spill, or a node without any links is not going to
341
343
// change its value ever again, so exclude it from iterations.
342
- if (nodes. get () [n].mustSpill ())
344
+ if (nodes[n].mustSpill ())
343
345
continue ;
344
- if (nodes. get () [n].preferReg ())
346
+ if (nodes[n].preferReg ())
345
347
RecentPositive.push_back (n);
346
348
}
347
349
return !RecentPositive.empty ();
348
350
}
349
351
350
352
bool SpillPlacement::update (unsigned n) {
351
- if (!nodes. get () [n].update (nodes.get (), Threshold))
353
+ if (!nodes[n].update (nodes.get (), Threshold))
352
354
return false ;
353
- nodes. get () [n].getDissentingNeighbors (TodoList, nodes.get ());
355
+ nodes[n].getDissentingNeighbors (TodoList, nodes.get ());
354
356
return true ;
355
357
}
356
358
@@ -370,7 +372,7 @@ void SpillPlacement::iterate() {
370
372
unsigned n = TodoList.pop_back_val ();
371
373
if (!update (n))
372
374
continue ;
373
- if (nodes. get () [n].preferReg ())
375
+ if (nodes[n].preferReg ())
374
376
RecentPositive.push_back (n);
375
377
}
376
378
}
@@ -391,7 +393,7 @@ SpillPlacement::finish() {
391
393
// Write preferences back to ActiveNodes.
392
394
bool Perfect = true ;
393
395
for (unsigned n : ActiveNodes->set_bits ())
394
- if (!nodes. get () [n].preferReg ()) {
396
+ if (!nodes[n].preferReg ()) {
395
397
ActiveNodes->reset (n);
396
398
Perfect = false ;
397
399
}
0 commit comments