Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-8135625 | emb-9 | Vladimir Ivanov | P3 | Resolved | Fixed | team |
VM doesn't constant fold loads from final fields when field MethodHandles are used.
public class FieldAccess {
static final int s1 = 123;
static final MethodHandle f1;
static {
try {
Class<?> THIS_CLASS = FieldAccess.class;
MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
f1 = LOOKUP.findStaticGetter(THIS_CLASS, "s1", int.class);
} catch (Exception e) {
throw new Error(e);
}
}
static int testMH() throws Throwable {
return (int)f1.invokeExact();
}
static int testDirect() throws Throwable {
return s1;
}
public static void main(String[] args) throws Throwable {
while (true) {
testDirect();
testMH();
}
}
}
$ java -XX:CompileCommand=dontinline,*::test* -XX:CompileCommand=print,*::test* FieldAccess
...
# {method} {0x0000000118aca538} 'testDirect' '()I' in 'jsr292/FieldAccess'
...
0x000000010be1716c: mov $0x7b,%eax
...
# {method} {0x0000000118aca498} 'testMH' '()I' in 'jsr292/FieldAccess'
...
0x000000010be1f3ec: movabs $0x76abb2f48,%r10 ; {oop(a 'java/lang/Class' = 'jsr292/FieldAccess')}
0x000000010be1f3f6: mov 0x6c(%r10),%eax ;*invokevirtual getInt
; - java.lang.invoke.LambdaForm$MH015/708049632::getIntStatic_001@23
; - java.lang.invoke.LambdaForm$MH013/991505714::invokeExact_000_MT@15
; - jsr292.FieldAccess::testMH@3 (line 24)
...
public class FieldAccess {
static final int s1 = 123;
static final MethodHandle f1;
static {
try {
Class<?> THIS_CLASS = FieldAccess.class;
MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
f1 = LOOKUP.findStaticGetter(THIS_CLASS, "s1", int.class);
} catch (Exception e) {
throw new Error(e);
}
}
static int testMH() throws Throwable {
return (int)f1.invokeExact();
}
static int testDirect() throws Throwable {
return s1;
}
public static void main(String[] args) throws Throwable {
while (true) {
testDirect();
testMH();
}
}
}
$ java -XX:CompileCommand=dontinline,*::test* -XX:CompileCommand=print,*::test* FieldAccess
...
# {method} {0x0000000118aca538} 'testDirect' '()I' in 'jsr292/FieldAccess'
...
0x000000010be1716c: mov $0x7b,%eax
...
# {method} {0x0000000118aca498} 'testMH' '()I' in 'jsr292/FieldAccess'
...
0x000000010be1f3ec: movabs $0x76abb2f48,%r10 ; {oop(a 'java/lang/Class' = 'jsr292/FieldAccess')}
0x000000010be1f3f6: mov 0x6c(%r10),%eax ;*invokevirtual getInt
; - java.lang.invoke.LambdaForm$MH015/708049632::getIntStatic_001@23
; - java.lang.invoke.LambdaForm$MH013/991505714::invokeExact_000_MT@15
; - jsr292.FieldAccess::testMH@3 (line 24)
...
- backported by
-
JDK-8135625 VM should constant fold Unsafe.get*() loads from final fields
-
- Resolved
-
- blocks
-
JDK-8078602 Support j.l.i.BoundMethodHandle$Species_* classes unloading
-
- Open
-
- relates to
-
JDK-8252494 C2: TypeAryPtr::cast_to_autobox_cache does not use ptr_type
-
- Resolved
-
-
JDK-8131675 EA fails with assert(false) failed: not unsafe or G1 barrier raw StoreP
-
- Closed
-
-
JDK-8148518 Unsafe.getCharUnaligned() loads aren't folded in case of -XX:-UseUnalignedAccesses
-
- Resolved
-