FULL PRODUCT VERSION :
java version "1.6.0_15"
Java(TM) SE Runtime Environment (build 1.6.0_15-b03-219)
Java HotSpot(TM) 64-Bit Server VM (build 14.1-b02-90, mixed mode)
FULL OS VERSION :
This bug occurs on all platforms.
A DESCRIPTION OF THE PROBLEM :
By inspection of source code of the client compiler, I have discovered that it does not recognize the default branch of a lookupswitch or tableswitch bytecode to be a safepoint (if the default target is backwards). Typically this type of bytecode does not occur in javac-generated class files.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Inspect the HotSpot Client Compiler source code file:
src/share/vm/c1/c1_GraphBuilder.cpp @ 1251 and 1286:
// add default successor
sux->at_put(i, block_at(bci() + switch_->default_offset()));
ValueStack* state_before = has_bb ? state() : NULL;
append(new TableSwitch(ipop(), sux, switch_->low_key(), state_before, has_bb));
EXPECTED VERSUS ACTUAL BEHAVIOR :
A tableswitch or lookupswitch bytecode in which the default successor is a backward branch should be marked as a safepoint. The actual result is that such an instruction is not marked as a safepoint; this could lead to a long-running (or even non-terminating) loop in the compiled code without a safepoint.
ERROR MESSAGES/STACK TRACES THAT OCCUR :
Could result in VM crash.
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
Javac will not generate bytecode that demonstrates the bug. Jasm or similar must be used to construct such a test case.
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
The c1_GraphBuilder.cpp code should include the line
has_bb |= switch_->default_offset() < 0;
For both lookupswitch and tableswitch at the above mentioned lines.