Adjust file to the coding standard.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@187808 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jakub Staszak 2013-08-06 17:03:42 +00:00
parent 0e910d2cb5
commit 7198ee6f62

View File

@ -87,8 +87,8 @@ namespace {
typedef LoopPropsMap::iterator LoopPropsMapIt; typedef LoopPropsMap::iterator LoopPropsMapIt;
LoopPropsMap LoopsProperties; LoopPropsMap LoopsProperties;
UnswitchedValsMap* CurLoopInstructions; UnswitchedValsMap *CurLoopInstructions;
LoopProperties* CurrentLoopProperties; LoopProperties *CurrentLoopProperties;
// Max size of code we can produce on remained iterations. // Max size of code we can produce on remained iterations.
unsigned MaxSize; unsigned MaxSize;
@ -96,30 +96,30 @@ namespace {
public: public:
LUAnalysisCache() : LUAnalysisCache() :
CurLoopInstructions(NULL), CurrentLoopProperties(NULL), CurLoopInstructions(0), CurrentLoopProperties(0),
MaxSize(Threshold) MaxSize(Threshold)
{} {}
// Analyze loop. Check its size, calculate is it possible to unswitch // Analyze loop. Check its size, calculate is it possible to unswitch
// it. Returns true if we can unswitch this loop. // it. Returns true if we can unswitch this loop.
bool countLoop(const Loop* L, const TargetTransformInfo &TTI); bool countLoop(const Loop *L, const TargetTransformInfo &TTI);
// Clean all data related to given loop. // Clean all data related to given loop.
void forgetLoop(const Loop* L); void forgetLoop(const Loop *L);
// Mark case value as unswitched. // Mark case value as unswitched.
// Since SI instruction can be partly unswitched, in order to avoid // Since SI instruction can be partly unswitched, in order to avoid
// extra unswitching in cloned loops keep track all unswitched values. // extra unswitching in cloned loops keep track all unswitched values.
void setUnswitched(const SwitchInst* SI, const Value* V); void setUnswitched(const SwitchInst *SI, const Value *V);
// Check was this case value unswitched before or not. // Check was this case value unswitched before or not.
bool isUnswitched(const SwitchInst* SI, const Value* V); bool isUnswitched(const SwitchInst *SI, const Value *V);
// Clone all loop-unswitch related loop properties. // Clone all loop-unswitch related loop properties.
// Redistribute unswitching quotas. // Redistribute unswitching quotas.
// Note, that new loop data is stored inside the VMap. // Note, that new loop data is stored inside the VMap.
void cloneData(const Loop* NewLoop, const Loop* OldLoop, void cloneData(const Loop *NewLoop, const Loop *OldLoop,
const ValueToValueMapTy& VMap); const ValueToValueMapTy &VMap);
}; };
class LoopUnswitch : public LoopPass { class LoopUnswitch : public LoopPass {
@ -151,8 +151,8 @@ namespace {
static char ID; // Pass ID, replacement for typeid static char ID; // Pass ID, replacement for typeid
explicit LoopUnswitch(bool Os = false) : explicit LoopUnswitch(bool Os = false) :
LoopPass(ID), OptimizeForSize(Os), redoLoop(false), LoopPass(ID), OptimizeForSize(Os), redoLoop(false),
currentLoop(NULL), DT(NULL), loopHeader(NULL), currentLoop(0), DT(0), loopHeader(0),
loopPreheader(NULL) { loopPreheader(0) {
initializeLoopUnswitchPass(*PassRegistry::getPassRegistry()); initializeLoopUnswitchPass(*PassRegistry::getPassRegistry());
} }
@ -225,12 +225,14 @@ namespace {
// it. Returns true if we can unswitch this loop. // it. Returns true if we can unswitch this loop.
bool LUAnalysisCache::countLoop(const Loop *L, const TargetTransformInfo &TTI) { bool LUAnalysisCache::countLoop(const Loop *L, const TargetTransformInfo &TTI) {
std::pair<LoopPropsMapIt, bool> InsertRes = LoopPropsMapIt PropsIt;
bool Inserted;
llvm::tie(PropsIt, Inserted) =
LoopsProperties.insert(std::make_pair(L, LoopProperties())); LoopsProperties.insert(std::make_pair(L, LoopProperties()));
LoopProperties& Props = InsertRes.first->second; LoopProperties &Props = PropsIt->second;
if (InsertRes.second) { if (Inserted) {
// New loop. // New loop.
// Limit the number of instructions to avoid causing significant code // Limit the number of instructions to avoid causing significant code
@ -242,8 +244,7 @@ bool LUAnalysisCache::countLoop(const Loop *L, const TargetTransformInfo &TTI) {
// consideration code simplification opportunities and code that can // consideration code simplification opportunities and code that can
// be shared by the resultant unswitched loops. // be shared by the resultant unswitched loops.
CodeMetrics Metrics; CodeMetrics Metrics;
for (Loop::block_iterator I = L->block_begin(), for (Loop::block_iterator I = L->block_begin(), E = L->block_end();
E = L->block_end();
I != E; ++I) I != E; ++I)
Metrics.analyzeBasicBlock(*I, TTI); Metrics.analyzeBasicBlock(*I, TTI);
@ -253,17 +254,16 @@ bool LUAnalysisCache::countLoop(const Loop *L, const TargetTransformInfo &TTI) {
if (Metrics.notDuplicatable) { if (Metrics.notDuplicatable) {
DEBUG(dbgs() << "NOT unswitching loop %" DEBUG(dbgs() << "NOT unswitching loop %"
<< L->getHeader()->getName() << ", contents cannot be " << L->getHeader()->getName() << ", contents cannot be "
<< "duplicated!\n"); << "duplicated!\n");
return false; return false;
} }
} }
if (!Props.CanBeUnswitchedCount) { if (!Props.CanBeUnswitchedCount) {
DEBUG(dbgs() << "NOT unswitching loop %" DEBUG(dbgs() << "NOT unswitching loop %"
<< L->getHeader()->getName() << ", cost too high: " << L->getHeader()->getName() << ", cost too high: "
<< L->getBlocks().size() << "\n"); << L->getBlocks().size() << "\n");
return false; return false;
} }
@ -275,41 +275,41 @@ bool LUAnalysisCache::countLoop(const Loop *L, const TargetTransformInfo &TTI) {
} }
// Clean all data related to given loop. // Clean all data related to given loop.
void LUAnalysisCache::forgetLoop(const Loop* L) { void LUAnalysisCache::forgetLoop(const Loop *L) {
LoopPropsMapIt LIt = LoopsProperties.find(L); LoopPropsMapIt LIt = LoopsProperties.find(L);
if (LIt != LoopsProperties.end()) { if (LIt != LoopsProperties.end()) {
LoopProperties& Props = LIt->second; LoopProperties &Props = LIt->second;
MaxSize += Props.CanBeUnswitchedCount * Props.SizeEstimation; MaxSize += Props.CanBeUnswitchedCount * Props.SizeEstimation;
LoopsProperties.erase(LIt); LoopsProperties.erase(LIt);
} }
CurrentLoopProperties = NULL; CurrentLoopProperties = 0;
CurLoopInstructions = NULL; CurLoopInstructions = 0;
} }
// Mark case value as unswitched. // Mark case value as unswitched.
// Since SI instruction can be partly unswitched, in order to avoid // Since SI instruction can be partly unswitched, in order to avoid
// extra unswitching in cloned loops keep track all unswitched values. // extra unswitching in cloned loops keep track all unswitched values.
void LUAnalysisCache::setUnswitched(const SwitchInst* SI, const Value* V) { void LUAnalysisCache::setUnswitched(const SwitchInst *SI, const Value *V) {
(*CurLoopInstructions)[SI].insert(V); (*CurLoopInstructions)[SI].insert(V);
} }
// Check was this case value unswitched before or not. // Check was this case value unswitched before or not.
bool LUAnalysisCache::isUnswitched(const SwitchInst* SI, const Value* V) { bool LUAnalysisCache::isUnswitched(const SwitchInst *SI, const Value *V) {
return (*CurLoopInstructions)[SI].count(V); return (*CurLoopInstructions)[SI].count(V);
} }
// Clone all loop-unswitch related loop properties. // Clone all loop-unswitch related loop properties.
// Redistribute unswitching quotas. // Redistribute unswitching quotas.
// Note, that new loop data is stored inside the VMap. // Note, that new loop data is stored inside the VMap.
void LUAnalysisCache::cloneData(const Loop* NewLoop, const Loop* OldLoop, void LUAnalysisCache::cloneData(const Loop *NewLoop, const Loop *OldLoop,
const ValueToValueMapTy& VMap) { const ValueToValueMapTy &VMap) {
LoopProperties& NewLoopProps = LoopsProperties[NewLoop]; LoopProperties &NewLoopProps = LoopsProperties[NewLoop];
LoopProperties& OldLoopProps = *CurrentLoopProperties; LoopProperties &OldLoopProps = *CurrentLoopProperties;
UnswitchedValsMap& Insts = OldLoopProps.UnswitchedVals; UnswitchedValsMap &Insts = OldLoopProps.UnswitchedVals;
// Reallocate "can-be-unswitched quota" // Reallocate "can-be-unswitched quota"
@ -324,9 +324,9 @@ void LUAnalysisCache::cloneData(const Loop* NewLoop, const Loop* OldLoop,
// for new loop switches we clone info about values that was // for new loop switches we clone info about values that was
// already unswitched and has redundant successors. // already unswitched and has redundant successors.
for (UnswitchedValsIt I = Insts.begin(); I != Insts.end(); ++I) { for (UnswitchedValsIt I = Insts.begin(); I != Insts.end(); ++I) {
const SwitchInst* OldInst = I->first; const SwitchInst *OldInst = I->first;
Value* NewI = VMap.lookup(OldInst); Value *NewI = VMap.lookup(OldInst);
const SwitchInst* NewInst = cast_or_null<SwitchInst>(NewI); const SwitchInst *NewInst = cast_or_null<SwitchInst>(NewI);
assert(NewInst && "All instructions that are in SrcBB must be in VMap."); assert(NewInst && "All instructions that are in SrcBB must be in VMap.");
NewLoopProps.UnswitchedVals[NewInst] = OldLoopProps.UnswitchedVals[OldInst]; NewLoopProps.UnswitchedVals[NewInst] = OldLoopProps.UnswitchedVals[OldInst];
@ -458,14 +458,14 @@ bool LoopUnswitch::processCurrentLoop() {
// Find a value to unswitch on: // Find a value to unswitch on:
// FIXME: this should chose the most expensive case! // FIXME: this should chose the most expensive case!
// FIXME: scan for a case with a non-critical edge? // FIXME: scan for a case with a non-critical edge?
Constant *UnswitchVal = NULL; Constant *UnswitchVal = 0;
// Do not process same value again and again. // Do not process same value again and again.
// At this point we have some cases already unswitched and // At this point we have some cases already unswitched and
// some not yet unswitched. Let's find the first not yet unswitched one. // some not yet unswitched. Let's find the first not yet unswitched one.
for (SwitchInst::CaseIt i = SI->case_begin(), e = SI->case_end(); for (SwitchInst::CaseIt i = SI->case_begin(), e = SI->case_end();
i != e; ++i) { i != e; ++i) {
Constant* UnswitchValCandidate = i.getCaseValue(); Constant *UnswitchValCandidate = i.getCaseValue();
if (!BranchesInfo.isUnswitched(SI, UnswitchValCandidate)) { if (!BranchesInfo.isUnswitched(SI, UnswitchValCandidate)) {
UnswitchVal = UnswitchValCandidate; UnswitchVal = UnswitchValCandidate;
break; break;
@ -511,7 +511,8 @@ static bool isTrivialLoopExitBlockHelper(Loop *L, BasicBlock *BB,
// Already visited. Without more analysis, this could indicate an infinite // Already visited. Without more analysis, this could indicate an infinite
// loop. // loop.
return false; return false;
} else if (!L->contains(BB)) { }
if (!L->contains(BB)) {
// Otherwise, this is a loop exit, this is fine so long as this is the // Otherwise, this is a loop exit, this is fine so long as this is the
// first exit. // first exit.
if (ExitBB != 0) return false; if (ExitBB != 0) return false;
@ -595,11 +596,11 @@ bool LoopUnswitch::IsTrivialUnswitchCondition(Value *Cond, Constant **Val,
// on already unswitched cases. // on already unswitched cases.
for (SwitchInst::CaseIt i = SI->case_begin(), e = SI->case_end(); for (SwitchInst::CaseIt i = SI->case_begin(), e = SI->case_end();
i != e; ++i) { i != e; ++i) {
BasicBlock* LoopExitCandidate; BasicBlock *LoopExitCandidate;
if ((LoopExitCandidate = isTrivialLoopExitBlock(currentLoop, if ((LoopExitCandidate = isTrivialLoopExitBlock(currentLoop,
i.getCaseSuccessor()))) { i.getCaseSuccessor()))) {
// Okay, we found a trivial case, remember the value that is trivial. // Okay, we found a trivial case, remember the value that is trivial.
ConstantInt* CaseVal = i.getCaseValue(); ConstantInt *CaseVal = i.getCaseValue();
// Check that it was not unswitched before, since already unswitched // Check that it was not unswitched before, since already unswitched
// trivial vals are looks trivial too. // trivial vals are looks trivial too.
@ -854,9 +855,8 @@ void LoopUnswitch::UnswitchNontrivialCondition(Value *LIC, Constant *Val,
// If the successor of the exit block had PHI nodes, add an entry for // If the successor of the exit block had PHI nodes, add an entry for
// NewExit. // NewExit.
PHINode *PN; for (BasicBlock::iterator I = ExitSucc->begin();
for (BasicBlock::iterator I = ExitSucc->begin(); isa<PHINode>(I); ++I) { PHINode *PN = dyn_cast<PHINode>(I); ++I) {
PN = cast<PHINode>(I);
Value *V = PN->getIncomingValueForBlock(ExitBlocks[i]); Value *V = PN->getIncomingValueForBlock(ExitBlocks[i]);
ValueToValueMapTy::iterator It = VMap.find(V); ValueToValueMapTy::iterator It = VMap.find(V);
if (It != VMap.end()) V = It->second; if (It != VMap.end()) V = It->second;
@ -864,8 +864,8 @@ void LoopUnswitch::UnswitchNontrivialCondition(Value *LIC, Constant *Val,
} }
if (LandingPadInst *LPad = NewExit->getLandingPadInst()) { if (LandingPadInst *LPad = NewExit->getLandingPadInst()) {
PN = PHINode::Create(LPad->getType(), 0, "", PHINode *PN = PHINode::Create(LPad->getType(), 0, "",
ExitSucc->getFirstInsertionPt()); ExitSucc->getFirstInsertionPt());
for (pred_iterator I = pred_begin(ExitSucc), E = pred_end(ExitSucc); for (pred_iterator I = pred_begin(ExitSucc), E = pred_end(ExitSucc);
I != E; ++I) { I != E; ++I) {
@ -957,10 +957,8 @@ void LoopUnswitch::RemoveBlockIfDead(BasicBlock *BB,
// are any easy simplifications we can do now. // are any easy simplifications we can do now.
if (BasicBlock *Pred = BB->getSinglePredecessor()) { if (BasicBlock *Pred = BB->getSinglePredecessor()) {
// If it has one pred, fold phi nodes in BB. // If it has one pred, fold phi nodes in BB.
while (isa<PHINode>(BB->begin())) while (PHINode *PN = dyn_cast<PHINode>(BB->begin()))
ReplaceUsesOfWith(BB->begin(), ReplaceUsesOfWith(PN, PN->getIncomingValue(0), Worklist, L, LPM);
cast<PHINode>(BB->begin())->getIncomingValue(0),
Worklist, L, LPM);
// If this is the header of a loop and the only pred is the latch, we now // If this is the header of a loop and the only pred is the latch, we now
// have an unreachable loop. // have an unreachable loop.
@ -1020,7 +1018,6 @@ void LoopUnswitch::RemoveBlockIfDead(BasicBlock *BB,
// was in. // was in.
LI->removeBlock(BB); LI->removeBlock(BB);
// Remove phi node entries in successors for this block. // Remove phi node entries in successors for this block.
TerminatorInst *TI = BB->getTerminator(); TerminatorInst *TI = BB->getTerminator();
SmallVector<BasicBlock*, 4> Succs; SmallVector<BasicBlock*, 4> Succs;
@ -1088,7 +1085,6 @@ void LoopUnswitch::RewriteLoopBodyWithConditionConstant(Loop *L, Value *LIC,
std::vector<Instruction*> Worklist; std::vector<Instruction*> Worklist;
LLVMContext &Context = Val->getContext(); LLVMContext &Context = Val->getContext();
// If we know that LIC == Val, or that LIC == NotVal, just replace uses of LIC // If we know that LIC == Val, or that LIC == NotVal, just replace uses of LIC
// in the loop with the appropriate one directly. // in the loop with the appropriate one directly.
if (IsEqual || (isa<ConstantInt>(Val) && if (IsEqual || (isa<ConstantInt>(Val) &&
@ -1108,8 +1104,8 @@ void LoopUnswitch::RewriteLoopBodyWithConditionConstant(Loop *L, Value *LIC,
Worklist.push_back(U); Worklist.push_back(U);
} }
for (std::vector<Instruction*>::iterator UI = Worklist.begin(); for (std::vector<Instruction*>::iterator UI = Worklist.begin(),
UI != Worklist.end(); ++UI) UE = Worklist.end(); UI != UE; ++UI)
(*UI)->replaceUsesOfWith(LIC, Replacement); (*UI)->replaceUsesOfWith(LIC, Replacement);
SimplifyCode(Worklist, L); SimplifyCode(Worklist, L);