Duplicate :
|
|
Relates :
|
|
Relates :
|
JDK-8254231 adds [2] the following assert to output.cpp assert(!is_mcall || (call_returns[block->_pre_order] <= (uint) current_offset)) Which verifies that the offset returned by MachCallNode::ret_addr_offset() (and sub-types) at [1] matches the emitted code, to avoid potential conflicts between oop maps of different calls. This assert is failing when running test/hotspot/jtreg/compiler/intrinsics/string/TestStringLatin1IndexOfChar.java on Linux-x86 (32-bits), because it forces lower SSE settings. The real issue is MachCallRuntimeNode::ret_addr_offset() computing the offset incorrectly for CallLeafNoFP: it does not include FP stack cleaning. [1] : https://github.com/openjdk/jdk/blob/master/src/hotspot/share/opto/output.cpp#L1530 [2]: diff --git a/src/hotspot/share/opto/output.cpp b/src/hotspot/share/opto/output.cpp index 8e78481a491..681cd205044 100644 --- a/src/hotspot/share/opto/output.cpp +++ b/src/hotspot/share/opto/output.cpp @@ -1683,6 +1683,8 @@ void PhaseOutput::fill_buffer(CodeBuffer* cb, uint* blk_starts) { n->emit(*cb, C->regalloc()); current_offset = cb->insts_size(); + assert(!is_mcall || (call_returns[block->_pre_order] <= (uint) current_offset), "ret_addr_offset() not within emitted code"); + // Above we only verified that there is enough space in the instruction section. // However, the instruction may emit stubs that cause code buffer expansion. // Bail out here if expansion failed due to a lack of code cache space.
|