< prev index next >
src/hotspot/share/opto/output.cpp
Print this page
@@ -69,26 +69,33 @@
Block *broot = _cfg->get_root_block();
const StartNode *start = entry->head()->as_Start();
// Replace StartNode with prolog
- MachPrologNode *prolog = new MachPrologNode();
+ Label verified_entry;
+ MachPrologNode* prolog = new MachPrologNode(&verified_entry);
entry->map_node(prolog, 0);
_cfg->map_node_to_block(prolog, entry);
_cfg->unmap_node_from_block(start); // start is no longer in any block
// Virtual methods need an unverified entry point
+ bool has_value_entry = false;
if (is_osr_compilation()) {
if (PoisonOSREntry) {
// TODO: Should use a ShouldNotReachHereNode...
_cfg->insert( broot, 0, new MachBreakpointNode() );
}
} else {
if (_method && !_method->flags().is_static()) {
// Insert unvalidated entry point
_cfg->insert(broot, 0, new MachUEPNode());
}
+ if (_method && _method->get_Method()->has_scalarized_args()) {
+ // Insert value type entry point
+ _cfg->insert(broot, 0, new MachVVEPNode(&verified_entry));
+ has_value_entry = true;
+ }
}
// Break before main entry point
if ((_method && C->directive()->BreakAtExecuteOption) ||
(OptoBreakpoint && is_method_compilation()) ||
@@ -120,10 +127,22 @@
if (cb == NULL || failing()) {
return;
}
+ if (has_value_entry) {
+ // We added an entry point for unscalarized value types
+ // Compute offset of "normal" entry point
+ _code_offsets.set_value(CodeOffsets::Verified_Value_Entry, 0);
+ uint entry_offset = -1; // will be patched later
+ if (!_method->flags().is_static()) {
+ MachVVEPNode* vvep = (MachVVEPNode*)broot->get_node(0);
+ entry_offset = vvep->size(_regalloc);
+ }
+ _code_offsets.set_value(CodeOffsets::Entry, entry_offset);
+ }
+
ScheduleAndBundle();
#ifndef PRODUCT
if (trace_opto_output()) {
tty->print("\n---- After ScheduleAndBundle ----\n");
@@ -971,10 +990,14 @@
// Compute the byte offset where we can store the deopt pc.
if (fixed_slots() != 0) {
_orig_pc_slot_offset_in_bytes = _regalloc->reg2offset(OptoReg::stack2reg(_orig_pc_slot));
}
+ if (C->needs_stack_repair()) {
+ // Compute the byte offset of the stack increment value
+ _sp_inc_slot_offset_in_bytes = _regalloc->reg2offset(OptoReg::stack2reg(_sp_inc_slot));
+ }
// Compute prolog code size
_method_size = 0;
_frame_slots = OptoReg::reg2stack(_matcher->_old_SP)+_regalloc->_framesize;
#if defined(IA64) && !defined(AIX)
< prev index next >