| OLD | NEW |
| 1 //===- subzero/src/IceOperand.cpp - High-level operand implementation -----===// | 1 //===- subzero/src/IceOperand.cpp - High-level operand implementation -----===// |
| 2 // | 2 // |
| 3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 // | 9 // |
| 10 // This file implements the Operand class and its target-independent | 10 // This file implements the Operand class and its target-independent |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 116 ++I2; | 116 ++I2; |
| 117 continue; | 117 continue; |
| 118 } | 118 } |
| 119 return true; | 119 return true; |
| 120 } | 120 } |
| 121 return false; | 121 return false; |
| 122 } | 122 } |
| 123 | 123 |
| 124 bool LiveRange::overlaps(InstNumberT OtherBegin) const { | 124 bool LiveRange::overlaps(InstNumberT OtherBegin) const { |
| 125 bool Result = false; | 125 bool Result = false; |
| 126 for (RangeType::const_iterator I = Range.begin(), E = Range.end(); I != E; | 126 for (const RangeElementType &I : Range) { |
| 127 ++I) { | 127 if (OtherBegin < I.first) { |
| 128 if (OtherBegin < I->first) { | |
| 129 Result = false; | 128 Result = false; |
| 130 break; | 129 break; |
| 131 } | 130 } |
| 132 if (OtherBegin < I->second) { | 131 if (OtherBegin < I.second) { |
| 133 Result = true; | 132 Result = true; |
| 134 break; | 133 break; |
| 135 } | 134 } |
| 136 } | 135 } |
| 137 #if 0 | 136 #if 0 |
| 138 // An equivalent but less inefficient implementation: | 137 // An equivalent but less inefficient implementation: |
| 139 LiveRange Temp; | 138 LiveRange Temp; |
| 140 Temp.addSegment(OtherBegin, OtherBegin + 1); | 139 Temp.addSegment(OtherBegin, OtherBegin + 1); |
| 141 bool Validation = overlaps(Temp); | 140 bool Validation = overlaps(Temp); |
| 142 assert(Result == Validation); | 141 assert(Result == Validation); |
| 143 #endif | 142 #endif |
| 144 return Result; | 143 return Result; |
| 145 } | 144 } |
| 146 | 145 |
| 147 // Returns true if the live range contains the given instruction | 146 // Returns true if the live range contains the given instruction |
| 148 // number. This is only used for validating the live range | 147 // number. This is only used for validating the live range |
| 149 // calculation. | 148 // calculation. |
| 150 bool LiveRange::containsValue(InstNumberT Value) const { | 149 bool LiveRange::containsValue(InstNumberT Value) const { |
| 151 for (RangeType::const_iterator I = Range.begin(), E = Range.end(); I != E; | 150 for (const RangeElementType &I : Range) { |
| 152 ++I) { | 151 if (I.first <= Value && Value <= I.second) |
| 153 if (I->first <= Value && Value <= I->second) | |
| 154 return true; | 152 return true; |
| 155 } | 153 } |
| 156 return false; | 154 return false; |
| 157 } | 155 } |
| 158 | 156 |
| 159 IceString Variable::getName() const { | 157 IceString Variable::getName() const { |
| 160 if (!Name.empty()) | 158 if (!Name.empty()) |
| 161 return Name; | 159 return Name; |
| 162 char buf[30]; | 160 char buf[30]; |
| 163 snprintf(buf, llvm::array_lengthof(buf), "__%u", getIndex()); | 161 snprintf(buf, llvm::array_lengthof(buf), "__%u", getIndex()); |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 275 } | 273 } |
| 276 } | 274 } |
| 277 | 275 |
| 278 void VariablesMetadata::init() { | 276 void VariablesMetadata::init() { |
| 279 static TimerIdT IDvmetadata = GlobalContext::getTimerID("vmetadata"); | 277 static TimerIdT IDvmetadata = GlobalContext::getTimerID("vmetadata"); |
| 280 TimerMarker T(IDvmetadata, Func->getContext()); | 278 TimerMarker T(IDvmetadata, Func->getContext()); |
| 281 Metadata.clear(); | 279 Metadata.clear(); |
| 282 Metadata.resize(Func->getNumVariables()); | 280 Metadata.resize(Func->getNumVariables()); |
| 283 | 281 |
| 284 // Mark implicit args as being used in the entry node. | 282 // Mark implicit args as being used in the entry node. |
| 285 const VarList &ImplicitArgList = Func->getImplicitArgs(); | 283 for (Variable *Var : Func->getImplicitArgs()) { |
| 286 for (VarList::const_iterator I = ImplicitArgList.begin(), | |
| 287 E = ImplicitArgList.end(); | |
| 288 I != E; ++I) { | |
| 289 const Variable *Var = *I; | |
| 290 const Inst *NoInst = NULL; | 284 const Inst *NoInst = NULL; |
| 291 const CfgNode *EntryNode = Func->getEntryNode(); | 285 const CfgNode *EntryNode = Func->getEntryNode(); |
| 292 const bool IsFromDef = false; | 286 const bool IsFromDef = false; |
| 293 const bool IsImplicit = true; | 287 const bool IsImplicit = true; |
| 294 Metadata[Var->getIndex()].markUse(NoInst, EntryNode, IsFromDef, IsImplicit); | 288 Metadata[Var->getIndex()].markUse(NoInst, EntryNode, IsFromDef, IsImplicit); |
| 295 } | 289 } |
| 296 | 290 |
| 297 SizeT NumNodes = Func->getNumNodes(); | 291 SizeT NumNodes = Func->getNumNodes(); |
| 298 for (SizeT N = 0; N < NumNodes; ++N) { | 292 for (SizeT N = 0; N < NumNodes; ++N) { |
| 299 CfgNode *Node = Func->getNodes()[N]; | 293 CfgNode *Node = Func->getNodes()[N]; |
| 300 const InstList &Insts = Node->getInsts(); | 294 for (Inst *I : Node->getInsts()) { |
| 301 for (InstList::const_iterator I = Insts.begin(), E = Insts.end(); I != E; | 295 if (I->isDeleted()) |
| 302 ++I) { | |
| 303 if ((*I)->isDeleted()) | |
| 304 continue; | 296 continue; |
| 305 if (InstFakeKill *Kill = llvm::dyn_cast<InstFakeKill>(*I)) { | 297 if (InstFakeKill *Kill = llvm::dyn_cast<InstFakeKill>(I)) { |
| 306 // A FakeKill instruction indicates certain Variables (usually | 298 // A FakeKill instruction indicates certain Variables (usually |
| 307 // physical scratch registers) are redefined, so we register | 299 // physical scratch registers) are redefined, so we register |
| 308 // them as defs. | 300 // them as defs. |
| 309 for (SizeT SrcNum = 0; SrcNum < (*I)->getSrcSize(); ++SrcNum) { | 301 for (SizeT SrcNum = 0; SrcNum < I->getSrcSize(); ++SrcNum) { |
| 310 Variable *Var = llvm::cast<Variable>((*I)->getSrc(SrcNum)); | 302 Variable *Var = llvm::cast<Variable>(I->getSrc(SrcNum)); |
| 311 SizeT VarNum = Var->getIndex(); | 303 SizeT VarNum = Var->getIndex(); |
| 312 assert(VarNum < Metadata.size()); | 304 assert(VarNum < Metadata.size()); |
| 313 Metadata[VarNum].markDef(Kill, Node); | 305 Metadata[VarNum].markDef(Kill, Node); |
| 314 } | 306 } |
| 315 continue; // no point in executing the rest | 307 continue; // no point in executing the rest |
| 316 } | 308 } |
| 317 if (Variable *Dest = (*I)->getDest()) { | 309 if (Variable *Dest = I->getDest()) { |
| 318 SizeT DestNum = Dest->getIndex(); | 310 SizeT DestNum = Dest->getIndex(); |
| 319 assert(DestNum < Metadata.size()); | 311 assert(DestNum < Metadata.size()); |
| 320 Metadata[DestNum].markDef(*I, Node); | 312 Metadata[DestNum].markDef(I, Node); |
| 321 } | 313 } |
| 322 for (SizeT SrcNum = 0; SrcNum < (*I)->getSrcSize(); ++SrcNum) { | 314 for (SizeT SrcNum = 0; SrcNum < I->getSrcSize(); ++SrcNum) { |
| 323 Operand *Src = (*I)->getSrc(SrcNum); | 315 Operand *Src = I->getSrc(SrcNum); |
| 324 SizeT NumVars = Src->getNumVars(); | 316 SizeT NumVars = Src->getNumVars(); |
| 325 for (SizeT J = 0; J < NumVars; ++J) { | 317 for (SizeT J = 0; J < NumVars; ++J) { |
| 326 const Variable *Var = Src->getVar(J); | 318 const Variable *Var = Src->getVar(J); |
| 327 SizeT VarNum = Var->getIndex(); | 319 SizeT VarNum = Var->getIndex(); |
| 328 assert(VarNum < Metadata.size()); | 320 assert(VarNum < Metadata.size()); |
| 329 const bool IsFromDef = false; | 321 const bool IsFromDef = false; |
| 330 const bool IsImplicit = false; | 322 const bool IsImplicit = false; |
| 331 Metadata[VarNum].markUse(*I, Node, IsFromDef, IsImplicit); | 323 Metadata[VarNum].markUse(I, Node, IsFromDef, IsImplicit); |
| 332 } | 324 } |
| 333 } | 325 } |
| 334 } | 326 } |
| 335 } | 327 } |
| 336 } | 328 } |
| 337 | 329 |
| 338 bool VariablesMetadata::isMultiDef(const Variable *Var) const { | 330 bool VariablesMetadata::isMultiDef(const Variable *Var) const { |
| 339 if (Var->getIsArg()) | 331 if (Var->getIsArg()) |
| 340 return false; | 332 return false; |
| 341 if (!isTracked(Var)) | 333 if (!isTracked(Var)) |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 } | 425 } |
| 434 | 426 |
| 435 void ConstantRelocatable::dump(const Cfg *, Ostream &Str) const { | 427 void ConstantRelocatable::dump(const Cfg *, Ostream &Str) const { |
| 436 Str << "@" << Name; | 428 Str << "@" << Name; |
| 437 if (Offset) | 429 if (Offset) |
| 438 Str << "+" << Offset; | 430 Str << "+" << Offset; |
| 439 } | 431 } |
| 440 | 432 |
| 441 void LiveRange::dump(Ostream &Str) const { | 433 void LiveRange::dump(Ostream &Str) const { |
| 442 Str << "(weight=" << Weight << ") "; | 434 Str << "(weight=" << Weight << ") "; |
| 443 for (RangeType::const_iterator I = Range.begin(), E = Range.end(); I != E; | 435 bool First = true; |
| 444 ++I) { | 436 for (const RangeElementType &I : Range) { |
| 445 if (I != Range.begin()) | 437 if (First) |
| 446 Str << ", "; | 438 Str << ", "; |
| 447 Str << "[" << (*I).first << ":" << (*I).second << ")"; | 439 First = false; |
| 440 Str << "[" << I.first << ":" << I.second << ")"; |
| 448 } | 441 } |
| 449 } | 442 } |
| 450 | 443 |
| 451 Ostream &operator<<(Ostream &Str, const LiveRange &L) { | 444 Ostream &operator<<(Ostream &Str, const LiveRange &L) { |
| 452 L.dump(Str); | 445 L.dump(Str); |
| 453 return Str; | 446 return Str; |
| 454 } | 447 } |
| 455 | 448 |
| 456 Ostream &operator<<(Ostream &Str, const RegWeight &W) { | 449 Ostream &operator<<(Ostream &Str, const RegWeight &W) { |
| 457 if (W.getWeight() == RegWeight::Inf) | 450 if (W.getWeight() == RegWeight::Inf) |
| 458 Str << "Inf"; | 451 Str << "Inf"; |
| 459 else | 452 else |
| 460 Str << W.getWeight(); | 453 Str << W.getWeight(); |
| 461 return Str; | 454 return Str; |
| 462 } | 455 } |
| 463 | 456 |
| 464 } // end of namespace Ice | 457 } // end of namespace Ice |
| OLD | NEW |