diff options
| author | Sam Parker <sam.parker@arm.com> | 2020-01-09 08:33:47 +0000 |
|---|---|---|
| committer | Sam Parker <sam.parker@arm.com> | 2020-01-09 08:33:47 +0000 |
| commit | e93e0d413f3afa1df5c5f88df546bebcd1183155 (patch) | |
| tree | 755777ed531f0de1c70783b622d3c577f9fb53d3 /llvm/lib/Target | |
| parent | 2d515e49d89c0738ccef8f1733d5f9afe00ee979 (diff) | |
| download | bcm5719-llvm-e93e0d413f3afa1df5c5f88df546bebcd1183155.tar.gz bcm5719-llvm-e93e0d413f3afa1df5c5f88df546bebcd1183155.zip | |
[ARM][LowOverheadLoops] Update liveness info
After expanding the pseudo instructions, update the liveness info.
We do this in a post-order traversal of the loop, including its
exit blocks and preheader(s).
Differential Revision: https://reviews.llvm.org/D72131
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMLowOverheadLoops.cpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/ARMLowOverheadLoops.cpp b/llvm/lib/Target/ARM/ARMLowOverheadLoops.cpp index 31a98d86a54..d8b6a0e47d0 100644 --- a/llvm/lib/Target/ARM/ARMLowOverheadLoops.cpp +++ b/llvm/lib/Target/ARM/ARMLowOverheadLoops.cpp @@ -43,6 +43,61 @@ using namespace llvm; namespace { + class PostOrderLoopTraversal { + MachineLoop &ML; + MachineLoopInfo &MLI; + SmallPtrSet<MachineBasicBlock*, 4> Visited; + SmallVector<MachineBasicBlock*, 4> Order; + + public: + PostOrderLoopTraversal(MachineLoop &ML, MachineLoopInfo &MLI) + : ML(ML), MLI(MLI) { } + + const SmallVectorImpl<MachineBasicBlock*> &getOrder() const { + return Order; + } + + // Visit all the blocks within the loop, as well as exit blocks and any + // blocks properly dominating the header. + void ProcessLoop() { + std::function<void(MachineBasicBlock*)> Search = [this, &Search] + (MachineBasicBlock *MBB) -> void { + if (Visited.count(MBB)) + return; + + Visited.insert(MBB); + for (auto *Succ : MBB->successors()) { + if (!ML.contains(Succ)) + continue; + Search(Succ); + } + Order.push_back(MBB); + }; + + // Insert exit blocks. + SmallVector<MachineBasicBlock*, 2> ExitBlocks; + ML.getExitBlocks(ExitBlocks); + for (auto *MBB : ExitBlocks) + Order.push_back(MBB); + + // Then add the loop body. + Search(ML.getHeader()); + + // Then try the preheader and its predecessors. + std::function<void(MachineBasicBlock*)> GetPredecessor = + [this, &GetPredecessor] (MachineBasicBlock *MBB) -> void { + Order.push_back(MBB); + if (MBB->pred_size() == 1) + GetPredecessor(*MBB->pred_begin()); + }; + + if (auto *Preheader = ML.getLoopPreheader()) + GetPredecessor(Preheader); + else if (auto *Preheader = MLI.findLoopPreheader(&ML, true)) + GetPredecessor(Preheader); + } + }; + struct PredicatedMI { MachineInstr *MI = nullptr; SetVector<MachineInstr*> Predicates; @@ -976,6 +1031,15 @@ void ARMLowOverheadLoops::Expand(LowOverheadLoop &LoLoop) { ConvertVPTBlocks(LoLoop); } } + + PostOrderLoopTraversal DFS(*LoLoop.ML, *MLI); + DFS.ProcessLoop(); + const SmallVectorImpl<MachineBasicBlock*> &PostOrder = DFS.getOrder(); + for (auto *MBB : PostOrder) + recomputeLiveIns(*MBB); + + for (auto *MBB : reverse(PostOrder)) + recomputeLivenessFlags(*MBB); } bool ARMLowOverheadLoops::RevertNonLoops() { |

