Skip to content

Commit

Permalink
[NFC] Loop Versioning for LICM code clean up
Browse files Browse the repository at this point in the history
- Removed unused class members.
- Made class internal data private.
- Made class scoped data function scoped where it's possible.
- Replace naked new/delete with unique_ptr.
- Made resources guaranteed to be freed.

Differential Revision: https://reviews.llvm.org/D25464

llvm-svn: 284290
  • Loading branch information
Evgeny Astigeevich committed Oct 14, 2016
1 parent d200357 commit 48fd87e
Showing 1 changed file with 42 additions and 31 deletions.
73 changes: 42 additions & 31 deletions llvm/lib/Transforms/Scalar/LoopVersioningLICM.cpp
Expand Up @@ -92,8 +92,7 @@
#include "llvm/Transforms/Utils/ValueMapper.h"

#define DEBUG_TYPE "loop-versioning-licm"
static const char* LICMVersioningMetaData =
"llvm.loop.licm_versioning.disable";
static const char *LICMVersioningMetaData = "llvm.loop.licm_versioning.disable";

using namespace llvm;

Expand Down Expand Up @@ -158,34 +157,48 @@ struct LoopVersioningLICM : public LoopPass {
AU.addRequired<LoopInfoWrapperPass>();
AU.addRequiredID(LoopSimplifyID);
AU.addRequired<ScalarEvolutionWrapperPass>();
AU.addRequired<TargetLibraryInfoWrapperPass>();
AU.addPreserved<AAResultsWrapperPass>();
AU.addPreserved<GlobalsAAWrapperPass>();
}

LoopVersioningLICM()
: LoopPass(ID), AA(nullptr), SE(nullptr), LI(nullptr), DT(nullptr),
TLI(nullptr), LAA(nullptr), LAI(nullptr), Changed(false),
Preheader(nullptr), CurLoop(nullptr), CurAST(nullptr),
LoopDepthThreshold(LVLoopDepthThreshold),
: LoopPass(ID), AA(nullptr), SE(nullptr), LAA(nullptr), LAI(nullptr),
CurLoop(nullptr), LoopDepthThreshold(LVLoopDepthThreshold),
InvariantThreshold(LVInvarThreshold), LoadAndStoreCounter(0),
InvariantCounter(0), IsReadOnlyLoop(true) {
initializeLoopVersioningLICMPass(*PassRegistry::getPassRegistry());
}
StringRef getPassName() const override { return "Loop Versioning for LICM"; }

AliasAnalysis *AA; // Current AliasAnalysis information
ScalarEvolution *SE; // Current ScalarEvolution
LoopInfo *LI; // Current LoopInfo
DominatorTree *DT; // Dominator Tree for the current Loop.
TargetLibraryInfo *TLI; // TargetLibraryInfo for constant folding.
LoopAccessLegacyAnalysis *LAA; // Current LoopAccessAnalysis
const LoopAccessInfo *LAI; // Current Loop's LoopAccessInfo
void reset() {
AA = nullptr;
SE = nullptr;
LAA = nullptr;
CurLoop = nullptr;
LoadAndStoreCounter = 0;
InvariantCounter = 0;
IsReadOnlyLoop = true;
CurAST.reset();
}

class AutoResetter {
public:
AutoResetter(LoopVersioningLICM &LVLICM) : LVLICM(LVLICM) {}
~AutoResetter() { LVLICM.reset(); }

private:
LoopVersioningLICM &LVLICM;
};

private:
AliasAnalysis *AA; // Current AliasAnalysis information
ScalarEvolution *SE; // Current ScalarEvolution
LoopAccessLegacyAnalysis *LAA; // Current LoopAccessAnalysis
const LoopAccessInfo *LAI; // Current Loop's LoopAccessInfo

bool Changed; // Set to true when we change anything.
BasicBlock *Preheader; // The preheader block of the current loop.
Loop *CurLoop; // The current loop we are working on.
AliasSetTracker *CurAST; // AliasSet information for the current loop.
ValueToValueMap Strides;
Loop *CurLoop; // The current loop we are working on.
std::unique_ptr<AliasSetTracker>
CurAST; // AliasSet information for the current loop.

unsigned LoopDepthThreshold; // Maximum loop nest threshold
float InvariantThreshold; // Minimum invariant threshold
Expand All @@ -200,7 +213,6 @@ struct LoopVersioningLICM : public LoopPass {
bool isLoopAlreadyVisited();
void setNoAliasToLoop(Loop *);
bool instructionSafeForVersioning(Instruction *);
StringRef getPassName() const override { return "Loop Versioning"; }
};
}

Expand Down Expand Up @@ -505,36 +517,38 @@ void LoopVersioningLICM::setNoAliasToLoop(Loop *VerLoop) {
}

bool LoopVersioningLICM::runOnLoop(Loop *L, LPPassManager &LPM) {
// This will automatically release all resources hold by the current
// LoopVersioningLICM object.
AutoResetter Resetter(*this);

if (skipLoop(L))
return false;
Changed = false;
// Get Analysis information.
LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
TLI = &getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
LAA = &getAnalysis<LoopAccessLegacyAnalysis>();
LAI = nullptr;
// Set Current Loop
CurLoop = L;
// Get the preheader block.
Preheader = L->getLoopPreheader();
// Initial allocation
CurAST = new AliasSetTracker(*AA);
CurAST.reset(new AliasSetTracker(*AA));

// Loop over the body of this loop, construct AST.
LoopInfo *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
for (auto *Block : L->getBlocks()) {
if (LI->getLoopFor(Block) == L) // Ignore blocks in subloop.
CurAST->add(*Block); // Incorporate the specified basic block
}

bool Changed = false;

// Check feasiblity of LoopVersioningLICM.
// If versioning found to be feasible and beneficial then proceed
// else simply return, by cleaning up memory.
if (isLegalForVersioning()) {
// Do loop versioning.
// Create memcheck for memory accessed inside loop.
// Clone original loop, and set blocks properly.
DominatorTree *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
LoopVersioning LVer(*LAI, CurLoop, LI, DT, SE, true);
LVer.versionLoop();
// Set Loop Versioning metaData for original loop.
Expand All @@ -548,8 +562,6 @@ bool LoopVersioningLICM::runOnLoop(Loop *L, LPPassManager &LPM) {
setNoAliasToLoop(LVer.getVersionedLoop());
Changed = true;
}
// Delete allocated memory.
delete CurAST;
return Changed;
}

Expand All @@ -564,7 +576,6 @@ INITIALIZE_PASS_DEPENDENCY(LoopAccessLegacyAnalysis)
INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
INITIALIZE_PASS_END(LoopVersioningLICM, "loop-versioning-licm",
"Loop Versioning For LICM", false, false)

Expand Down

0 comments on commit 48fd87e

Please sign in to comment.