@@ -44,17 +44,17 @@ using namespace llvm;
44
44
45
45
#define DEBUG_TYPE " spill-code-placement"
46
46
47
- char SpillPlacement ::ID = 0 ;
47
+ char SpillPlacementWrapperLegacy ::ID = 0 ;
48
48
49
- char &llvm::SpillPlacementID = SpillPlacement ::ID;
49
+ char &llvm::SpillPlacementID = SpillPlacementWrapperLegacy ::ID;
50
50
51
- INITIALIZE_PASS_BEGIN (SpillPlacement , DEBUG_TYPE,
51
+ INITIALIZE_PASS_BEGIN (SpillPlacementWrapperLegacy , DEBUG_TYPE,
52
52
" Spill Code Placement Analysis" , true , true )
53
53
INITIALIZE_PASS_DEPENDENCY(EdgeBundlesWrapperLegacy)
54
- INITIALIZE_PASS_END(SpillPlacement , DEBUG_TYPE,
54
+ INITIALIZE_PASS_END(SpillPlacementWrapperLegacy , DEBUG_TYPE,
55
55
" Spill Code Placement Analysis" , true , true )
56
56
57
- void SpillPlacement ::getAnalysisUsage(AnalysisUsage &AU) const {
57
+ void SpillPlacementWrapperLegacy ::getAnalysisUsage(AnalysisUsage &AU) const {
58
58
AU.setPreservesAll ();
59
59
AU.addRequired <MachineBlockFrequencyInfoWrapperPass>();
60
60
AU.addRequiredTransitive <EdgeBundlesWrapperLegacy>();
@@ -189,32 +189,57 @@ struct SpillPlacement::Node {
189
189
}
190
190
};
191
191
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) {
193
229
MF = &mf;
194
- bundles = &getAnalysis<EdgeBundlesWrapperLegacy>().getEdgeBundles ();
195
230
196
231
assert (!nodes && " Leaking node array" );
197
- nodes = new Node[bundles->getNumBundles ()];
232
+ nodes. reset ( new Node[bundles->getNumBundles ()]) ;
198
233
TodoList.clear ();
199
234
TodoList.setUniverse (bundles->getNumBundles ());
200
235
201
236
// Compute total ingoing and outgoing block frequencies for all bundles.
202
237
BlockFrequencies.resize (mf.getNumBlockIDs ());
203
- MBFI = &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI ();
204
238
setThreshold (MBFI->getEntryFreq ());
205
239
for (auto &I : mf) {
206
240
unsigned Num = I.getNumber ();
207
241
BlockFrequencies[Num] = MBFI->getBlockFreq (&I);
208
242
}
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 ();
218
243
}
219
244
220
245
// / activate - mark node n as active if it wasn't already.
@@ -223,7 +248,7 @@ void SpillPlacement::activate(unsigned n) {
223
248
if (ActiveNodes->test (n))
224
249
return ;
225
250
ActiveNodes->set (n);
226
- nodes[n].clear (Threshold);
251
+ nodes. get () [n].clear (Threshold);
227
252
228
253
// Very large bundles usually come from big switches, indirect branches,
229
254
// landing pads, or loops with many 'continue' statements. It is difficult to
@@ -235,10 +260,10 @@ void SpillPlacement::activate(unsigned n) {
235
260
// limiting the number of blocks visited and the number of links in the
236
261
// Hopfield network.
237
262
if (bundles->getBlocks (n).size () > 100 ) {
238
- nodes[n].BiasP = BlockFrequency (0 );
263
+ nodes. get () [n].BiasP = BlockFrequency (0 );
239
264
BlockFrequency BiasN = MBFI->getEntryFreq ();
240
265
BiasN >>= 4 ;
241
- nodes[n].BiasN = BiasN;
266
+ nodes. get () [n].BiasN = BiasN;
242
267
}
243
268
}
244
269
@@ -265,14 +290,14 @@ void SpillPlacement::addConstraints(ArrayRef<BlockConstraint> LiveBlocks) {
265
290
if (LB.Entry != DontCare) {
266
291
unsigned ib = bundles->getBundle (LB.Number , false );
267
292
activate (ib);
268
- nodes[ib].addBias (Freq, LB.Entry );
293
+ nodes. get () [ib].addBias (Freq, LB.Entry );
269
294
}
270
295
271
296
// Live-out from block?
272
297
if (LB.Exit != DontCare) {
273
298
unsigned ob = bundles->getBundle (LB.Number , true );
274
299
activate (ob);
275
- nodes[ob].addBias (Freq, LB.Exit );
300
+ nodes. get () [ob].addBias (Freq, LB.Exit );
276
301
}
277
302
}
278
303
}
@@ -287,8 +312,8 @@ void SpillPlacement::addPrefSpill(ArrayRef<unsigned> Blocks, bool Strong) {
287
312
unsigned ob = bundles->getBundle (B, true );
288
313
activate (ib);
289
314
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);
292
317
}
293
318
}
294
319
@@ -303,8 +328,8 @@ void SpillPlacement::addLinks(ArrayRef<unsigned> Links) {
303
328
activate (ib);
304
329
activate (ob);
305
330
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);
308
333
}
309
334
}
310
335
@@ -314,18 +339,18 @@ bool SpillPlacement::scanActiveBundles() {
314
339
update (n);
315
340
// A node that must spill, or a node without any links is not going to
316
341
// change its value ever again, so exclude it from iterations.
317
- if (nodes[n].mustSpill ())
342
+ if (nodes. get () [n].mustSpill ())
318
343
continue ;
319
- if (nodes[n].preferReg ())
344
+ if (nodes. get () [n].preferReg ())
320
345
RecentPositive.push_back (n);
321
346
}
322
347
return !RecentPositive.empty ();
323
348
}
324
349
325
350
bool SpillPlacement::update (unsigned n) {
326
- if (!nodes[n].update (nodes, Threshold))
351
+ if (!nodes. get () [n].update (nodes. get () , Threshold))
327
352
return false ;
328
- nodes[n].getDissentingNeighbors (TodoList, nodes);
353
+ nodes. get () [n].getDissentingNeighbors (TodoList, nodes. get () );
329
354
return true ;
330
355
}
331
356
@@ -345,7 +370,7 @@ void SpillPlacement::iterate() {
345
370
unsigned n = TodoList.pop_back_val ();
346
371
if (!update (n))
347
372
continue ;
348
- if (nodes[n].preferReg ())
373
+ if (nodes. get () [n].preferReg ())
349
374
RecentPositive.push_back (n);
350
375
}
351
376
}
@@ -366,7 +391,7 @@ SpillPlacement::finish() {
366
391
// Write preferences back to ActiveNodes.
367
392
bool Perfect = true ;
368
393
for (unsigned n : ActiveNodes->set_bits ())
369
- if (!nodes[n].preferReg ()) {
394
+ if (!nodes. get () [n].preferReg ()) {
370
395
ActiveNodes->reset (n);
371
396
Perfect = false ;
372
397
}
0 commit comments