Lines Matching full:restore
13 // (resp. Restore).
16 // between 2) two executions of the Save (resp. Restore) point there is an
17 // execution of the Restore (resp. Save) point.
23 // Restore
25 // Indeed, the execution looks like Save -> Restore -> Save -> Restore ...
33 // Restore
35 // Indeed, the execution looks like Save -> Save -> ... -> Restore -> Restore.
62 // For property #1 for Restore.
111 MachineBasicBlock *Restore; member in __anon084c4c750111::ShrinkWrap
115 /// Hold the loop information. Used to determine if Save and Restore
134 /// after Save and before Restore.
152 /// \brief Update the Save and Restore points such that \p MBB is in
153 /// the region that is dominated by Save and post-dominated by Restore
154 /// and Save and Restore still match the safe point definition.
155 /// Such point may not exist and Save and/or Restore may be null after
165 Restore = nullptr; in init()
179 /// Check whether or not Save and Restore points are still interesting for
181 bool ArePointsInteresting() const { return Save != Entry && Save && Restore; } in ArePointsInteresting()
285 if (!Restore) in updateSaveRestorePoints()
286 Restore = &MBB; in updateSaveRestorePoints()
288 Restore = MPDT->findNearestCommonDominator(Restore, &MBB); in updateSaveRestorePoints()
290 // Make sure we would be able to insert the restore code before the in updateSaveRestorePoints()
292 if (Restore == &MBB) { in updateSaveRestorePoints()
296 // One of the terminator needs to happen before the restore point. in updateSaveRestorePoints()
298 Restore = nullptr; in updateSaveRestorePoints()
301 // Look for a restore point that post-dominates all the successors. in updateSaveRestorePoints()
303 Restore = FindIDom<>(*Restore, Restore->successors(), *MPDT); in updateSaveRestorePoints()
308 if (!Restore) { in updateSaveRestorePoints()
309 DEBUG(dbgs() << "Restore point needs to be spanned on several blocks\n"); in updateSaveRestorePoints()
313 // Make sure Save and Restore are suitable for shrink-wrapping: in updateSaveRestorePoints()
314 // 1. all path from Save needs to lead to Restore before exiting. in updateSaveRestorePoints()
315 // 2. all path to Restore needs to go through Save from Entry. in updateSaveRestorePoints()
317 // A. Save dominates Restore. in updateSaveRestorePoints()
318 // B. Restore post-dominates Save. in updateSaveRestorePoints()
319 // C. Save and Restore are in the same loop. in updateSaveRestorePoints()
322 while (Save && Restore && in updateSaveRestorePoints()
323 (!(SaveDominatesRestore = MDT->dominates(Save, Restore)) || in updateSaveRestorePoints()
324 !(RestorePostDominatesSave = MPDT->dominates(Restore, Save)) || in updateSaveRestorePoints()
330 // Restore in updateSaveRestorePoints()
336 // by Restore. However, the CSRs uses are still reachable after in updateSaveRestorePoints()
337 // Restore and before Save are executed. in updateSaveRestorePoints()
339 // For now, just push the restore/save points outside of loops. in updateSaveRestorePoints()
342 MLI->getLoopFor(Save) || MLI->getLoopFor(Restore))) { in updateSaveRestorePoints()
345 Save = MDT->findNearestCommonDominator(Save, Restore); in updateSaveRestorePoints()
350 Restore = MPDT->findNearestCommonDominator(Restore, Save); in updateSaveRestorePoints()
353 if (Save && Restore && in updateSaveRestorePoints()
354 (MLI->getLoopFor(Save) || MLI->getLoopFor(Restore))) { in updateSaveRestorePoints()
355 if (MLI->getLoopDepth(Save) > MLI->getLoopDepth(Restore)) { in updateSaveRestorePoints()
365 MLI->getLoopFor(Restore)->getExitingBlocks(ExitBlocks); in updateSaveRestorePoints()
366 // Push Restore outside of this loop. in updateSaveRestorePoints()
368 MachineBasicBlock *IPdom = Restore; in updateSaveRestorePoints()
377 if (IPdom && MLI->getLoopDepth(IPdom) < MLI->getLoopDepth(Restore)) in updateSaveRestorePoints()
378 Restore = IPdom; in updateSaveRestorePoints()
380 Restore = nullptr; in updateSaveRestorePoints()
458 // Save (resp. restore) point must dominate (resp. post dominate) in runOnMachineFunction()
462 // save/restore instructions, just give up. in runOnMachineFunction()
476 assert(!Save && !Restore && "We miss a shrink-wrap opportunity?!"); in runOnMachineFunction()
489 << Restore->getNumber() << ' ' << Restore->getName() << ' ' in runOnMachineFunction()
490 << MBFI->getBlockFreq(Restore).getFrequency() << '\n'); in runOnMachineFunction()
494 EntryFreq >= MBFI->getBlockFreq(Restore).getFrequency()) && in runOnMachineFunction()
496 TFI->canUseAsEpilogue(*Restore))) in runOnMachineFunction()
506 // Restore is expensive. in runOnMachineFunction()
507 Restore = FindIDom<>(*Restore, Restore->successors(), *MPDT); in runOnMachineFunction()
508 if (!Restore) in runOnMachineFunction()
510 NewBB = Restore; in runOnMachineFunction()
513 } while (Save && Restore); in runOnMachineFunction()
522 << Restore->getNumber() << ' ' << Restore->getName() << '\n'); in runOnMachineFunction()
526 MFI->setRestorePoint(Restore); in runOnMachineFunction()