| 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 /// \file | 10 /// \file |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 Definitions.empty() ? FirstOrSingleDefinition : Definitions.back(); | 292 Definitions.empty() ? FirstOrSingleDefinition : Definitions.back(); |
| 293 (void)LastInstruction; | 293 (void)LastInstruction; |
| 294 assert(LastInstruction == nullptr || | 294 assert(LastInstruction == nullptr || |
| 295 Instr->getNumber() >= LastInstruction->getNumber()); | 295 Instr->getNumber() >= LastInstruction->getNumber()); |
| 296 } | 296 } |
| 297 } | 297 } |
| 298 constexpr bool IsImplicit = false; | 298 constexpr bool IsImplicit = false; |
| 299 markUse(TrackingKind, Instr, Node, IsImplicit); | 299 markUse(TrackingKind, Instr, Node, IsImplicit); |
| 300 if (TrackingKind == VMK_Uses) | 300 if (TrackingKind == VMK_Uses) |
| 301 return; | 301 return; |
| 302 if (FirstOrSingleDefinition == nullptr) | 302 if (FirstOrSingleDefinition == nullptr) { |
| 303 FirstOrSingleDefinition = Instr; | 303 FirstOrSingleDefinition = Instr; |
| 304 else if (TrackingKind == VMK_All) | 304 FirstOrSingleDefinitionNode = Node; |
| 305 } else if (TrackingKind == VMK_All) |
| 305 Definitions.push_back(Instr); | 306 Definitions.push_back(Instr); |
| 306 switch (MultiDef) { | 307 switch (MultiDef) { |
| 307 case MDS_Unknown: | 308 case MDS_Unknown: |
| 308 assert(SingleDefNode == nullptr); | 309 assert(SingleDefNode == nullptr); |
| 309 MultiDef = MDS_SingleDef; | 310 MultiDef = MDS_SingleDef; |
| 310 SingleDefNode = Node; | 311 SingleDefNode = Node; |
| 311 break; | 312 break; |
| 312 case MDS_SingleDef: | 313 case MDS_SingleDef: |
| 313 assert(SingleDefNode); | 314 assert(SingleDefNode); |
| 314 if (Node == SingleDefNode) { | 315 if (Node == SingleDefNode) { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 350 case MDS_MultiDefMultiBlock: | 351 case MDS_MultiDefMultiBlock: |
| 351 case MDS_MultiDefSingleBlock: | 352 case MDS_MultiDefSingleBlock: |
| 352 return nullptr; | 353 return nullptr; |
| 353 case MDS_SingleDef: | 354 case MDS_SingleDef: |
| 354 assert(FirstOrSingleDefinition); | 355 assert(FirstOrSingleDefinition); |
| 355 return FirstOrSingleDefinition; | 356 return FirstOrSingleDefinition; |
| 356 } | 357 } |
| 357 return nullptr; | 358 return nullptr; |
| 358 } | 359 } |
| 359 | 360 |
| 361 const CfgNode *VariableTracking::getSingleDefinitionNode() const { |
| 362 switch (MultiDef) { |
| 363 case MDS_Unknown: |
| 364 case MDS_MultiDefMultiBlock: |
| 365 case MDS_MultiDefSingleBlock: |
| 366 return nullptr; |
| 367 case MDS_SingleDef: |
| 368 assert(FirstOrSingleDefinitionNode); |
| 369 return FirstOrSingleDefinitionNode; |
| 370 } |
| 371 return nullptr; |
| 372 } |
| 373 |
| 360 const Inst *VariableTracking::getFirstDefinition() const { | 374 const Inst *VariableTracking::getFirstDefinition() const { |
| 361 switch (MultiDef) { | 375 switch (MultiDef) { |
| 362 case MDS_Unknown: | 376 case MDS_Unknown: |
| 363 return nullptr; | 377 return nullptr; |
| 364 case MDS_MultiDefMultiBlock: | 378 case MDS_MultiDefMultiBlock: |
| 365 case MDS_SingleDef: | 379 case MDS_SingleDef: |
| 366 case MDS_MultiDefSingleBlock: | 380 case MDS_MultiDefSingleBlock: |
| 367 assert(FirstOrSingleDefinition); | 381 assert(FirstOrSingleDefinition); |
| 368 return FirstOrSingleDefinition; | 382 return FirstOrSingleDefinition; |
| 369 } | 383 } |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 491 } | 505 } |
| 492 | 506 |
| 493 const Inst *VariablesMetadata::getSingleDefinition(const Variable *Var) const { | 507 const Inst *VariablesMetadata::getSingleDefinition(const Variable *Var) const { |
| 494 assert(Kind != VMK_Uses); | 508 assert(Kind != VMK_Uses); |
| 495 if (!isTracked(Var)) | 509 if (!isTracked(Var)) |
| 496 return nullptr; // conservative answer | 510 return nullptr; // conservative answer |
| 497 SizeT VarNum = Var->getIndex(); | 511 SizeT VarNum = Var->getIndex(); |
| 498 return Metadata[VarNum].getSingleDefinition(); | 512 return Metadata[VarNum].getSingleDefinition(); |
| 499 } | 513 } |
| 500 | 514 |
| 515 const CfgNode * |
| 516 VariablesMetadata::getSingleDefinitionNode(const Variable *Var) const { |
| 517 assert(Kind != VMK_Uses); |
| 518 if (!isTracked(Var)) |
| 519 return nullptr; // conservative answer |
| 520 SizeT VarNum = Var->getIndex(); |
| 521 return Metadata[VarNum].getSingleDefinitionNode(); |
| 522 } |
| 523 |
| 501 const Inst *VariablesMetadata::getFirstDefinition(const Variable *Var) const { | 524 const Inst *VariablesMetadata::getFirstDefinition(const Variable *Var) const { |
| 502 assert(Kind != VMK_Uses); | 525 assert(Kind != VMK_Uses); |
| 503 if (!isTracked(Var)) | 526 if (!isTracked(Var)) |
| 504 return nullptr; // conservative answer | 527 return nullptr; // conservative answer |
| 505 SizeT VarNum = Var->getIndex(); | 528 SizeT VarNum = Var->getIndex(); |
| 506 return Metadata[VarNum].getFirstDefinition(); | 529 return Metadata[VarNum].getFirstDefinition(); |
| 507 } | 530 } |
| 508 | 531 |
| 509 const InstDefList & | 532 const InstDefList & |
| 510 VariablesMetadata::getLatterDefinitions(const Variable *Var) const { | 533 VariablesMetadata::getLatterDefinitions(const Variable *Var) const { |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 659 if (getType() != IceType_i32 && getType() != IceType_i16 && | 682 if (getType() != IceType_i32 && getType() != IceType_i16 && |
| 660 getType() != IceType_i8) | 683 getType() != IceType_i8) |
| 661 return false; | 684 return false; |
| 662 // The Following checks if the signed representation of Value is between | 685 // The Following checks if the signed representation of Value is between |
| 663 // -Threshold/2 and +Threshold/2 | 686 // -Threshold/2 and +Threshold/2 |
| 664 bool largerThanThreshold = Threshold / 2 + Value >= Threshold; | 687 bool largerThanThreshold = Threshold / 2 + Value >= Threshold; |
| 665 return largerThanThreshold; | 688 return largerThanThreshold; |
| 666 } | 689 } |
| 667 | 690 |
| 668 } // end of namespace Ice | 691 } // end of namespace Ice |
| OLD | NEW |