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 643 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
654 return; | 654 return; |
655 Name = VariableString::createWithString(Func, NewName); | 655 Name = VariableString::createWithString(Func, NewName); |
656 } | 656 } |
657 | 657 |
658 bool getIsArg() const { return IsArgument; } | 658 bool getIsArg() const { return IsArgument; } |
659 virtual void setIsArg(bool Val = true) { IsArgument = Val; } | 659 virtual void setIsArg(bool Val = true) { IsArgument = Val; } |
660 bool getIsImplicitArg() const { return IsImplicitArgument; } | 660 bool getIsImplicitArg() const { return IsImplicitArgument; } |
661 void setIsImplicitArg(bool Val = true) { IsImplicitArgument = Val; } | 661 void setIsImplicitArg(bool Val = true) { IsImplicitArgument = Val; } |
662 | 662 |
663 void setIgnoreLiveness() { IgnoreLiveness = true; } | 663 void setIgnoreLiveness() { IgnoreLiveness = true; } |
664 bool getIgnoreLiveness() const { return IgnoreLiveness; } | 664 bool getIgnoreLiveness() const { |
| 665 return IgnoreLiveness || IsRematerializable; |
| 666 } |
665 | 667 |
666 int32_t getStackOffset() const { return StackOffset; } | 668 int32_t getStackOffset() const { return StackOffset; } |
667 void setStackOffset(int32_t Offset) { StackOffset = Offset; } | 669 void setStackOffset(int32_t Offset) { StackOffset = Offset; } |
668 /// Returns the variable's stack offset in symbolic form, to improve | 670 /// Returns the variable's stack offset in symbolic form, to improve |
669 /// readability in DecorateAsm mode. | 671 /// readability in DecorateAsm mode. |
670 std::string getSymbolicStackOffset(const Cfg *Func) const { | 672 std::string getSymbolicStackOffset(const Cfg *Func) const { |
671 if (!BuildDefs::dump()) | 673 if (!BuildDefs::dump()) |
672 return ""; | 674 return ""; |
673 return "lv$" + getName(Func); | 675 return "lv$" + getName(Func); |
674 } | 676 } |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
856 enum MetadataKind { | 858 enum MetadataKind { |
857 VMK_Uses, /// Track only uses, not defs | 859 VMK_Uses, /// Track only uses, not defs |
858 VMK_SingleDefs, /// Track uses+defs, but only record single def | 860 VMK_SingleDefs, /// Track uses+defs, but only record single def |
859 VMK_All /// Track uses+defs, including full def list | 861 VMK_All /// Track uses+defs, including full def list |
860 }; | 862 }; |
861 using InstDefList = CfgVector<const Inst *>; | 863 using InstDefList = CfgVector<const Inst *>; |
862 | 864 |
863 /// VariableTracking tracks the metadata for a single variable. It is | 865 /// VariableTracking tracks the metadata for a single variable. It is |
864 /// only meant to be used internally by VariablesMetadata. | 866 /// only meant to be used internally by VariablesMetadata. |
865 class VariableTracking { | 867 class VariableTracking { |
866 VariableTracking &operator=(const VariableTracking &) = delete; | |
867 | |
868 public: | 868 public: |
869 enum MultiDefState { | 869 enum MultiDefState { |
870 // TODO(stichnot): Consider using just a simple counter. | 870 // TODO(stichnot): Consider using just a simple counter. |
871 MDS_Unknown, | 871 MDS_Unknown, |
872 MDS_SingleDef, | 872 MDS_SingleDef, |
873 MDS_MultiDefSingleBlock, | 873 MDS_MultiDefSingleBlock, |
874 MDS_MultiDefMultiBlock | 874 MDS_MultiDefMultiBlock |
875 }; | 875 }; |
876 enum MultiBlockState { MBS_Unknown, MBS_SingleBlock, MBS_MultiBlock }; | 876 enum MultiBlockState { |
| 877 MBS_Unknown, // Not yet initialized, so be conservative |
| 878 MBS_NoUses, // Known to have no uses |
| 879 MBS_SingleBlock, // All uses in are in a single block |
| 880 MBS_MultiBlock // Several uses across several blocks |
| 881 }; |
877 VariableTracking() = default; | 882 VariableTracking() = default; |
878 VariableTracking(const VariableTracking &) = default; | 883 VariableTracking(const VariableTracking &) = default; |
| 884 VariableTracking &operator=(const VariableTracking &) = default; |
| 885 VariableTracking(MultiBlockState MultiBlock) : MultiBlock(MultiBlock) {} |
879 MultiDefState getMultiDef() const { return MultiDef; } | 886 MultiDefState getMultiDef() const { return MultiDef; } |
880 MultiBlockState getMultiBlock() const { return MultiBlock; } | 887 MultiBlockState getMultiBlock() const { return MultiBlock; } |
881 const Inst *getFirstDefinitionSingleBlock() const; | 888 const Inst *getFirstDefinitionSingleBlock() const; |
882 const Inst *getSingleDefinition() const; | 889 const Inst *getSingleDefinition() const; |
883 const Inst *getFirstDefinition() const; | 890 const Inst *getFirstDefinition() const; |
884 const InstDefList &getLatterDefinitions() const { return Definitions; } | 891 const InstDefList &getLatterDefinitions() const { return Definitions; } |
885 CfgNode *getNode() const { return SingleUseNode; } | 892 CfgNode *getNode() const { return SingleUseNode; } |
886 RegWeight getUseWeight() const { return UseWeight; } | 893 RegWeight getUseWeight() const { return UseWeight; } |
887 void markUse(MetadataKind TrackingKind, const Inst *Instr, CfgNode *Node, | 894 void markUse(MetadataKind TrackingKind, const Inst *Instr, CfgNode *Node, |
888 bool IsImplicit); | 895 bool IsImplicit); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
941 const Inst *getFirstDefinition(const Variable *Var) const; | 948 const Inst *getFirstDefinition(const Variable *Var) const; |
942 const InstDefList &getLatterDefinitions(const Variable *Var) const; | 949 const InstDefList &getLatterDefinitions(const Variable *Var) const; |
943 | 950 |
944 /// Returns whether the given Variable is live across multiple blocks. Mainly, | 951 /// Returns whether the given Variable is live across multiple blocks. Mainly, |
945 /// this is used to partition Variables into single-block versus multi-block | 952 /// this is used to partition Variables into single-block versus multi-block |
946 /// sets for leveraging sparsity in liveness analysis, and for implementing | 953 /// sets for leveraging sparsity in liveness analysis, and for implementing |
947 /// simple stack slot coalescing. As a special case, function arguments are | 954 /// simple stack slot coalescing. As a special case, function arguments are |
948 /// always considered multi-block because they are live coming into the entry | 955 /// always considered multi-block because they are live coming into the entry |
949 /// block. | 956 /// block. |
950 bool isMultiBlock(const Variable *Var) const; | 957 bool isMultiBlock(const Variable *Var) const; |
| 958 bool isSingleBlock(const Variable *Var) const; |
951 /// Returns the node that the given Variable is used in, assuming | 959 /// Returns the node that the given Variable is used in, assuming |
952 /// isMultiBlock() returns false. Otherwise, nullptr is returned. | 960 /// isMultiBlock() returns false. Otherwise, nullptr is returned. |
953 CfgNode *getLocalUseNode(const Variable *Var) const; | 961 CfgNode *getLocalUseNode(const Variable *Var) const; |
954 | 962 |
955 /// Returns the total use weight computed as the sum of uses multiplied by a | 963 /// Returns the total use weight computed as the sum of uses multiplied by a |
956 /// loop nest depth factor for each use. | 964 /// loop nest depth factor for each use. |
957 RegWeight getUseWeight(const Variable *Var) const; | 965 RegWeight getUseWeight(const Variable *Var) const; |
958 | 966 |
959 private: | 967 private: |
960 const Cfg *Func; | 968 const Cfg *Func; |
961 MetadataKind Kind; | 969 MetadataKind Kind; |
962 CfgVector<VariableTracking> Metadata; | 970 CfgVector<VariableTracking> Metadata; |
963 const static InstDefList NoDefinitions; | 971 const static InstDefList NoDefinitions; |
964 }; | 972 }; |
965 | 973 |
966 } // end of namespace Ice | 974 } // end of namespace Ice |
967 | 975 |
968 #endif // SUBZERO_SRC_ICEOPERAND_H | 976 #endif // SUBZERO_SRC_ICEOPERAND_H |
OLD | NEW |