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 /// \file | 10 /// \file |
(...skipping 711 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
722 void setRegNumTmp(RegNumT NewRegNum) { RegNumTmp = NewRegNum; } | 722 void setRegNumTmp(RegNumT NewRegNum) { RegNumTmp = NewRegNum; } |
723 | 723 |
724 RegWeight getWeight(const Cfg *Func) const; | 724 RegWeight getWeight(const Cfg *Func) const; |
725 | 725 |
726 void setMustHaveReg() { RegRequirement = RR_MustHaveRegister; } | 726 void setMustHaveReg() { RegRequirement = RR_MustHaveRegister; } |
727 bool mustHaveReg() const { return RegRequirement == RR_MustHaveRegister; } | 727 bool mustHaveReg() const { return RegRequirement == RR_MustHaveRegister; } |
728 void setMustNotHaveReg() { RegRequirement = RR_MustNotHaveRegister; } | 728 void setMustNotHaveReg() { RegRequirement = RR_MustNotHaveRegister; } |
729 bool mustNotHaveReg() const { | 729 bool mustNotHaveReg() const { |
730 return RegRequirement == RR_MustNotHaveRegister; | 730 return RegRequirement == RR_MustNotHaveRegister; |
731 } | 731 } |
732 bool mayHaveReg() const { return RegRequirement == RR_MayHaveRegister; } | |
732 void setRematerializable(RegNumT NewRegNum, int32_t NewOffset) { | 733 void setRematerializable(RegNumT NewRegNum, int32_t NewOffset) { |
733 IsRematerializable = true; | 734 IsRematerializable = true; |
734 setRegNum(NewRegNum); | 735 setRegNum(NewRegNum); |
735 setStackOffset(NewOffset); | 736 setStackOffset(NewOffset); |
736 setMustHaveReg(); | 737 setMustHaveReg(); |
737 } | 738 } |
738 bool isRematerializable() const { return IsRematerializable; } | 739 bool isRematerializable() const { return IsRematerializable; } |
739 | 740 |
740 void setRegClass(uint8_t RC) { RegisterClass = static_cast<RegClass>(RC); } | 741 void setRegClass(uint8_t RC) { RegisterClass = static_cast<RegClass>(RC); } |
741 RegClass getRegClass() const { return RegisterClass; } | 742 RegClass getRegClass() const { return RegisterClass; } |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
782 Variable *getLinkedTo() const { return LinkedTo; } | 783 Variable *getLinkedTo() const { return LinkedTo; } |
783 /// Follow the LinkedTo chain up to the furthest ancestor. | 784 /// Follow the LinkedTo chain up to the furthest ancestor. |
784 Variable *getLinkedToRoot() const { | 785 Variable *getLinkedToRoot() const { |
785 Variable *Root = LinkedTo; | 786 Variable *Root = LinkedTo; |
786 if (Root == nullptr) | 787 if (Root == nullptr) |
787 return nullptr; | 788 return nullptr; |
788 while (Root->LinkedTo != nullptr) | 789 while (Root->LinkedTo != nullptr) |
789 Root = Root->LinkedTo; | 790 Root = Root->LinkedTo; |
790 return Root; | 791 return Root; |
791 } | 792 } |
793 /// Follow the LinkedTo chain up to the furthest stack-allocated ancestor. | |
794 /// This only makes sense after register allocation is complete. | |
Eric Holk
2016/07/25 19:59:22
Is there an assertion you could add to make sure r
Jim Stichnoth
2016/07/26 05:59:09
I don't really think it could be done cleanly and
| |
795 Variable *getLinkedToStackRoot() const { | |
796 Variable *FurthestStackVar = nullptr; | |
797 for (Variable *Root = LinkedTo; Root != nullptr; Root = Root->LinkedTo) { | |
798 if (!Root->hasReg()) { | |
799 FurthestStackVar = Root; | |
800 } | |
801 } | |
802 return FurthestStackVar; | |
803 } | |
792 | 804 |
793 static bool classof(const Operand *Operand) { | 805 static bool classof(const Operand *Operand) { |
794 OperandKind Kind = Operand->getKind(); | 806 OperandKind Kind = Operand->getKind(); |
795 return Kind >= kVariable && Kind <= kVariable_Max; | 807 return Kind >= kVariable && Kind <= kVariable_Max; |
796 } | 808 } |
797 | 809 |
798 SizeT hashValue() const override { return std::hash<SizeT>()(getIndex()); } | 810 SizeT hashValue() const override { return std::hash<SizeT>()(getIndex()); } |
799 | 811 |
800 protected: | 812 protected: |
801 Variable(const Cfg *Func, OperandKind K, Type Ty, SizeT Index) | 813 Variable(const Cfg *Func, OperandKind K, Type Ty, SizeT Index) |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1044 return Operand->getKind() == kVariableBoolean; | 1056 return Operand->getKind() == kVariableBoolean; |
1045 } | 1057 } |
1046 | 1058 |
1047 private: | 1059 private: |
1048 Variable *BoolSource = nullptr; | 1060 Variable *BoolSource = nullptr; |
1049 }; | 1061 }; |
1050 | 1062 |
1051 } // end of namespace Ice | 1063 } // end of namespace Ice |
1052 | 1064 |
1053 #endif // SUBZERO_SRC_ICEOPERAND_H | 1065 #endif // SUBZERO_SRC_ICEOPERAND_H |
OLD | NEW |