forked from OSchip/llvm-project
Move trip count discovery outside of the generic LoopUnroll helper. This
removes its dependence on canonical induction variables. llvm-svn: 135829
This commit is contained in:
parent
279e7a6c83
commit
1cabe54fab
|
@ -22,7 +22,8 @@ class Loop;
|
|||
class LoopInfo;
|
||||
class LPPassManager;
|
||||
|
||||
bool UnrollLoop(Loop *L, unsigned Count, LoopInfo* LI, LPPassManager* LPM);
|
||||
bool UnrollLoop(Loop *L, unsigned Count, unsigned TripCount,
|
||||
unsigned TripMultiple, LoopInfo* LI, LPPassManager* LPM);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -137,9 +137,14 @@ bool LoopUnroll::runOnLoop(Loop *L, LPPassManager &LPM) {
|
|||
|
||||
// Find trip count
|
||||
unsigned TripCount = L->getSmallConstantTripCount();
|
||||
unsigned Count = CurrentCount;
|
||||
|
||||
// Find trip multiple if count is not available
|
||||
unsigned TripMultiple = 1;
|
||||
if (TripCount == 0)
|
||||
TripMultiple = L->getSmallConstantTripMultiple();
|
||||
|
||||
// Automatically select an unroll count.
|
||||
unsigned Count = CurrentCount;
|
||||
if (Count == 0) {
|
||||
// Conservative heuristic: if we know the trip count, see if we can
|
||||
// completely unroll (subject to the threshold, checked below); otherwise
|
||||
|
@ -183,7 +188,7 @@ bool LoopUnroll::runOnLoop(Loop *L, LPPassManager &LPM) {
|
|||
|
||||
// Unroll the loop.
|
||||
Function *F = L->getHeader()->getParent();
|
||||
if (!UnrollLoop(L, Count, LI, &LPM))
|
||||
if (!UnrollLoop(L, Count, TripCount, TripMultiple, LI, &LPM))
|
||||
return false;
|
||||
|
||||
// FIXME: Reconstruct dom info, because it is not preserved properly.
|
||||
|
|
|
@ -11,9 +11,6 @@
|
|||
// actual pass or policy, but provides a single function to perform loop
|
||||
// unrolling.
|
||||
//
|
||||
// It works best when loops have been canonicalized by the -indvars pass,
|
||||
// allowing it to determine the trip counts of loops easily.
|
||||
//
|
||||
// The process of unrolling can produce extraneous basic blocks linked with
|
||||
// unconditional branches. This will be corrected in the future.
|
||||
//
|
||||
|
@ -113,8 +110,8 @@ static BasicBlock *FoldBlockIntoPredecessor(BasicBlock *BB, LoopInfo* LI) {
|
|||
///
|
||||
/// If a LoopPassManager is passed in, and the loop is fully removed, it will be
|
||||
/// removed from the LoopPassManager as well. LPM can also be NULL.
|
||||
bool llvm::UnrollLoop(Loop *L, unsigned Count,
|
||||
LoopInfo *LI, LPPassManager *LPM) {
|
||||
bool llvm::UnrollLoop(Loop *L, unsigned Count, unsigned TripCount,
|
||||
unsigned TripMultiple, LoopInfo *LI, LPPassManager *LPM) {
|
||||
BasicBlock *Preheader = L->getLoopPreheader();
|
||||
if (!Preheader) {
|
||||
DEBUG(dbgs() << " Can't unroll; loop preheader-insertion failed.\n");
|
||||
|
@ -149,13 +146,6 @@ bool llvm::UnrollLoop(Loop *L, unsigned Count,
|
|||
if (ScalarEvolution *SE = LPM->getAnalysisIfAvailable<ScalarEvolution>())
|
||||
SE->forgetLoop(L);
|
||||
|
||||
// Find trip count
|
||||
unsigned TripCount = L->getSmallConstantTripCount();
|
||||
// Find trip multiple if count is not available
|
||||
unsigned TripMultiple = 1;
|
||||
if (TripCount == 0)
|
||||
TripMultiple = L->getSmallConstantTripMultiple();
|
||||
|
||||
if (TripCount != 0)
|
||||
DEBUG(dbgs() << " Trip Count = " << TripCount << "\n");
|
||||
if (TripMultiple != 1)
|
||||
|
|
Loading…
Reference in New Issue