From: Xin Tong Date: Wed, 4 Oct 2017 21:39:25 +0000 (+0000) Subject: [MachineBlockPlacement] Make sure PreferredLoopExit is cleared everytime new loop... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=587a4b0470560ebe90a8ee0a317d699395a6ed2d;p=llvm [MachineBlockPlacement] Make sure PreferredLoopExit is cleared everytime new loop is processed Summary: Rotate on exit that actually exits the current loop. Reviewers: davidxl, danielcdh, iteratee, chandlerc Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D38563 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@314937 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/MachineBlockPlacement.cpp b/lib/CodeGen/MachineBlockPlacement.cpp index f135cf71593..12d8a9a0217 100644 --- a/lib/CodeGen/MachineBlockPlacement.cpp +++ b/lib/CodeGen/MachineBlockPlacement.cpp @@ -2233,9 +2233,19 @@ void MachineBlockPlacement::buildLoopChains(const MachineLoop &L) { // If we selected just the header for the loop top, look for a potentially // profitable exit block in the event that rotating the loop can eliminate // branches by placing an exit edge at the bottom. + // + // Loops are processed innermost to uttermost, make sure we clear + // PreferredLoopExit before processing a new loop. + PreferredLoopExit = nullptr; if (!RotateLoopWithProfile && LoopTop == L.getHeader()) PreferredLoopExit = findBestLoopExit(L, LoopBlockSet); + // Make sure PreferredLoopExit actually exits the current loop. + if (PreferredLoopExit) { + assert(L.isLoopExiting(PreferredLoopExit) && + "not an exiting block of current loop"); + } + BlockChain &LoopChain = *BlockToChain[LoopTop]; // FIXME: This is a really lame way of walking the chains in the loop: we