6646019: array subscript expressions become top() with -d64
Stop compilation after negative array allocation Reviewed-by: never, jrose
This commit is contained in:
parent
6f63c6e88b
commit
088cd1203f
hotspot
@ -105,10 +105,19 @@ Node* Parse::array_addressing(BasicType type, int vals, const Type* *result2) {
|
|||||||
if (GenerateRangeChecks && need_range_check) {
|
if (GenerateRangeChecks && need_range_check) {
|
||||||
// Range is constant in array-oop, so we can use the original state of mem
|
// Range is constant in array-oop, so we can use the original state of mem
|
||||||
Node* len = load_array_length(ary);
|
Node* len = load_array_length(ary);
|
||||||
|
Node* tst;
|
||||||
|
if (sizetype->_hi <= 0) {
|
||||||
|
// If the greatest array bound is negative, we can conclude that we're
|
||||||
|
// compiling unreachable code, but the unsigned compare trick used below
|
||||||
|
// only works with non-negative lengths. Instead, hack "tst" to be zero so
|
||||||
|
// the uncommon_trap path will always be taken.
|
||||||
|
tst = _gvn.intcon(0);
|
||||||
|
} else {
|
||||||
// Test length vs index (standard trick using unsigned compare)
|
// Test length vs index (standard trick using unsigned compare)
|
||||||
Node* chk = _gvn.transform( new (C, 3) CmpUNode(idx, len) );
|
Node* chk = _gvn.transform( new (C, 3) CmpUNode(idx, len) );
|
||||||
BoolTest::mask btest = BoolTest::lt;
|
BoolTest::mask btest = BoolTest::lt;
|
||||||
Node* tst = _gvn.transform( new (C, 2) BoolNode(chk, btest) );
|
tst = _gvn.transform( new (C, 2) BoolNode(chk, btest) );
|
||||||
|
}
|
||||||
// Branch to failure if out of bounds
|
// Branch to failure if out of bounds
|
||||||
{ BuildCutout unless(this, tst, PROB_MAX);
|
{ BuildCutout unless(this, tst, PROB_MAX);
|
||||||
if (C->allow_range_check_smearing()) {
|
if (C->allow_range_check_smearing()) {
|
||||||
|
51
hotspot/test/compiler/6646019/Test.java
Normal file
51
hotspot/test/compiler/6646019/Test.java
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
|
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @test
|
||||||
|
* @bug 6646019
|
||||||
|
* @summary array subscript expressions become top() with -d64
|
||||||
|
* @run main/othervm -Xcomp -XX:CompileOnly=Test.test Test
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
public class Test {
|
||||||
|
final static int i = 2076285318;
|
||||||
|
long l = 2;
|
||||||
|
short s;
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Test t = new Test();
|
||||||
|
try { t.test(); }
|
||||||
|
catch (Throwable e) {
|
||||||
|
if (t.l != 5) {
|
||||||
|
System.out.println("Fails: " + t.l + " != 5");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void test() {
|
||||||
|
l = 5;
|
||||||
|
l = (new short[(byte)-2])[(byte)(l = i)];
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user