OLD | NEW |
1 //===- subzero/src/IceOperand.h - High-level operands -----------*- C++ -*-===// | 1 //===- subzero/src/IceOperand.h - High-level operands -----------*- C++ -*-===// |
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 declares the Operand class and its target-independent | 10 // This file declares the Operand class and its target-independent |
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 // portion. TODO: It's wasteful to penalize all variables on all | 492 // portion. TODO: It's wasteful to penalize all variables on all |
493 // targets this way; use a sparser representation. It's also | 493 // targets this way; use a sparser representation. It's also |
494 // wasteful for a 64-bit target. | 494 // wasteful for a 64-bit target. |
495 Variable *LoVar; | 495 Variable *LoVar; |
496 Variable *HiVar; | 496 Variable *HiVar; |
497 // VarsReal (and Operand::Vars) are set up such that Vars[0] == | 497 // VarsReal (and Operand::Vars) are set up such that Vars[0] == |
498 // this. | 498 // this. |
499 Variable *VarsReal[1]; | 499 Variable *VarsReal[1]; |
500 }; | 500 }; |
501 | 501 |
| 502 enum MetadataKind { |
| 503 VMK_Uses, // Track only uses, not defs |
| 504 VMK_SingleDefs, // Track uses+defs, but only record single def |
| 505 VMK_All // Track uses+defs, including full def list |
| 506 }; |
502 typedef std::vector<const Inst *> InstDefList; | 507 typedef std::vector<const Inst *> InstDefList; |
503 | 508 |
504 // VariableTracking tracks the metadata for a single variable. It is | 509 // VariableTracking tracks the metadata for a single variable. It is |
505 // only meant to be used internally by VariablesMetadata. | 510 // only meant to be used internally by VariablesMetadata. |
506 class VariableTracking { | 511 class VariableTracking { |
507 public: | 512 public: |
508 enum MultiDefState { | 513 enum MultiDefState { |
509 // TODO(stichnot): Consider using just a simple counter. | 514 // TODO(stichnot): Consider using just a simple counter. |
510 MDS_Unknown, | 515 MDS_Unknown, |
511 MDS_SingleDef, | 516 MDS_SingleDef, |
512 MDS_MultiDefSingleBlock, | 517 MDS_MultiDefSingleBlock, |
513 MDS_MultiDefMultiBlock | 518 MDS_MultiDefMultiBlock |
514 }; | 519 }; |
515 enum MultiBlockState { | 520 enum MultiBlockState { |
516 MBS_Unknown, | 521 MBS_Unknown, |
517 MBS_SingleBlock, | 522 MBS_SingleBlock, |
518 MBS_MultiBlock | 523 MBS_MultiBlock |
519 }; | 524 }; |
520 VariableTracking() | 525 VariableTracking() |
521 : MultiDef(MDS_Unknown), MultiBlock(MBS_Unknown), SingleUseNode(NULL), | 526 : MultiDef(MDS_Unknown), MultiBlock(MBS_Unknown), SingleUseNode(NULL), |
522 SingleDefNode(NULL) {} | 527 SingleDefNode(NULL), FirstDefinition(NULL) {} |
523 MultiDefState getMultiDef() const { return MultiDef; } | 528 MultiDefState getMultiDef() const { return MultiDef; } |
524 MultiBlockState getMultiBlock() const { return MultiBlock; } | 529 MultiBlockState getMultiBlock() const { return MultiBlock; } |
525 const Inst *getFirstDefinition() const; | 530 const Inst *getFirstDefinition() const; |
526 const Inst *getSingleDefinition() const; | 531 const Inst *getSingleDefinition() const; |
527 const InstDefList &getDefinitions() const { return Definitions; } | 532 const InstDefList &getDefinitions() const { return Definitions; } |
528 const CfgNode *getNode() const { return SingleUseNode; } | 533 const CfgNode *getNode() const { return SingleUseNode; } |
529 void markUse(const Inst *Instr, const CfgNode *Node, bool IsFromDef, | 534 void markUse(MetadataKind TrackingKind, const Inst *Instr, |
530 bool IsImplicit); | 535 const CfgNode *Node, bool IsFromDef, bool IsImplicit); |
531 void markDef(const Inst *Instr, const CfgNode *Node); | 536 void markDef(MetadataKind TrackingKind, const Inst *Instr, |
| 537 const CfgNode *Node); |
532 | 538 |
533 private: | 539 private: |
534 VariableTracking &operator=(const VariableTracking &) = delete; | 540 VariableTracking &operator=(const VariableTracking &) = delete; |
535 MultiDefState MultiDef; | 541 MultiDefState MultiDef; |
536 MultiBlockState MultiBlock; | 542 MultiBlockState MultiBlock; |
537 const CfgNode *SingleUseNode; | 543 const CfgNode *SingleUseNode; |
538 const CfgNode *SingleDefNode; | 544 const CfgNode *SingleDefNode; |
539 // All definitions of the variable are collected here, in increasing | 545 // All definitions of the variable are collected here, in increasing |
540 // order of instruction number. | 546 // order of instruction number. |
541 InstDefList Definitions; | 547 InstDefList Definitions; // Only used if Kind==VMK_All |
| 548 const Inst *FirstDefinition; // A copy of Definitions[0] if Kind==VMK_All |
542 }; | 549 }; |
543 | 550 |
544 // VariablesMetadata analyzes and summarizes the metadata for the | 551 // VariablesMetadata analyzes and summarizes the metadata for the |
545 // complete set of Variables. | 552 // complete set of Variables. |
546 class VariablesMetadata { | 553 class VariablesMetadata { |
547 public: | 554 public: |
548 VariablesMetadata(const Cfg *Func) : Func(Func) {} | 555 VariablesMetadata(const Cfg *Func) : Func(Func) {} |
549 // Initialize the state by traversing all instructions/variables in | 556 // Initialize the state by traversing all instructions/variables in |
550 // the CFG. | 557 // the CFG. |
551 void init(); | 558 void init(MetadataKind TrackingKind); |
552 // Returns whether the given Variable is tracked in this object. It | 559 // Returns whether the given Variable is tracked in this object. It |
553 // should only return false if changes were made to the CFG after | 560 // should only return false if changes were made to the CFG after |
554 // running init(), in which case the state is stale and the results | 561 // running init(), in which case the state is stale and the results |
555 // shouldn't be trusted (but it may be OK e.g. for dumping). | 562 // shouldn't be trusted (but it may be OK e.g. for dumping). |
556 bool isTracked(const Variable *Var) const { | 563 bool isTracked(const Variable *Var) const { |
557 return Var->getIndex() < Metadata.size(); | 564 return Var->getIndex() < Metadata.size(); |
558 } | 565 } |
559 | 566 |
560 // Returns whether the given Variable has multiple definitions. | 567 // Returns whether the given Variable has multiple definitions. |
561 bool isMultiDef(const Variable *Var) const; | 568 bool isMultiDef(const Variable *Var) const; |
(...skipping 19 matching lines...) Expand all Loading... |
581 // coalescing. As a special case, function arguments are always | 588 // coalescing. As a special case, function arguments are always |
582 // considered multi-block because they are live coming into the | 589 // considered multi-block because they are live coming into the |
583 // entry block. | 590 // entry block. |
584 bool isMultiBlock(const Variable *Var) const; | 591 bool isMultiBlock(const Variable *Var) const; |
585 // Returns the node that the given Variable is used in, assuming | 592 // Returns the node that the given Variable is used in, assuming |
586 // isMultiBlock() returns false. Otherwise, NULL is returned. | 593 // isMultiBlock() returns false. Otherwise, NULL is returned. |
587 const CfgNode *getLocalUseNode(const Variable *Var) const; | 594 const CfgNode *getLocalUseNode(const Variable *Var) const; |
588 | 595 |
589 private: | 596 private: |
590 const Cfg *Func; | 597 const Cfg *Func; |
| 598 MetadataKind Kind; |
591 std::vector<VariableTracking> Metadata; | 599 std::vector<VariableTracking> Metadata; |
592 const static InstDefList NoDefinitions; | 600 const static InstDefList NoDefinitions; |
593 VariablesMetadata(const VariablesMetadata &) = delete; | 601 VariablesMetadata(const VariablesMetadata &) = delete; |
594 VariablesMetadata &operator=(const VariablesMetadata &) = delete; | 602 VariablesMetadata &operator=(const VariablesMetadata &) = delete; |
595 }; | 603 }; |
596 | 604 |
597 } // end of namespace Ice | 605 } // end of namespace Ice |
598 | 606 |
599 #endif // SUBZERO_SRC_ICEOPERAND_H | 607 #endif // SUBZERO_SRC_ICEOPERAND_H |
OLD | NEW |