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"
@@ -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,64 @@ 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.run (MF, Bundles, MBFI);
197+ return false ;
198+ }
199+
200+ AnalysisKey SpillPlacementAnalysis::Key;
201+
202+ SpillPlacement
203+ SpillPlacementAnalysis::run (MachineFunction &MF,
204+ MachineFunctionAnalysisManager &MFAM) {
205+ auto *Bundles = &MFAM.getResult <EdgeBundlesAnalysis>(MF);
206+ auto *MBFI = &MFAM.getResult <MachineBlockFrequencyAnalysis>(MF);
207+ SpillPlacement Impl;
208+ Impl.run (MF, Bundles, MBFI);
209+ return Impl;
210+ }
211+
212+ bool SpillPlacementAnalysis::Result::invalidate (
213+ MachineFunction &MF, const PreservedAnalyses &PA,
214+ MachineFunctionAnalysisManager::Invalidator &Inv) {
215+ auto PAC = PA.getChecker <SpillPlacementAnalysis>();
216+ if (!PAC.preserved () && !PAC.preservedSet <AllAnalysesOn<MachineFunction>>())
217+ return true ;
218+ // Check dependencies.
219+ return Inv.invalidate <EdgeBundlesAnalysis>(MF, PA) ||
220+ Inv.invalidate <MachineBlockFrequencyAnalysis>(MF, PA);
221+ }
222+
223+ SpillPlacement::SpillPlacement () = default;
224+ SpillPlacement::~SpillPlacement () = default ;
225+ SpillPlacement::SpillPlacement (SpillPlacement &&) = default;
226+
227+ void SpillPlacement::releaseMemory () {
228+ nodes.reset ();
229+ TodoList.clear ();
230+ }
231+
232+ void SpillPlacement::run (MachineFunction &mf, EdgeBundles *Bundles,
233+ MachineBlockFrequencyInfo *MBFI) {
193234 MF = &mf;
194- bundles = &getAnalysis<EdgeBundlesWrapperLegacy>().getEdgeBundles ();
235+ this ->bundles = Bundles;
236+ this ->MBFI = MBFI;
195237
196238 assert (!nodes && " Leaking node array" );
197- nodes = new Node[bundles->getNumBundles ()];
239+ nodes. reset ( new Node[bundles->getNumBundles ()]) ;
198240 TodoList.clear ();
199241 TodoList.setUniverse (bundles->getNumBundles ());
200242
201243 // Compute total ingoing and outgoing block frequencies for all bundles.
202244 BlockFrequencies.resize (mf.getNumBlockIDs ());
203- MBFI = &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI ();
204245 setThreshold (MBFI->getEntryFreq ());
205246 for (auto &I : mf) {
206247 unsigned Num = I.getNumber ();
207248 BlockFrequencies[Num] = MBFI->getBlockFreq (&I);
208249 }
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 ();
218250}
219251
220252// / activate - mark node n as active if it wasn't already.
@@ -323,9 +355,9 @@ bool SpillPlacement::scanActiveBundles() {
323355}
324356
325357bool SpillPlacement::update (unsigned n) {
326- if (!nodes[n].update (nodes, Threshold))
358+ if (!nodes[n].update (nodes. get () , Threshold))
327359 return false ;
328- nodes[n].getDissentingNeighbors (TodoList, nodes);
360+ nodes[n].getDissentingNeighbors (TodoList, nodes. get () );
329361 return true ;
330362}
331363
0 commit comments