mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 19:31:58 +00:00
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:
parent
0e910d2cb5
commit
7198ee6f62
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user