Index: src/IceOperand.cpp |
diff --git a/src/IceOperand.cpp b/src/IceOperand.cpp |
index a2ee8f4af3cd598406a1c3902c733b569daccfc1..4b55737952668c79c9170a4a0f0622bde283d126 100644 |
--- a/src/IceOperand.cpp |
+++ b/src/IceOperand.cpp |
@@ -320,38 +320,63 @@ void VariablesMetadata::init(MetadataKind TrackingKind) { |
.markUse(Kind, NoInst, EntryNode, IsFromDef, IsImplicit); |
} |
- for (CfgNode *Node : Func->getNodes()) { |
- for (Inst *I : Node->getInsts()) { |
- if (I->isDeleted()) |
- continue; |
- if (InstFakeKill *Kill = llvm::dyn_cast<InstFakeKill>(I)) { |
- // A FakeKill instruction indicates certain Variables (usually |
- // physical scratch registers) are redefined, so we register |
- // them as defs. |
- for (SizeT SrcNum = 0; SrcNum < I->getSrcSize(); ++SrcNum) { |
- Variable *Var = llvm::cast<Variable>(I->getSrc(SrcNum)); |
- SizeT VarNum = Var->getIndex(); |
- assert(VarNum < Metadata.size()); |
- Metadata[VarNum].markDef(Kind, Kill, Node); |
- } |
- continue; // no point in executing the rest |
- } |
- if (Variable *Dest = I->getDest()) { |
- SizeT DestNum = Dest->getIndex(); |
- assert(DestNum < Metadata.size()); |
- Metadata[DestNum].markDef(Kind, I, Node); |
+ for (CfgNode *Node : Func->getNodes()) |
+ addNode(Node); |
+} |
+ |
+void VariablesMetadata::addNode(CfgNode *Node) { |
+ if (Func->getNumVariables() >= Metadata.size()) |
+ Metadata.resize(Func->getNumVariables()); |
+ |
+ for (InstPhi *I : Node->getPhis()) { |
+ if (I->isDeleted()) |
+ continue; |
+ if (Variable *Dest = I->getDest()) { |
+ SizeT DestNum = Dest->getIndex(); |
+ assert(DestNum < Metadata.size()); |
+ 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))) { |
+ SizeT VarNum = Var->getIndex(); |
+ assert(VarNum < Metadata.size()); |
+ const bool IsFromDef = false; |
+ const bool IsImplicit = false; |
+ Metadata[VarNum].markUse(Kind, I, Node, IsFromDef, IsImplicit); |
} |
+ } |
+ } |
+ |
+ for (Inst *I : Node->getInsts()) { |
+ if (I->isDeleted()) |
+ continue; |
+ if (InstFakeKill *Kill = llvm::dyn_cast<InstFakeKill>(I)) { |
+ // A FakeKill instruction indicates certain Variables (usually |
+ // physical scratch registers) are redefined, so we register |
+ // them as defs. |
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); |
- SizeT VarNum = Var->getIndex(); |
- assert(VarNum < Metadata.size()); |
- const bool IsFromDef = false; |
- const bool IsImplicit = false; |
- Metadata[VarNum].markUse(Kind, I, Node, IsFromDef, IsImplicit); |
- } |
+ Variable *Var = llvm::cast<Variable>(I->getSrc(SrcNum)); |
+ SizeT VarNum = Var->getIndex(); |
+ assert(VarNum < Metadata.size()); |
+ Metadata[VarNum].markDef(Kind, Kill, Node); |
+ } |
+ continue; // no point in executing the rest |
+ } |
+ if (Variable *Dest = I->getDest()) { |
+ SizeT DestNum = Dest->getIndex(); |
+ assert(DestNum < Metadata.size()); |
+ Metadata[DestNum].markDef(Kind, I, Node); |
+ } |
+ 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); |
+ SizeT VarNum = Var->getIndex(); |
+ assert(VarNum < Metadata.size()); |
+ const bool IsFromDef = false; |
+ const bool IsImplicit = false; |
+ Metadata[VarNum].markUse(Kind, I, Node, IsFromDef, IsImplicit); |
} |
} |
} |