[PATCH] D62311: [LV] Inform about exactly reason of loop illegality
Pavel Samolysov via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu May 23 06:30:44 PDT 2019
psamolysov created this revision.
psamolysov added reviewers: mkuper, hsaito, rengolin.
psamolysov added a project: LLVM.
Herald added subscribers: rkruppe, hiraditya.
Currently, only the following information is provided by LoopVectorizer
in the case when the CF of the loop is not legal for vectorization:
LV: Can't vectorize the instructions or CFG
LV: Not vectorizing: Cannot prove legality.
But this information is not enough for the root cause analysis; what is
exactly wrong with the loop should also be printed:
LV: Not vectorizing: The exiting block is not the loop latch.
Also the information which loops were simplified and
eligible for vectorization will be generated when the 'debug-only'
argument is set to 'loop-vectorize'.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D62311
Files:
llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
Index: llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
===================================================================
--- llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -1432,6 +1432,9 @@
RPOT.perform(LI);
if (!containsIrreducibleCFG<const BasicBlock *>(RPOT, *LI)) {
V.push_back(&L);
+ LLVM_DEBUG(dbgs() << "LV: The loop '"
+ << L.getName()
+ << "' is eligible as supported.\n");
// TODO: Collect inner loops inside marked outer loops in case
// vectorization fails for the outer loop. Do not invoke
// 'containsIrreducibleCFG' again for inner loops when the outer loop is
@@ -7579,16 +7582,22 @@
// legality and profitability checks. This means running the loop vectorizer
// will simplify all loops, regardless of whether anything end up being
// vectorized.
- for (auto &L : *LI)
- Changed |=
+ for (auto &L : *LI) {
+ bool Simplified =
simplifyLoop(L, DT, LI, SE, AC, nullptr, false /* PreserveLCSSA */);
+ LLVM_DEBUG(
+ if (Simplified)
+ dbgs() << "LV: The loop '" << L->getName() << "' has been simplified.\n";
+ );
+ Changed |= Simplified;
+ }
// Build up a worklist of inner-loops to vectorize. This is necessary as
// the act of vectorizing or partially unrolling a loop creates new loops
// and can invalidate iterators across the loops.
SmallVector<Loop *, 8> Worklist;
- for (Loop *L : *LI)
+ for (auto &L : *LI)
collectSupportedLoops(*L, LI, ORE, Worklist);
LoopsAnalyzed += Worklist.size();
Index: llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
===================================================================
--- llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
+++ llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
@@ -599,6 +599,8 @@
// Check that this PHI type is allowed.
if (!PhiTy->isIntegerTy() && !PhiTy->isFloatingPointTy() &&
!PhiTy->isPointerTy()) {
+ LLVM_DEBUG(dbgs()
+ << "LV: Not vectorizing: Found an unsupported type of PHI.\n");
ORE->emit(createMissedAnalysis("CFGNotUnderstood", Phi)
<< "loop control flow is not understood by vectorizer");
LLVM_DEBUG(dbgs() << "LV: Found an non-int non-pointer PHI.\n");
@@ -967,7 +969,8 @@
// We must have a loop in canonical form. Loops with indirectbr in them cannot
// be canonicalized.
if (!Lp->getLoopPreheader()) {
- LLVM_DEBUG(dbgs() << "LV: Loop doesn't have a legal pre-header.\n");
+ LLVM_DEBUG(dbgs()
+ << "LV: Not vectorizing: Loop doesn't have a legal pre-header.\n");
ORE->emit(createMissedAnalysis("CFGNotUnderstood")
<< "loop control flow is not understood by vectorizer");
if (DoExtraAnalysis)
@@ -978,6 +981,8 @@
// We must have a single backedge.
if (Lp->getNumBackEdges() != 1) {
+ LLVM_DEBUG(dbgs()
+ << "LV: Not vectorizing: The loop must have a single backedge.\n");
ORE->emit(createMissedAnalysis("CFGNotUnderstood")
<< "loop control flow is not understood by vectorizer");
if (DoExtraAnalysis)
@@ -988,6 +993,8 @@
// We must have a single exiting block.
if (!Lp->getExitingBlock()) {
+ LLVM_DEBUG(dbgs()
+ << "LV: Not vectorizing: The loop must have an exiting block.\n");
ORE->emit(createMissedAnalysis("CFGNotUnderstood")
<< "loop control flow is not understood by vectorizer");
if (DoExtraAnalysis)
@@ -1000,6 +1007,8 @@
// 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 (Lp->getExitingBlock() != Lp->getLoopLatch()) {
+ LLVM_DEBUG(dbgs()
+ << "LV: Not vectorizing: The exiting block is not the loop latch.\n");
ORE->emit(createMissedAnalysis("CFGNotUnderstood")
<< "loop control flow is not understood by vectorizer");
if (DoExtraAnalysis)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D62311.200958.patch
Type: text/x-patch
Size: 4088 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190523/334e1326/attachment-0001.bin>
More information about the llvm-commits
mailing list