Mercurial > hg > truffle
comparison src/share/vm/opto/compile.hpp @ 4114:6729bbc1fcd6
7003454: order constants in constant table by number of references in code
Reviewed-by: kvn, never, bdelsart
author | twisti |
---|---|
date | Wed, 16 Nov 2011 01:39:50 -0800 |
parents | f6f3bb0ee072 |
children | b40ac3579043 |
comparison
equal
deleted
inserted
replaced
4113:8c57262447d3 | 4114:6729bbc1fcd6 |
---|---|
148 class Constant { | 148 class Constant { |
149 private: | 149 private: |
150 BasicType _type; | 150 BasicType _type; |
151 jvalue _value; | 151 jvalue _value; |
152 int _offset; // offset of this constant (in bytes) relative to the constant table base. | 152 int _offset; // offset of this constant (in bytes) relative to the constant table base. |
153 float _freq; | |
153 bool _can_be_reused; // true (default) if the value can be shared with other users. | 154 bool _can_be_reused; // true (default) if the value can be shared with other users. |
154 | 155 |
155 public: | 156 public: |
156 Constant() : _type(T_ILLEGAL), _offset(-1), _can_be_reused(true) { _value.l = 0; } | 157 Constant() : _type(T_ILLEGAL), _offset(-1), _freq(0.0f), _can_be_reused(true) { _value.l = 0; } |
157 Constant(BasicType type, jvalue value, bool can_be_reused = true) : | 158 Constant(BasicType type, jvalue value, float freq = 0.0f, bool can_be_reused = true) : |
158 _type(type), | 159 _type(type), |
159 _value(value), | 160 _value(value), |
160 _offset(-1), | 161 _offset(-1), |
162 _freq(freq), | |
161 _can_be_reused(can_be_reused) | 163 _can_be_reused(can_be_reused) |
162 {} | 164 {} |
163 | 165 |
164 bool operator==(const Constant& other); | 166 bool operator==(const Constant& other); |
165 | 167 |
170 jdouble get_jdouble() const { return _value.d; } | 172 jdouble get_jdouble() const { return _value.d; } |
171 jobject get_jobject() const { return _value.l; } | 173 jobject get_jobject() const { return _value.l; } |
172 | 174 |
173 int offset() const { return _offset; } | 175 int offset() const { return _offset; } |
174 void set_offset(int offset) { _offset = offset; } | 176 void set_offset(int offset) { _offset = offset; } |
177 | |
178 float freq() const { return _freq; } | |
179 void inc_freq(float freq) { _freq += freq; } | |
175 | 180 |
176 bool can_be_reused() const { return _can_be_reused; } | 181 bool can_be_reused() const { return _can_be_reused; } |
177 }; | 182 }; |
178 | 183 |
179 // Constant table. | 184 // Constant table. |
180 class ConstantTable { | 185 class ConstantTable { |
181 private: | 186 private: |
182 GrowableArray<Constant> _constants; // Constants of this table. | 187 GrowableArray<Constant> _constants; // Constants of this table. |
183 int _size; // Size in bytes the emitted constant table takes (including padding). | 188 int _size; // Size in bytes the emitted constant table takes (including padding). |
184 int _table_base_offset; // Offset of the table base that gets added to the constant offsets. | 189 int _table_base_offset; // Offset of the table base that gets added to the constant offsets. |
190 int _nof_jump_tables; // Number of jump-tables in this constant table. | |
191 | |
192 static int qsort_comparator(Constant* a, Constant* b); | |
193 | |
194 // We use negative frequencies to keep the order of the | |
195 // jump-tables in which they were added. Otherwise we get into | |
196 // trouble with relocation. | |
197 float next_jump_table_freq() { return -1.0f * (++_nof_jump_tables); } | |
185 | 198 |
186 public: | 199 public: |
187 ConstantTable() : | 200 ConstantTable() : |
188 _size(-1), | 201 _size(-1), |
189 _table_base_offset(-1) // We can use -1 here since the constant table is always bigger than 2 bytes (-(size / 2), see MachConstantBaseNode::emit). | 202 _table_base_offset(-1), // We can use -1 here since the constant table is always bigger than 2 bytes (-(size / 2), see MachConstantBaseNode::emit). |
203 _nof_jump_tables(0) | |
190 {} | 204 {} |
191 | 205 |
192 int size() const { assert(_size != -1, "size not yet calculated"); return _size; } | 206 int size() const { assert(_size != -1, "not calculated yet"); return _size; } |
193 | 207 |
194 void set_table_base_offset(int x) { assert(_table_base_offset == -1, "set only once"); _table_base_offset = x; } | 208 int calculate_table_base_offset() const; // AD specific |
195 int table_base_offset() const { assert(_table_base_offset != -1, "table base offset not yet set"); return _table_base_offset; } | 209 void set_table_base_offset(int x) { assert(_table_base_offset == -1 || x == _table_base_offset, "can't change"); _table_base_offset = x; } |
210 int table_base_offset() const { assert(_table_base_offset != -1, "not set yet"); return _table_base_offset; } | |
196 | 211 |
197 void emit(CodeBuffer& cb); | 212 void emit(CodeBuffer& cb); |
198 | 213 |
199 // Returns the offset of the last entry (the top) of the constant table. | 214 // Returns the offset of the last entry (the top) of the constant table. |
200 int top_offset() const { assert(_constants.top().offset() != -1, "constant not yet bound"); return _constants.top().offset(); } | 215 int top_offset() const { assert(_constants.top().offset() != -1, "not bound yet"); return _constants.top().offset(); } |
201 | 216 |
202 void calculate_offsets_and_size(); | 217 void calculate_offsets_and_size(); |
203 int find_offset(Constant& con) const; | 218 int find_offset(Constant& con) const; |
204 | 219 |
205 void add(Constant& con); | 220 void add(Constant& con); |
206 Constant add(BasicType type, jvalue value); | 221 Constant add(MachConstantNode* n, BasicType type, jvalue value); |
207 Constant add(MachOper* oper); | 222 Constant add(MachConstantNode* n, MachOper* oper); |
208 Constant add(jfloat f) { | 223 Constant add(MachConstantNode* n, jfloat f) { |
209 jvalue value; value.f = f; | 224 jvalue value; value.f = f; |
210 return add(T_FLOAT, value); | 225 return add(n, T_FLOAT, value); |
211 } | 226 } |
212 Constant add(jdouble d) { | 227 Constant add(MachConstantNode* n, jdouble d) { |
213 jvalue value; value.d = d; | 228 jvalue value; value.d = d; |
214 return add(T_DOUBLE, value); | 229 return add(n, T_DOUBLE, value); |
215 } | 230 } |
216 | 231 |
217 // Jump table | 232 // Jump-table |
218 Constant allocate_jump_table(MachConstantNode* n); | 233 Constant add_jump_table(MachConstantNode* n); |
219 void fill_jump_table(CodeBuffer& cb, MachConstantNode* n, GrowableArray<Label*> labels) const; | 234 void fill_jump_table(CodeBuffer& cb, MachConstantNode* n, GrowableArray<Label*> labels) const; |
220 }; | 235 }; |
221 | 236 |
222 private: | 237 private: |
223 // Fixed parameters to this compilation. | 238 // Fixed parameters to this compilation. |
224 const int _compile_id; | 239 const int _compile_id; |