From 236f6feb8f931e7bd45304e35ec775d4b5da64a6 Mon Sep 17 00:00:00 2001 From: Florian Hahn Date: Thu, 6 Sep 2018 09:57:27 +0000 Subject: [LoopInterchange] Move preheader creation to transform stage and simplify. There is no need to create preheaders in the analysis stage, we only need them when adjusting the branches. Also, the only cases we need to create our own preheaders is when they have more than 1 predecessors or PHI nodes (even with only 1 predecessor, we could have an LCSSA phi node). I have simplified the conditions and added some assertions to be sure. Because we know the inner and outer loop need to be tightly nested, it is sufficient to check if the inner loop preheader is the outer loop header to check if we need to create a new preheader. Reviewers: efriedma, mcrosier, karthikthecool Reviewed By: efriedma Differential Revision: https://reviews.llvm.org/D51703 llvm-svn: 341533 --- llvm/lib/Transforms/Scalar/LoopInterchange.cpp | 43 +++++++++++--------------- 1 file changed, 18 insertions(+), 25 deletions(-) (limited to 'llvm/lib/Transforms') diff --git a/llvm/lib/Transforms/Scalar/LoopInterchange.cpp b/llvm/lib/Transforms/Scalar/LoopInterchange.cpp index d951cc9e147..958c65d3fde 100644 --- a/llvm/lib/Transforms/Scalar/LoopInterchange.cpp +++ b/llvm/lib/Transforms/Scalar/LoopInterchange.cpp @@ -663,7 +663,8 @@ bool LoopInterchangeLegality::tightlyNested(Loop *OuterLoop, Loop *InnerLoop) { return false; for (BasicBlock *Succ : successors(OuterLoopHeaderBI)) - if (Succ != InnerLoopPreHeader && Succ != OuterLoopLatch) + if (Succ != InnerLoopPreHeader && Succ != InnerLoop->getHeader() && + Succ != OuterLoopLatch) return false; LLVM_DEBUG(dbgs() << "Checking instructions in Loop header and Loop latch\n"); @@ -1016,28 +1017,6 @@ bool LoopInterchangeLegality::canInterchangeLoops(unsigned InnerLoopId, return false; } - // Create unique Preheaders if we already do not have one. - BasicBlock *OuterLoopPreHeader = OuterLoop->getLoopPreheader(); - BasicBlock *InnerLoopPreHeader = InnerLoop->getLoopPreheader(); - - // Create a unique outer preheader - - // 1) If OuterLoop preheader is not present. - // 2) If OuterLoop Preheader is same as OuterLoop Header - // 3) If OuterLoop Preheader is same as Header of the previous loop. - // 4) If OuterLoop Preheader is Entry node. - if (!OuterLoopPreHeader || OuterLoopPreHeader == OuterLoop->getHeader() || - isa(OuterLoopPreHeader->begin()) || - !OuterLoopPreHeader->getUniquePredecessor()) { - OuterLoopPreHeader = - InsertPreheaderForLoop(OuterLoop, DT, LI, PreserveLCSSA); - } - - if (!InnerLoopPreHeader || InnerLoopPreHeader == InnerLoop->getHeader() || - InnerLoopPreHeader == OuterLoop->getHeader()) { - InnerLoopPreHeader = - InsertPreheaderForLoop(InnerLoop, DT, LI, PreserveLCSSA); - } - // TODO: The loops could not be interchanged due to current limitations in the // transform module. if (currentLimitations()) { @@ -1356,13 +1335,27 @@ bool LoopInterchangeTransform::adjustLoopBranches() { LLVM_DEBUG(dbgs() << "adjustLoopBranches called\n"); std::vector DTUpdates; + BasicBlock *OuterLoopPreHeader = OuterLoop->getLoopPreheader(); + BasicBlock *InnerLoopPreHeader = InnerLoop->getLoopPreheader(); + + assert(OuterLoopPreHeader != OuterLoop->getHeader() && + InnerLoopPreHeader != InnerLoop->getHeader() && OuterLoopPreHeader && + InnerLoopPreHeader && "Guaranteed by loop-simplify form"); + // Ensure that both preheaders do not contain PHI nodes and have single + // predecessors. This allows us to move them easily. We use + // InsertPreHeaderForLoop to create an 'extra' preheader, if the existing + // preheaders do not satisfy those conditions. + if (isa(OuterLoopPreHeader->begin()) || + !OuterLoopPreHeader->getUniquePredecessor()) + OuterLoopPreHeader = InsertPreheaderForLoop(OuterLoop, DT, LI, true); + if (InnerLoopPreHeader == OuterLoop->getHeader()) + InnerLoopPreHeader = InsertPreheaderForLoop(InnerLoop, DT, LI, true); + // Adjust the loop preheader BasicBlock *InnerLoopHeader = InnerLoop->getHeader(); BasicBlock *OuterLoopHeader = OuterLoop->getHeader(); BasicBlock *InnerLoopLatch = InnerLoop->getLoopLatch(); BasicBlock *OuterLoopLatch = OuterLoop->getLoopLatch(); - BasicBlock *OuterLoopPreHeader = OuterLoop->getLoopPreheader(); - BasicBlock *InnerLoopPreHeader = InnerLoop->getLoopPreheader(); BasicBlock *OuterLoopPredecessor = OuterLoopPreHeader->getUniquePredecessor(); BasicBlock *InnerLoopLatchPredecessor = InnerLoopLatch->getUniquePredecessor(); -- cgit v1.2.3