Subzero: Use range-based for loops with llvm::ilist<Inst> lists.
This reestablishes C++11 features lost after switching to llvm::ilist<> in two previous CLs:
https://codereview.chromium.org/709533002/
https://codereview.chromium.org/794923002/
BUG= none
R=jfb@chromium.org, jvoung@chromium.org
Review URL: https://codereview.chromium.org/819403002
diff --git a/src/IceCfg.cpp b/src/IceCfg.cpp
index 2f0e994..9726ff9 100644
--- a/src/IceCfg.cpp
+++ b/src/IceCfg.cpp
@@ -294,24 +294,22 @@
for (CfgNode *Node : Nodes) {
InstNumberT FirstInstNum = Inst::NumberSentinel;
InstNumberT LastInstNum = Inst::NumberSentinel;
- for (auto I = Node->getPhis().begin(), E = Node->getPhis().end(); I != E;
- ++I) {
- I->deleteIfDead();
- if (Mode == Liveness_Intervals && !I->isDeleted()) {
+ for (Inst &I : Node->getPhis()) {
+ I.deleteIfDead();
+ if (Mode == Liveness_Intervals && !I.isDeleted()) {
if (FirstInstNum == Inst::NumberSentinel)
- FirstInstNum = I->getNumber();
- assert(I->getNumber() > LastInstNum);
- LastInstNum = I->getNumber();
+ FirstInstNum = I.getNumber();
+ assert(I.getNumber() > LastInstNum);
+ LastInstNum = I.getNumber();
}
}
- for (auto I = Node->getInsts().begin(), E = Node->getInsts().end(); I != E;
- ++I) {
- I->deleteIfDead();
- if (Mode == Liveness_Intervals && !I->isDeleted()) {
+ for (Inst &I : Node->getInsts()) {
+ I.deleteIfDead();
+ if (Mode == Liveness_Intervals && !I.isDeleted()) {
if (FirstInstNum == Inst::NumberSentinel)
- FirstInstNum = I->getNumber();
- assert(I->getNumber() > LastInstNum);
- LastInstNum = I->getNumber();
+ FirstInstNum = I.getNumber();
+ assert(I.getNumber() > LastInstNum);
+ LastInstNum = I.getNumber();
}
}
if (Mode == Liveness_Intervals) {
@@ -339,14 +337,13 @@
Ostream &Str = Ctx->getStrDump();
for (CfgNode *Node : Nodes) {
Inst *FirstInst = nullptr;
- for (auto Inst = Node->getInsts().begin(), E = Node->getInsts().end();
- Inst != E; ++Inst) {
- if (Inst->isDeleted())
+ for (Inst &Inst : Node->getInsts()) {
+ if (Inst.isDeleted())
continue;
if (FirstInst == nullptr)
- FirstInst = Inst;
- InstNumberT InstNumber = Inst->getNumber();
- if (Variable *Dest = Inst->getDest()) {
+ FirstInst = &Inst;
+ InstNumberT InstNumber = Inst.getNumber();
+ if (Variable *Dest = Inst.getDest()) {
if (!Dest->getIgnoreLiveness()) {
bool Invalid = false;
const bool IsDest = true;
@@ -359,20 +356,20 @@
// temporary may be live at the end of the previous block,
// and if it is also assigned in the first instruction of
// this block, the adjacent live ranges get merged.
- if (static_cast<class Inst *>(Inst) != FirstInst &&
- !Inst->isDestNonKillable() &&
+ if (static_cast<class Inst *>(&Inst) != FirstInst &&
+ !Inst.isDestNonKillable() &&
Dest->getLiveRange().containsValue(InstNumber - 1, IsDest))
Invalid = true;
if (Invalid) {
Valid = false;
- Str << "Liveness error: inst " << Inst->getNumber() << " dest ";
+ Str << "Liveness error: inst " << Inst.getNumber() << " dest ";
Dest->dump(this);
Str << " live range " << Dest->getLiveRange() << "\n";
}
}
}
- for (SizeT I = 0; I < Inst->getSrcSize(); ++I) {
- Operand *Src = Inst->getSrc(I);
+ for (SizeT I = 0; I < Inst.getSrcSize(); ++I) {
+ Operand *Src = Inst.getSrc(I);
SizeT NumVars = Src->getNumVars();
for (SizeT J = 0; J < NumVars; ++J) {
const Variable *Var = Src->getVar(J);
@@ -380,7 +377,7 @@
if (!Var->getIgnoreLiveness() &&
!Var->getLiveRange().containsValue(InstNumber, IsDest)) {
Valid = false;
- Str << "Liveness error: inst " << Inst->getNumber() << " var ";
+ Str << "Liveness error: inst " << Inst.getNumber() << " var ";
Var->dump(this);
Str << " live range " << Var->getLiveRange() << "\n";
}
diff --git a/src/IceCfgNode.cpp b/src/IceCfgNode.cpp
index c542693..55512e8 100644
--- a/src/IceCfgNode.cpp
+++ b/src/IceCfgNode.cpp
@@ -57,10 +57,10 @@
// overlap with the range of any other block.
void CfgNode::renumberInstructions() {
InstNumberT FirstNumber = Func->getNextInstNumber();
- for (auto I = Phis.begin(), E = Phis.end(); I != E; ++I)
- I->renumber(Func);
- for (auto I = Insts.begin(), E = Insts.end(); I != E; ++I)
- I->renumber(Func);
+ for (Inst &I : Phis)
+ I.renumber(Func);
+ for (Inst &I : Insts)
+ I.renumber(Func);
InstCountEstimate = Func->getNextInstNumber() - FirstNumber;
}
@@ -86,8 +86,8 @@
// instructions and appends assignment instructions to predecessor
// blocks. Note that this transformation preserves SSA form.
void CfgNode::placePhiLoads() {
- for (auto I = Phis.begin(), E = Phis.end(); I != E; ++I) {
- auto Phi = llvm::dyn_cast<InstPhi>(I);
+ for (Inst &I : Phis) {
+ auto Phi = llvm::dyn_cast<InstPhi>(&I);
Insts.insert(Insts.begin(), Phi->lower(Func));
}
}
@@ -186,11 +186,11 @@
// Consider every out-edge.
for (CfgNode *Succ : OutEdges) {
// Consider every Phi instruction at the out-edge.
- for (auto I = Succ->Phis.begin(), E = Succ->Phis.end(); I != E; ++I) {
- auto Phi = llvm::dyn_cast<InstPhi>(I);
+ for (Inst &I : Succ->Phis) {
+ auto Phi = llvm::dyn_cast<InstPhi>(&I);
Operand *Operand = Phi->getOperandForTarget(this);
assert(Operand);
- Variable *Dest = I->getDest();
+ Variable *Dest = I.getDest();
assert(Dest);
InstAssign *NewInst = InstAssign::create(Func, Dest, Operand);
if (CmpInstDest == Operand)
@@ -203,8 +203,8 @@
// Deletes the phi instructions after the loads and stores are placed.
void CfgNode::deletePhis() {
- for (auto I = Phis.begin(), E = Phis.end(); I != E; ++I)
- I->setDeleted();
+ for (Inst &I : Phis)
+ I.setDeleted();
}
// Splits the edge from Pred to this node by creating a new node and
@@ -319,8 +319,8 @@
} Desc[getPhis().size()];
size_t NumPhis = 0;
- for (auto I = Phis.begin(), E = Phis.end(); I != E; ++I) {
- auto Inst = llvm::dyn_cast<InstPhi>(I);
+ for (Inst &I : Phis) {
+ auto Inst = llvm::dyn_cast<InstPhi>(&I);
if (!Inst->isDeleted()) {
Desc[NumPhis].Phi = Inst;
Desc[NumPhis].Dest = Inst->getDest();
@@ -475,8 +475,8 @@
Func->getVMetadata()->addNode(Split);
}
- for (auto I = Phis.begin(), E = Phis.end(); I != E; ++I)
- I->setDeleted();
+ for (Inst &I : Phis)
+ I.setDeleted();
}
// Does address mode optimization. Pass each instruction to the
@@ -539,10 +539,10 @@
continue;
I->livenessLightweight(Func, Live);
}
- for (auto I = Phis.begin(), E = Phis.end(); I != E; ++I) {
- if (I->isDeleted())
+ for (Inst &I : Phis) {
+ if (I.isDeleted())
continue;
- I->livenessLightweight(Func, Live);
+ I.livenessLightweight(Func, Live);
}
}
@@ -571,8 +571,8 @@
for (CfgNode *Succ : OutEdges) {
Live |= Liveness->getLiveIn(Succ);
// Mark corresponding argument of phis in successor as live.
- for (auto I = Succ->Phis.begin(), E = Succ->Phis.end(); I != E; ++I) {
- auto Phi = llvm::dyn_cast<InstPhi>(I);
+ for (Inst &I : Succ->Phis) {
+ auto Phi = llvm::dyn_cast<InstPhi>(&I);
Phi->livenessPhiOperand(Live, this, Liveness);
}
}
@@ -589,12 +589,12 @@
// the block.
SizeT NumNonDeadPhis = 0;
InstNumberT FirstPhiNumber = Inst::NumberSentinel;
- for (auto I = Phis.begin(), E = Phis.end(); I != E; ++I) {
- if (I->isDeleted())
+ for (Inst &I : Phis) {
+ if (I.isDeleted())
continue;
if (FirstPhiNumber == Inst::NumberSentinel)
- FirstPhiNumber = I->getNumber();
- if (I->liveness(FirstPhiNumber, Live, Liveness, LiveBegin, LiveEnd))
+ FirstPhiNumber = I.getNumber();
+ if (I.liveness(FirstPhiNumber, Live, Liveness, LiveBegin, LiveEnd))
++NumNonDeadPhis;
}
@@ -724,12 +724,12 @@
if (InEdges.empty())
return;
Inst *Branch = nullptr;
- for (auto I = Insts.begin(), E = Insts.end(); I != E; ++I) {
- if (I->isDeleted())
+ for (Inst &I : Insts) {
+ if (I.isDeleted())
continue;
- if (I->isUnconditionalBranch())
- Branch = I;
- else if (!I->isRedundantAssign())
+ if (I.isUnconditionalBranch())
+ Branch = &I;
+ else if (!I.isRedundantAssign())
return;
}
Branch->setDeleted();
@@ -747,10 +747,9 @@
OutEdges.front()->InEdges.push_back(Pred);
}
}
- for (auto I = Pred->getInsts().begin(), E = Pred->getInsts().end();
- I != E; ++I) {
- if (!I->isDeleted())
- I->repointEdge(this, OutEdges.front());
+ for (Inst &I : Pred->getInsts()) {
+ if (!I.isDeleted())
+ I.repointEdge(this, OutEdges.front());
}
}
}
@@ -767,9 +766,9 @@
// first opportunity, unless there is some target lowering where we
// have the possibility of multiple such optimizations per block
// (currently not the case for x86 lowering).
- for (auto I = Insts.begin(), E = Insts.end(); I != E; ++I) {
- if (!I->isDeleted()) {
- Target->doBranchOpt(I, NextNode);
+ for (Inst &I : Insts) {
+ if (!I.isDeleted()) {
+ Target->doBranchOpt(&I, NextNode);
}
}
}
@@ -872,26 +871,26 @@
if (DecorateAsm)
emitRegisterUsage(Str, Func, this, true, LiveRegCount);
- for (auto I = Phis.begin(), E = Phis.end(); I != E; ++I) {
- if (I->isDeleted())
+ for (const Inst &I : Phis) {
+ if (I.isDeleted())
continue;
// Emitting a Phi instruction should cause an error.
- I->emit(Func);
+ I.emit(Func);
}
- for (auto I = Insts.begin(), E = Insts.end(); I != E; ++I) {
- if (I->isDeleted())
+ for (const Inst &I : Insts) {
+ if (I.isDeleted())
continue;
- if (I->isRedundantAssign()) {
- Variable *Dest = I->getDest();
- if (DecorateAsm && Dest->hasReg() && !I->isLastUse(I->getSrc(0)))
+ if (I.isRedundantAssign()) {
+ Variable *Dest = I.getDest();
+ if (DecorateAsm && Dest->hasReg() && !I.isLastUse(I.getSrc(0)))
++LiveRegCount[Dest->getRegNum()];
continue;
}
- I->emit(Func);
+ I.emit(Func);
if (DecorateAsm)
- emitLiveRangesEnded(Str, Func, I, LiveRegCount);
+ emitLiveRangesEnded(Str, Func, &I, LiveRegCount);
Str << "\n";
- updateStats(Func, I);
+ updateStats(Func, &I);
}
if (DecorateAsm)
emitRegisterUsage(Str, Func, this, false, LiveRegCount);
@@ -901,19 +900,19 @@
Func->setCurrentNode(this);
Assembler *Asm = Func->getAssembler<Assembler>();
Asm->BindCfgNodeLabel(getIndex());
- for (auto I = Phis.begin(), E = Phis.end(); I != E; ++I) {
- if (I->isDeleted())
+ for (const Inst &I : Phis) {
+ if (I.isDeleted())
continue;
// Emitting a Phi instruction should cause an error.
- I->emitIAS(Func);
+ I.emitIAS(Func);
}
- for (auto I = Insts.begin(), E = Insts.end(); I != E; ++I) {
- if (I->isDeleted())
+ for (const Inst &I : Insts) {
+ if (I.isDeleted())
continue;
- if (I->isRedundantAssign())
+ if (I.isRedundantAssign())
continue;
- I->emitIAS(Func);
- updateStats(Func, I);
+ I.emitIAS(Func);
+ updateStats(Func, &I);
}
}
@@ -958,10 +957,10 @@
}
// Dump each instruction.
if (Func->getContext()->isVerbose(IceV_Instructions)) {
- for (auto I = Phis.begin(), E = Phis.end(); I != E; ++I)
- I->dumpDecorated(Func);
- for (auto I = Insts.begin(), E = Insts.end(); I != E; ++I)
- I->dumpDecorated(Func);
+ for (const Inst &I : Phis)
+ I.dumpDecorated(Func);
+ for (const Inst &I : Insts)
+ I.dumpDecorated(Func);
}
// Dump the live-out variables.
LivenessBV LiveOut;
diff --git a/src/IceOperand.cpp b/src/IceOperand.cpp
index 956d6e0..a6a3c09 100644
--- a/src/IceOperand.cpp
+++ b/src/IceOperand.cpp
@@ -286,39 +286,37 @@
if (Func->getNumVariables() >= Metadata.size())
Metadata.resize(Func->getNumVariables());
- for (auto I = Node->getPhis().begin(), E = Node->getPhis().end(); I != E;
- ++I) {
- if (I->isDeleted())
+ for (Inst &I : Node->getPhis()) {
+ if (I.isDeleted())
continue;
- if (Variable *Dest = I->getDest()) {
+ if (Variable *Dest = I.getDest()) {
SizeT DestNum = Dest->getIndex();
assert(DestNum < Metadata.size());
- Metadata[DestNum].markDef(Kind, I, Node);
+ Metadata[DestNum].markDef(Kind, &I, Node);
}
- for (SizeT SrcNum = 0; SrcNum < I->getSrcSize(); ++SrcNum) {
- if (const Variable *Var = llvm::dyn_cast<Variable>(I->getSrc(SrcNum))) {
+ for (SizeT SrcNum = 0; SrcNum < I.getSrcSize(); ++SrcNum) {
+ if (const Variable *Var = llvm::dyn_cast<Variable>(I.getSrc(SrcNum))) {
SizeT VarNum = Var->getIndex();
assert(VarNum < Metadata.size());
const bool IsFromDef = false;
const bool IsImplicit = false;
- Metadata[VarNum].markUse(Kind, I, Node, IsFromDef, IsImplicit);
+ Metadata[VarNum].markUse(Kind, &I, Node, IsFromDef, IsImplicit);
}
}
}
- for (auto I = Node->getInsts().begin(), E = Node->getInsts().end(); I != E;
- ++I) {
- if (I->isDeleted())
+ for (Inst &I : Node->getInsts()) {
+ if (I.isDeleted())
continue;
// Note: The implicit definitions (and uses) from InstFakeKill are
// deliberately ignored.
- if (Variable *Dest = I->getDest()) {
+ if (Variable *Dest = I.getDest()) {
SizeT DestNum = Dest->getIndex();
assert(DestNum < Metadata.size());
- Metadata[DestNum].markDef(Kind, I, Node);
+ Metadata[DestNum].markDef(Kind, &I, Node);
}
- for (SizeT SrcNum = 0; SrcNum < I->getSrcSize(); ++SrcNum) {
- Operand *Src = I->getSrc(SrcNum);
+ for (SizeT SrcNum = 0; SrcNum < I.getSrcSize(); ++SrcNum) {
+ Operand *Src = I.getSrc(SrcNum);
SizeT NumVars = Src->getNumVars();
for (SizeT J = 0; J < NumVars; ++J) {
const Variable *Var = Src->getVar(J);
@@ -326,7 +324,7 @@
assert(VarNum < Metadata.size());
const bool IsFromDef = false;
const bool IsImplicit = false;
- Metadata[VarNum].markUse(Kind, I, Node, IsFromDef, IsImplicit);
+ Metadata[VarNum].markUse(Kind, &I, Node, IsFromDef, IsImplicit);
}
}
}
diff --git a/src/IceRegAlloc.cpp b/src/IceRegAlloc.cpp
index d2bc8fb..d65b3b6 100644
--- a/src/IceRegAlloc.cpp
+++ b/src/IceRegAlloc.cpp
@@ -109,11 +109,10 @@
// Build the (ordered) list of FakeKill instruction numbers.
Kills.clear();
for (CfgNode *Node : Func->getNodes()) {
- for (auto I = Node->getInsts().begin(), E = Node->getInsts().end(); I != E;
- ++I) {
- if (auto Kill = llvm::dyn_cast<InstFakeKill>(I)) {
+ for (Inst &I : Node->getInsts()) {
+ if (auto Kill = llvm::dyn_cast<InstFakeKill>(&I)) {
if (!Kill->isDeleted() && !Kill->getLinked()->isDeleted())
- Kills.push_back(I->getNumber());
+ Kills.push_back(I.getNumber());
}
}
}
@@ -160,25 +159,24 @@
std::vector<InstNumberT> LRBegin(Vars.size(), Inst::NumberSentinel);
std::vector<InstNumberT> LREnd(Vars.size(), Inst::NumberSentinel);
for (CfgNode *Node : Func->getNodes()) {
- for (auto Inst = Node->getInsts().begin(), E = Node->getInsts().end();
- Inst != E; ++Inst) {
- if (Inst->isDeleted())
+ for (Inst &Inst : Node->getInsts()) {
+ if (Inst.isDeleted())
continue;
- if (const Variable *Var = Inst->getDest()) {
+ if (const Variable *Var = Inst.getDest()) {
if (Var->hasReg() || Var->getWeight() == RegWeight::Inf) {
if (LRBegin[Var->getIndex()] == Inst::NumberSentinel) {
- LRBegin[Var->getIndex()] = Inst->getNumber();
+ LRBegin[Var->getIndex()] = Inst.getNumber();
++NumVars;
}
}
}
- for (SizeT I = 0; I < Inst->getSrcSize(); ++I) {
- Operand *Src = Inst->getSrc(I);
+ for (SizeT I = 0; I < Inst.getSrcSize(); ++I) {
+ Operand *Src = Inst.getSrc(I);
SizeT NumVars = Src->getNumVars();
for (SizeT J = 0; J < NumVars; ++J) {
const Variable *Var = Src->getVar(J);
if (Var->hasReg() || Var->getWeight() == RegWeight::Inf)
- LREnd[Var->getIndex()] = Inst->getNumber();
+ LREnd[Var->getIndex()] = Inst.getNumber();
}
}
}
diff --git a/src/IceTargetLoweringX8632.cpp b/src/IceTargetLoweringX8632.cpp
index d838553..b8cbb9d 100644
--- a/src/IceTargetLoweringX8632.cpp
+++ b/src/IceTargetLoweringX8632.cpp
@@ -669,14 +669,13 @@
// stack slots.
llvm::BitVector IsVarReferenced(Func->getNumVariables());
for (CfgNode *Node : Func->getNodes()) {
- for (auto Inst = Node->getInsts().begin(), E = Node->getInsts().end();
- Inst != E; ++Inst) {
- if (Inst->isDeleted())
+ for (Inst &Inst : Node->getInsts()) {
+ if (Inst.isDeleted())
continue;
- if (const Variable *Var = Inst->getDest())
+ if (const Variable *Var = Inst.getDest())
IsVarReferenced[Var->getIndex()] = true;
- for (SizeT I = 0; I < Inst->getSrcSize(); ++I) {
- Operand *Src = Inst->getSrc(I);
+ for (SizeT I = 0; I < Inst.getSrcSize(); ++I) {
+ Operand *Src = Inst.getSrc(I);
SizeT NumVars = Src->getNumVars();
for (SizeT J = 0; J < NumVars; ++J) {
const Variable *Var = Src->getVar(J);
@@ -4155,9 +4154,8 @@
// Undef input.
void TargetX8632::prelowerPhis() {
CfgNode *Node = Context.getNode();
- for (auto I = Node->getPhis().begin(), E = Node->getPhis().end(); I != E;
- ++I) {
- auto Phi = llvm::dyn_cast<InstPhi>(I);
+ for (Inst &I : Node->getPhis()) {
+ auto Phi = llvm::dyn_cast<InstPhi>(&I);
if (Phi->isDeleted())
continue;
Variable *Dest = Phi->getDest();
@@ -4221,11 +4219,11 @@
// set. TODO(stichnot): This work is being repeated for every split
// edge to the successor, so consider updating LiveIn just once
// after all the edges are split.
- for (auto I = Assignments.begin(), E = Assignments.end(); I != E; ++I) {
- Variable *Dest = I->getDest();
+ for (const Inst &I : Assignments) {
+ Variable *Dest = I.getDest();
if (Dest->hasReg()) {
Available[Dest->getRegNum()] = false;
- } else if (isMemoryOperand(I->getSrc(0))) {
+ } else if (isMemoryOperand(I.getSrc(0))) {
NeedsRegs = true; // Src and Dest are both in memory
}
}