--- a/hotspot/src/share/vm/opto/machnode.cpp Mon Nov 14 18:38:03 2011 -0800
+++ b/hotspot/src/share/vm/opto/machnode.cpp Wed Nov 16 01:39:50 2011 -0800
@@ -480,21 +480,20 @@
//=============================================================================
int MachConstantNode::constant_offset() {
- int offset = _constant.offset();
// Bind the offset lazily.
- if (offset == -1) {
+ if (_constant.offset() == -1) {
Compile::ConstantTable& constant_table = Compile::current()->constant_table();
- // If called from Compile::scratch_emit_size assume the worst-case
- // for load offsets: half the constant table size.
- // NOTE: Don't return or calculate the actual offset (which might
- // be zero) because that leads to problems with e.g. jumpXtnd on
- // some architectures (cf. add-optimization in SPARC jumpXtnd).
- if (Compile::current()->in_scratch_emit_size())
- return constant_table.size() / 2;
- offset = constant_table.table_base_offset() + constant_table.find_offset(_constant);
- _constant.set_offset(offset);
+ int offset = constant_table.find_offset(_constant);
+ // If called from Compile::scratch_emit_size return the
+ // pre-calculated offset.
+ // NOTE: If the AD file does some table base offset optimizations
+ // later the AD file needs to take care of this fact.
+ if (Compile::current()->in_scratch_emit_size()) {
+ return constant_table.calculate_table_base_offset() + offset;
+ }
+ _constant.set_offset(constant_table.table_base_offset() + offset);
}
- return offset;
+ return _constant.offset();
}