diff options
author | Philip Reames <listmail@philipreames.com> | 2020-12-14 12:42:19 -0800 |
---|---|---|
committer | Philip Reames <listmail@philipreames.com> | 2020-12-14 12:44:01 -0800 |
commit | f5fe8493e5acfd70da61993cd370816978b9ef85 (patch) | |
tree | 74a5b83c01b60d28bab84b406fc3ec86d7c677c4 /llvm/lib/Analysis/LoopAccessAnalysis.cpp | |
parent | 6af2c4ca9bdb37e56cfda8dae4f6c3c6ca21b8d7 (diff) | |
download | llvm-f5fe8493e5acfd70da61993cd370816978b9ef85.zip llvm-f5fe8493e5acfd70da61993cd370816978b9ef85.tar.gz llvm-f5fe8493e5acfd70da61993cd370816978b9ef85.tar.bz2 |
[LAA] Relax restrictions on early exits in loop structure
his is a preparation patch for supporting multiple exits in the loop vectorizer, by itself it should be mostly NFC. This patch moves the loop structure checks from LAA to their respective consumers (where duplicates don't already exist). Moving the checks does end up changing some of the optimization warnings and debug output slightly, but nothing that appears to be a regression.
Why do this? Well, after auditing the code, I can't actually find anything in LAA itself which relies on having all instructions within a loop execute an equal number of times. This patch simply makes this explicit so that if one consumer - say LV in the near future (hopefully) - wants to handle a broader class of loops, it can do so.
Differential Revision: https://reviews.llvm.org/D92066
Diffstat (limited to 'llvm/lib/Analysis/LoopAccessAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/LoopAccessAnalysis.cpp | 20 |
1 files changed, 0 insertions, 20 deletions
diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp index 65d3916..be340a3b 100644 --- a/llvm/lib/Analysis/LoopAccessAnalysis.cpp +++ b/llvm/lib/Analysis/LoopAccessAnalysis.cpp @@ -1781,26 +1781,6 @@ bool LoopAccessInfo::canAnalyzeLoop() { return false; } - // We must have a single exiting block. - if (!TheLoop->getExitingBlock()) { - LLVM_DEBUG( - dbgs() << "LAA: loop control flow is not understood by analyzer\n"); - recordAnalysis("CFGNotUnderstood") - << "loop control flow is not understood by analyzer"; - return false; - } - - // We only handle bottom-tested loops, i.e. loop in which the condition is - // checked at the end of each iteration. With that we can assume that all - // instructions in the loop are executed the same number of times. - if (TheLoop->getExitingBlock() != TheLoop->getLoopLatch()) { - LLVM_DEBUG( - dbgs() << "LAA: loop control flow is not understood by analyzer\n"); - recordAnalysis("CFGNotUnderstood") - << "loop control flow is not understood by analyzer"; - return false; - } - // ScalarEvolution needs to be able to find the exit count. const SCEV *ExitCount = PSE->getBackedgeTakenCount(); if (isa<SCEVCouldNotCompute>(ExitCount)) { |