Add optimization remarks to the loop unroller and vectorizer.

Summary:
This calls emitOptimizationRemark from the loop unroller and vectorizer
at the point where they make a positive transformation. For the
vectorizer, it reports vectorization and interleave factors. For the
loop unroller, it reports all the different supported types of
unrolling.

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D3456

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207528 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Diego Novillo 2014-04-29 14:27:31 +00:00
parent edc4595472
commit 44180390f8
3 changed files with 45 additions and 0 deletions

View File

@ -453,6 +453,31 @@ public:
void dump() const; void dump() const;
/// \brief Return the debug location of the start of this loop.
/// This looks for a BB terminating instruction with a known debug
/// location by looking at the preheader and header blocks. If it
/// cannot find a terminating instruction with location information,
/// it returns an unknown location.
DebugLoc getStartLoc() const {
DebugLoc StartLoc;
BasicBlock *HeadBB;
// Try the pre-header first.
if ((HeadBB = getLoopPreheader()) != nullptr) {
StartLoc = HeadBB->getTerminator()->getDebugLoc();
if (!StartLoc.isUnknown())
return StartLoc;
}
// If we have no pre-header or there are no instructions with debug
// info in it, try the header.
HeadBB = getHeader();
if (HeadBB)
StartLoc = HeadBB->getTerminator()->getDebugLoc();
return StartLoc;
}
private: private:
friend class LoopInfoBase<BasicBlock, Loop>; friend class LoopInfoBase<BasicBlock, Loop>;
explicit Loop(BasicBlock *BB) : LoopBase<BasicBlock, Loop>(BB) {} explicit Loop(BasicBlock *BB) : LoopBase<BasicBlock, Loop>(BB) {}

View File

@ -24,6 +24,7 @@
#include "llvm/Analysis/ScalarEvolution.h" #include "llvm/Analysis/ScalarEvolution.h"
#include "llvm/IR/BasicBlock.h" #include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Dominators.h" #include "llvm/IR/Dominators.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/Support/Debug.h" #include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h" #include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h"
@ -228,20 +229,33 @@ bool llvm::UnrollLoop(Loop *L, unsigned Count, unsigned TripCount,
(unsigned)GreatestCommonDivisor64(Count, TripMultiple); (unsigned)GreatestCommonDivisor64(Count, TripMultiple);
} }
// Report the unrolling decision.
DebugLoc LoopLoc = L->getStartLoc();
Function *F = Header->getParent();
LLVMContext &Ctx = F->getContext();
if (CompletelyUnroll) { if (CompletelyUnroll) {
DEBUG(dbgs() << "COMPLETELY UNROLLING loop %" << Header->getName() DEBUG(dbgs() << "COMPLETELY UNROLLING loop %" << Header->getName()
<< " with trip count " << TripCount << "!\n"); << " with trip count " << TripCount << "!\n");
Ctx.emitOptimizationRemark(DEBUG_TYPE, *F, LoopLoc,
Twine("completely unrolled loop with ") +
Twine(TripCount) + " iterations");
} else { } else {
DEBUG(dbgs() << "UNROLLING loop %" << Header->getName() DEBUG(dbgs() << "UNROLLING loop %" << Header->getName()
<< " by " << Count); << " by " << Count);
Twine DiagMsg("unrolled loop by a factor of " + Twine(Count));
if (TripMultiple == 0 || BreakoutTrip != TripMultiple) { if (TripMultiple == 0 || BreakoutTrip != TripMultiple) {
DEBUG(dbgs() << " with a breakout at trip " << BreakoutTrip); DEBUG(dbgs() << " with a breakout at trip " << BreakoutTrip);
DiagMsg.concat(" with a breakout at trip " + Twine(BreakoutTrip));
} else if (TripMultiple != 1) { } else if (TripMultiple != 1) {
DEBUG(dbgs() << " with " << TripMultiple << " trips per branch"); DEBUG(dbgs() << " with " << TripMultiple << " trips per branch");
DiagMsg.concat(" with " + Twine(TripMultiple) + " trips per branch");
} else if (RuntimeTripCount) { } else if (RuntimeTripCount) {
DEBUG(dbgs() << " with run-time trip count"); DEBUG(dbgs() << " with run-time trip count");
DiagMsg.concat(" with run-time trip count");
} }
DEBUG(dbgs() << "!\n"); DEBUG(dbgs() << "!\n");
Ctx.emitOptimizationRemark(DEBUG_TYPE, *F, LoopLoc, DiagMsg);
} }
bool ContinueOnTrue = L->contains(BI->getSuccessor(0)); bool ContinueOnTrue = L->contains(BI->getSuccessor(0));

View File

@ -1222,6 +1222,12 @@ struct LoopVectorize : public FunctionPass {
// Mark the loop as already vectorized to avoid vectorizing again. // Mark the loop as already vectorized to avoid vectorizing again.
Hints.setAlreadyVectorized(L); Hints.setAlreadyVectorized(L);
// Report the vectorization decision.
F->getContext().emitOptimizationRemark(
DEBUG_TYPE, *F, L->getStartLoc(),
Twine("vectorized loop (vectorization factor: ") + Twine(VF.Width) +
", unroll factor: " + Twine(UF) + ")");
DEBUG(verifyFunction(*L->getHeader()->getParent())); DEBUG(verifyFunction(*L->getHeader()->getParent()));
return true; return true;
} }