--- a/hotspot/src/share/vm/opto/output.cpp Tue Jan 28 11:21:43 2014 -0800
+++ b/hotspot/src/share/vm/opto/output.cpp Tue Jan 28 12:25:34 2014 -0800
@@ -1065,7 +1065,7 @@
// Compute prolog code size
_method_size = 0;
_frame_slots = OptoReg::reg2stack(_matcher->_old_SP)+_regalloc->_framesize;
-#ifdef IA64
+#if defined(IA64) && !defined(AIX)
if (save_argument_registers()) {
// 4815101: this is a stub with implicit and unknown precision fp args.
// The usual spill mechanism can only generate stfd's in this case, which
@@ -1083,6 +1083,7 @@
assert(_frame_slots >= 0 && _frame_slots < 1000000, "sanity check");
if (has_mach_constant_base_node()) {
+ uint add_size = 0;
// Fill the constant table.
// Note: This must happen before shorten_branches.
for (uint i = 0; i < _cfg->number_of_blocks(); i++) {
@@ -1096,6 +1097,9 @@
if (n->is_MachConstant()) {
MachConstantNode* machcon = n->as_MachConstant();
machcon->eval_constant(C);
+ } else if (n->is_Mach()) {
+ // On Power there are more nodes that issue constants.
+ add_size += (n->as_Mach()->ins_num_consts() * 8);
}
}
}
@@ -1103,7 +1107,7 @@
// Calculate the offsets of the constants and the size of the
// constant table (including the padding to the next section).
constant_table().calculate_offsets_and_size();
- const_req = constant_table().size();
+ const_req = constant_table().size() + add_size;
}
// Initialize the space for the BufferBlob used to find and verify
@@ -1374,7 +1378,7 @@
int offset = blk_starts[block_num] - current_offset;
if (block_num >= i) {
// Current and following block's offset are not
- // finilized yet, adjust distance by the difference
+ // finalized yet, adjust distance by the difference
// between calculated and final offsets of current block.
offset -= (blk_starts[i] - blk_offset);
}
@@ -1455,6 +1459,12 @@
// Intel all the time, with add-to-memory kind of opcodes.
previous_offset = current_offset;
}
+
+ // Not an else-if!
+ // If this is a trap based cmp then add its offset to the list.
+ if (mach->is_TrapBasedCheckNode()) {
+ inct_starts[inct_cnt++] = current_offset;
+ }
}
// Verify that there is sufficient space remaining
@@ -1721,6 +1731,12 @@
_inc_table.append(inct_starts[inct_cnt++], blk_labels[block_num].loc_pos());
continue;
}
+ // Handle implicit exception table updates: trap instructions.
+ if (n->is_Mach() && n->as_Mach()->is_TrapBasedCheckNode()) {
+ uint block_num = block->non_connector_successor(0)->_pre_order;
+ _inc_table.append(inct_starts[inct_cnt++], blk_labels[block_num].loc_pos());
+ continue;
+ }
} // End of for all blocks fill in exception table entries
}