Skip to content
This repository has been archived by the owner on Feb 2, 2023. It is now read-only.

Commit

Permalink
8283441: C2: segmentation fault in ciMethodBlocks::make_block_at(int)
Browse files Browse the repository at this point in the history
Backport-of: 947869609ce6b74d4d28f79724b823d8781adbed
  • Loading branch information
Yuri Nesterenko committed Aug 26, 2022
1 parent cab6b37 commit bd0ca30
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 12 deletions.
12 changes: 9 additions & 3 deletions src/hotspot/share/c1/c1_GraphBuilder.cpp
Expand Up @@ -210,8 +210,10 @@ void BlockListBuilder::handle_exceptions(BlockBegin* current, int cur_bci) {
}

void BlockListBuilder::handle_jsr(BlockBegin* current, int sr_bci, int next_bci) {
// start a new block after jsr-bytecode and link this block into cfg
make_block_at(next_bci, current);
if (next_bci < method()->code_size()) {
// start a new block after jsr-bytecode and link this block into cfg
make_block_at(next_bci, current);
}

// start a new block at the subroutine entry at mark it with special flag
BlockBegin* sr_block = make_block_at(sr_bci, current);
Expand All @@ -231,6 +233,8 @@ void BlockListBuilder::set_leaders() {
// branch target and a modification of the successor lists.
const BitMap& bci_block_start = method()->bci_block_start();

int end_bci = method()->code_size();

ciBytecodeStream s(method());
while (s.next() != ciBytecodeStream::EOBC()) {
int cur_bci = s.cur_bci();
Expand Down Expand Up @@ -301,7 +305,9 @@ void BlockListBuilder::set_leaders() {
case Bytecodes::_if_acmpne: // fall through
case Bytecodes::_ifnull: // fall through
case Bytecodes::_ifnonnull:
make_block_at(s.next_bci(), current);
if (s.next_bci() < end_bci) {
make_block_at(s.next_bci(), current);
}
make_block_at(s.get_dest(), current);
current = NULL;
break;
Expand Down
17 changes: 12 additions & 5 deletions src/hotspot/share/ci/ciMethodBlocks.cpp
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2006, 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2006, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
Expand Down Expand Up @@ -33,12 +33,13 @@


ciBlock *ciMethodBlocks::block_containing(int bci) {
assert(bci >= 0 && bci < _code_size, "valid bytecode range");
ciBlock *blk = _bci_to_block[bci];
return blk;
}

bool ciMethodBlocks::is_block_start(int bci) {
assert(bci >=0 && bci < _code_size, "valid bytecode range");
assert(bci >= 0 && bci < _code_size, "valid bytecode range");
ciBlock *b = _bci_to_block[bci];
assert(b != NULL, "must have block for bytecode");
return b->start_bci() == bci;
Expand Down Expand Up @@ -146,7 +147,9 @@ void ciMethodBlocks::do_analysis() {
case Bytecodes::_ifnonnull :
{
cur_block->set_control_bci(bci);
ciBlock *fall_through = make_block_at(s.next_bci());
if (s.next_bci() < limit_bci) {
ciBlock *fall_through = make_block_at(s.next_bci());
}
int dest_bci = s.get_dest();
ciBlock *dest = make_block_at(dest_bci);
break;
Expand All @@ -166,7 +169,9 @@ void ciMethodBlocks::do_analysis() {
case Bytecodes::_jsr :
{
cur_block->set_control_bci(bci);
ciBlock *ret = make_block_at(s.next_bci());
if (s.next_bci() < limit_bci) {
ciBlock *ret = make_block_at(s.next_bci());
}
int dest_bci = s.get_dest();
ciBlock *dest = make_block_at(dest_bci);
break;
Expand Down Expand Up @@ -224,7 +229,9 @@ void ciMethodBlocks::do_analysis() {
case Bytecodes::_jsr_w :
{
cur_block->set_control_bci(bci);
ciBlock *ret = make_block_at(s.next_bci());
if (s.next_bci() < limit_bci) {
ciBlock *ret = make_block_at(s.next_bci());
}
int dest_bci = s.get_far_dest();
ciBlock *dest = make_block_at(dest_bci);
break;
Expand Down
9 changes: 5 additions & 4 deletions src/hotspot/share/compiler/methodLiveness.cpp
Expand Up @@ -163,10 +163,11 @@ void MethodLiveness::init_basic_blocks() {
case Bytecodes::_ifnull:
case Bytecodes::_ifnonnull:
// Two way branch. Set predecessors at each destination.
dest = _block_map->at(bytes.next_bci());
assert(dest != NULL, "must be a block immediately following this one.");
dest->add_normal_predecessor(current_block);

if (bytes.next_bci() < method_len) {
dest = _block_map->at(bytes.next_bci());
assert(dest != NULL, "must be a block immediately following this one.");
dest->add_normal_predecessor(current_block);
}
dest = _block_map->at(bytes.get_dest());
assert(dest != NULL, "branch desination must start a block.");
dest->add_normal_predecessor(current_block);
Expand Down
38 changes: 38 additions & 0 deletions test/hotspot/jtreg/compiler/parsing/Custom.jasm
@@ -0,0 +1,38 @@
/*
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/

package compiler/parsing;

super public class Custom {

public static Method test:"(I)V" stack 2 locals 1 {
return;
Loop:
// Unreachable block
iload_0;
bipush 100;
if_icmpge Loop;
// Falls through
}

}
@@ -0,0 +1,42 @@
/*
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/

/*
* @test UnreachableBlockFallsThroughEndOfCode.java
* @bug 8283441
* @compile Custom.jasm UnreachableBlockFallsThroughEndOfCode.java
* @summary Compiling method that falls off the end of the code array
* @run main/othervm -XX:TieredStopAtLevel=1 -Xbatch compiler.parsing.UnreachableBlockFallsThroughEndOfCode
* @run main/othervm -XX:-TieredCompilation -Xbatch compiler.parsing.UnreachableBlockFallsThroughEndOfCode
*/

package compiler.parsing;

public class UnreachableBlockFallsThroughEndOfCode {
public static void main(String[] strArr) {
for (int i = 0; i < 20000; i++) {
Custom.test(i);
}
}
}

1 comment on commit bd0ca30

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.