mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-23 02:29:18 +00:00
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:
parent
edc4595472
commit
44180390f8
@ -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) {}
|
||||||
|
@ -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));
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user