diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2019-12-20 19:53:05 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2019-12-20 19:53:05 +0000 |
| commit | 0b57cec536236d46e3dba9bd041533462f33dbb7 (patch) | |
| tree | 56229dbdbbf76d18580f72f789003db17246c8d9 /contrib/llvm/lib/CodeGen/MachineLoopInfo.cpp | |
| parent | 718ef55ec7785aae63f98f8ca05dc07ed399c16d (diff) | |
Notes
Diffstat (limited to 'contrib/llvm/lib/CodeGen/MachineLoopInfo.cpp')
| -rw-r--r-- | contrib/llvm/lib/CodeGen/MachineLoopInfo.cpp | 145 |
1 files changed, 0 insertions, 145 deletions
diff --git a/contrib/llvm/lib/CodeGen/MachineLoopInfo.cpp b/contrib/llvm/lib/CodeGen/MachineLoopInfo.cpp deleted file mode 100644 index 3b8b430d1b0f..000000000000 --- a/contrib/llvm/lib/CodeGen/MachineLoopInfo.cpp +++ /dev/null @@ -1,145 +0,0 @@ -//===- MachineLoopInfo.cpp - Natural Loop Calculator ----------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// This file defines the MachineLoopInfo class that is used to identify natural -// loops and determine the loop depth of various nodes of the CFG. Note that -// the loops identified may actually be several natural loops that share the -// same header node... not just a single natural loop. -// -//===----------------------------------------------------------------------===// - -#include "llvm/CodeGen/MachineLoopInfo.h" -#include "llvm/Analysis/LoopInfoImpl.h" -#include "llvm/CodeGen/MachineDominators.h" -#include "llvm/CodeGen/Passes.h" -#include "llvm/Config/llvm-config.h" -#include "llvm/Support/Debug.h" -#include "llvm/Support/raw_ostream.h" -using namespace llvm; - -// Explicitly instantiate methods in LoopInfoImpl.h for MI-level Loops. -template class llvm::LoopBase<MachineBasicBlock, MachineLoop>; -template class llvm::LoopInfoBase<MachineBasicBlock, MachineLoop>; - -char MachineLoopInfo::ID = 0; -INITIALIZE_PASS_BEGIN(MachineLoopInfo, "machine-loops", - "Machine Natural Loop Construction", true, true) -INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree) -INITIALIZE_PASS_END(MachineLoopInfo, "machine-loops", - "Machine Natural Loop Construction", true, true) - -char &llvm::MachineLoopInfoID = MachineLoopInfo::ID; - -bool MachineLoopInfo::runOnMachineFunction(MachineFunction &) { - releaseMemory(); - LI.analyze(getAnalysis<MachineDominatorTree>().getBase()); - return false; -} - -void MachineLoopInfo::getAnalysisUsage(AnalysisUsage &AU) const { - AU.setPreservesAll(); - AU.addRequired<MachineDominatorTree>(); - MachineFunctionPass::getAnalysisUsage(AU); -} - -MachineBasicBlock *MachineLoop::getTopBlock() { - MachineBasicBlock *TopMBB = getHeader(); - MachineFunction::iterator Begin = TopMBB->getParent()->begin(); - if (TopMBB->getIterator() != Begin) { - MachineBasicBlock *PriorMBB = &*std::prev(TopMBB->getIterator()); - while (contains(PriorMBB)) { - TopMBB = PriorMBB; - if (TopMBB->getIterator() == Begin) - break; - PriorMBB = &*std::prev(TopMBB->getIterator()); - } - } - return TopMBB; -} - -MachineBasicBlock *MachineLoop::getBottomBlock() { - MachineBasicBlock *BotMBB = getHeader(); - MachineFunction::iterator End = BotMBB->getParent()->end(); - if (BotMBB->getIterator() != std::prev(End)) { - MachineBasicBlock *NextMBB = &*std::next(BotMBB->getIterator()); - while (contains(NextMBB)) { - BotMBB = NextMBB; - if (BotMBB == &*std::next(BotMBB->getIterator())) - break; - NextMBB = &*std::next(BotMBB->getIterator()); - } - } - return BotMBB; -} - -MachineBasicBlock *MachineLoop::findLoopControlBlock() { - if (MachineBasicBlock *Latch = getLoopLatch()) { - if (isLoopExiting(Latch)) - return Latch; - else - return getExitingBlock(); - } - return nullptr; -} - -DebugLoc MachineLoop::getStartLoc() const { - // Try the pre-header first. - if (MachineBasicBlock *PHeadMBB = getLoopPreheader()) - if (const BasicBlock *PHeadBB = PHeadMBB->getBasicBlock()) - if (DebugLoc DL = PHeadBB->getTerminator()->getDebugLoc()) - return DL; - - // If we have no pre-header or there are no instructions with debug - // info in it, try the header. - if (MachineBasicBlock *HeadMBB = getHeader()) - if (const BasicBlock *HeadBB = HeadMBB->getBasicBlock()) - return HeadBB->getTerminator()->getDebugLoc(); - - return DebugLoc(); -} - -MachineBasicBlock * -MachineLoopInfo::findLoopPreheader(MachineLoop *L, - bool SpeculativePreheader) const { - if (MachineBasicBlock *PB = L->getLoopPreheader()) - return PB; - - if (!SpeculativePreheader) - return nullptr; - - MachineBasicBlock *HB = L->getHeader(), *LB = L->getLoopLatch(); - if (HB->pred_size() != 2 || HB->hasAddressTaken()) - return nullptr; - // Find the predecessor of the header that is not the latch block. - MachineBasicBlock *Preheader = nullptr; - for (MachineBasicBlock *P : HB->predecessors()) { - if (P == LB) - continue; - // Sanity. - if (Preheader) - return nullptr; - Preheader = P; - } - - // Check if the preheader candidate is a successor of any other loop - // headers. We want to avoid having two loop setups in the same block. - for (MachineBasicBlock *S : Preheader->successors()) { - if (S == HB) - continue; - MachineLoop *T = getLoopFor(S); - if (T && T->getHeader() == S) - return nullptr; - } - return Preheader; -} - -#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) -LLVM_DUMP_METHOD void MachineLoop::dump() const { - print(dbgs()); -} -#endif |
