8258384: AArch64: SVE verify_ptrue fails on some tests #50
After applying , some Vector API tests fail with SIGILL on SVE system. The SIGILL was triggered by verify_ptrue before c2 compiled function returns, which means that the preserved p7 register (as ptrue) has been clobbered before returning to c2 compiled code. (p7 is not preserved cross function calls, and system calls ). Currently we try to reinitialize ptrue at each entrypoint of returning from non-c2 compiled code, which indicating possible C or system calls. However, there's still one entrypoint missing, exception handling, as we may jump to c2 compiled code for exception handler. See OptoRuntime::generate_exception_blob(). Adding reinitialize_ptrue before jumping back to c2 compiled code in generate_exception_blob() could solve those Vector API failures. Actually I had that in my initial test patch , I don't know why I missed that in final patch... I reran tests with the same approach of  and found that there's still something missing, the nmethod_entry_barrier() in c2 function prolog. The barrier may call to runtime code (see generate_method_entry_barrier()). To reduce the risk of missing such reinitialize_ptrue in newly added code in future, I think it would be better to do the reinitialize in pop_call_clobbered_registers(). P.S. the SIGILL message is also not clear, it should print detailed message as indicated by MacroAssembler::stop() call. This is caused by JDK-8255711 removing the message printing code. This patch also adds it back, so that it could print detailed message for abort. Tested with tier1-3 on SVE hardware. Also verified with the same approach of patch  with jtreg tests hotspot_all_no_apps and jdk:tier1-3 passed without incorrect ptrue value assertion failure.  openjdk/jdk#1621  https://github.com/torvalds/linux/blob/master/Documentation/arm64/sve.rst  http://cr.openjdk.java.net/~njian/8231441/0001-RFC-Block-one-caller-save-register-for-C2.patch
@nsjian This change now passes all automated pre-integration checks.
After integration, the commit message for the final commit will be:
At the time when this comment was updated there had been 48 new commits pushed to the
As there are no conflicts, your changes will automatically be rebased on top of these commits when integrating. If you prefer to avoid this automatic rebasing, please check the documentation for the /integrate command for further details.
@nsjian Since your change was applied there have been 51 commits pushed to the
Your commit was automatically rebased without conflicts.
Pushed as commit a7e5da2.