1 //===-- LiveRange.h - Store info about a live range --------------*- C++ -*--=//
3 // Implements a live range using a ValueSet. A LiveRange is a simple set
6 // Since the Value pointed by a use is the same as of its def, it is sufficient
7 // to keep only defs in a LiveRange.
9 //===----------------------------------------------------------------------===//
14 #include "llvm/Analysis/LiveVar/ValueSet.h"
15 #include "llvm/Value.h"
22 class LiveRange : public ValueSet {
23 RegClass *MyRegClass; // register classs (e.g., int, FP) for this LR
25 // doesSpanAcrossCalls - Does this live range span across calls?
26 // This information is used by graph
27 // coloring algo to avoid allocating volatile colors to live ranges
28 // that span across calls (since they have to be saved/restored)
30 bool doesSpanAcrossCalls;
32 IGNode *UserIGNode; // IGNode which uses this LR
33 int Color; // color assigned to this live range
34 bool mustSpill; // whether this LR must be spilt
36 // mustSaveAcrossCalls - whether this LR must be saved accross calls
37 // ***TODO REMOVE this
39 bool mustSaveAcrossCalls;
41 // SuggestedColor - if this LR has a suggested color, can it be
42 // really alloated? A suggested color cannot be allocated when the
43 // suggested color is volatile and when there are call
46 int SuggestedColor; // The suggested color for this LR
48 // CanUseSuggestedCol - It is possible that a suggested color for
49 // this live range is not available before graph coloring (e.g., it
50 // can be allocated to another live range which interferes with
53 bool CanUseSuggestedCol;
55 // SpilledStackOffsetFromFP - If this LR is spilled, its stack
56 // offset from *FP*. The spilled offsets must always be relative to
59 int SpilledStackOffsetFromFP;
61 // HasSpillOffset 0 Whether this live range has a spill offset
65 // The spill cost of this live range. Calculated using loop depth of
66 // each reference to each Value in the live range
72 Color = SuggestedColor = -1; // not yet colored
73 mustSpill = mustSaveAcrossCalls = false;
76 doesSpanAcrossCalls = false;
77 CanUseSuggestedCol = true;
78 HasSpillOffset = false;
82 void setRegClass(RegClass *RC) { MyRegClass = RC; }
84 RegClass *getRegClass() const { assert(MyRegClass); return MyRegClass; }
86 bool hasColor() const { return Color != -1; }
88 unsigned getColor() const { assert(Color != -1); return (unsigned)Color; }
90 void setColor(unsigned Col) { Color = (int)Col; }
92 inline void setCallInterference() {
93 doesSpanAcrossCalls = 1;
96 inline bool isCallInterference() const {
97 return doesSpanAcrossCalls == 1;
100 inline void markForSpill() { mustSpill = true; }
102 inline bool isMarkedForSpill() { return mustSpill; }
104 inline void setSpillOffFromFP(int StackOffset) {
105 assert(mustSpill && "This LR is not spilled");
106 SpilledStackOffsetFromFP = StackOffset;
107 HasSpillOffset = true;
110 inline void modifySpillOffFromFP(int StackOffset) {
111 assert(mustSpill && "This LR is not spilled");
112 SpilledStackOffsetFromFP = StackOffset;
113 HasSpillOffset = true;
116 inline bool hasSpillOffset() const {
117 return HasSpillOffset;
120 inline int getSpillOffFromFP() const {
121 assert(HasSpillOffset && "This LR is not spilled");
122 return SpilledStackOffsetFromFP;
125 inline void markForSaveAcrossCalls() { mustSaveAcrossCalls = true; }
127 inline void setUserIGNode(IGNode *IGN) {
128 assert(!UserIGNode); UserIGNode = IGN;
131 // getUserIGNode - NULL if the user is not allocated
132 inline IGNode *getUserIGNode() const { return UserIGNode; }
134 inline const Type *getType() const {
135 return (*begin())->getType(); // set's don't have a front
138 inline void setSuggestedColor(int Col) {
139 if (SuggestedColor == -1)
140 SuggestedColor = Col;
143 std::cerr << "Already has a suggested color " << Col << "\n";
147 inline unsigned getSuggestedColor() const {
148 assert(SuggestedColor != -1); // only a valid color is obtained
149 return (unsigned)SuggestedColor;
152 inline bool hasSuggestedColor() const {
153 return SuggestedColor != -1;
156 inline bool isSuggestedColorUsable() const {
157 assert(hasSuggestedColor() && "No suggested color");
158 return CanUseSuggestedCol;
161 inline void setSuggestedColorUsable(bool val) {
162 assert(hasSuggestedColor() && "No suggested color");
163 CanUseSuggestedCol = val;
166 inline void addSpillCost(unsigned cost) {
170 inline unsigned getSpillCost() const {