publicclass Main { // We run this test for AOT to verify that there is a HDeoptimize with dex pc 0. /// CHECK-START: int Main.$noinline$getInt(byte[], int) BCE (after) /// CHECK: Deoptimize dex_pc:0 publicstaticint $noinline$getInt(byte[] array, int offset) { // The aget for `array[offset]` is at dex pc 0, so the Deoptimize // from dynamic BCE shall also be at dex pc 0. return ((array[offset ] & 0xFF) << 0) +
((array[offset + 1] & 0xFF) << 8) +
((array[offset + 2] & 0xFF) << 16) +
((array[offset + 3] & 0xFF) << 24);
}
publicstaticvoid main(String[] args) {
System.loadLibrary(args[0]); if (hasJit()) { byte[] array = { 0, 1, 2, 3 };
ensureJitCompiled(Main.class, "$noinline$getInt"); if (!hasJitCompiledEntrypoint(Main.class, "$noinline$getInt")) { thrownew Error("Unexpected entrypoint!");
} if ($noinline$getInt(array, 0) != 0x03020100) { thrownew Error();
} try { // The HDeoptimize at dex pc 0 was previously handled poorly as the dex pc 0 // was used to detect whether we entered the method. This meant that the // instrumentation would have reported MethodEnteredEvent and we would have // told JIT that the method was entered. With JIT-on-first-use we would also // immediatelly recompile the method and run the compiled code leading to // a an infinite deoptimization recursion, yielding StackOverflowError.
$noinline$getInt(array, 1);
} catch (ArrayIndexOutOfBoundsException ignored) {}
}
System.out.println("passed");
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.