-
Bug
-
Resolution: Unresolved
-
P3
-
9
-
x86
This seems to be a day-one bug which was introduced by JDK-8134553 "CRC32C implementations for x86/x64 targets". It wasn't detected until know because there are not many machines which don't support CLMUL and the CRC32 jtreg tests didn't really work.
During our work onJDK-8176580 "[ppc, s390] CRC32C: wrong checksum result in some cases" we fixed the two regression tests test/compiler/intrinsics/zip/TestCRC32.java and test/compiler/intrinsics/zip/TestCRC32C.java which finally unveiled the problem on old x86 hardware.
We will now pushJDK-8176580 without the fixed regression tests. The new version of the tests are available from the following webrev:
http://cr.openjdk.java.net/~lucy/webrevs/8176580.03/
and they should be pushed together with the fix for this issue.
Running these test on old hardware will produce the following error:
command: main -Xbatch compiler.intrinsics.zip.TestCRC32C -m
reason: User specified action: run main/othervm/timeout=600 -Xbatch compiler.intrinsics.zip.TestCRC32C -m
Mode: othervm [/othervm specified]
elapsed time (seconds): 1.915
configuration:
STDOUT:
testing 1050 cases ...
STDERR:
ERROR: crc = 6f894393, crcReference = 2cdf6e8f
java.lang.Exception: TestCRC32C Error
at compiler.intrinsics.zip.TestCRC32C.check(TestCRC32C.java:218)
at compiler.intrinsics.zip.TestCRC32C.test_multi(TestCRC32C.java:280)
at compiler.intrinsics.zip.TestCRC32C.main(TestCRC32C.java:74)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:563)
at com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:110)
at java.base/java.lang.Thread.run(Thread.java:844)
JavaTest Message: Test threw exception: java.lang.Exception: TestCRC32C Error
JavaTest Message: shutting down test
If you don't have old hardware available, you can still manually force the error as describe by Lutz in the mail tread at http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2017-April/026029.html and copied here for your convenience:
The CRC32C implementation generates code depending on the CLMUL cpu feature being available. On most machines @Oracle and @SAP, this feature seems to be available – except for one of your MacOS test machines.
To gain control over that feature, I have modified just one line in src/cpu/x86/vm/vm_version_x86_64.hpp like this:
static bool supports_clmul() { return ((_features & CPU_CLMUL) != 0) && UseNewCode; }
The boolean UseNewCode is a command line parameter we use @SAP to make experimental code switchable during development. With that modification, I can force off the CLMUL feature at will. And voila, here is what I get (linux-x86_64):
lu0084 PrivSrc/TestCRC> /<some path>/sapjvm_9/bin/java -XX:+UseNewCode TestCRC32C_OpenJDK -m
updateBytesCRC32C: pclmulqdq = true.
testing 1050 cases ...
lu0084 PrivSrc/TestCRC> /<some path>/sapjvm_9/bin/java -XX:-UseNewCode TestCRC32C_OpenJDK -m
updateBytesCRC32C: pclmulqdq = false.
testing 1050 cases ...
ERROR: crc = 6f894393, crcReference = 2cdf6e8f
iteration 0: offsets[0] = 0 sizes[30] = 1024
Exception: java.lang.Exception: TestCRC32C Error
Exception in thread "main" java.lang.Exception: java.lang.Exception: TestCRC32C Error
at TestCRC32C_OpenJDK.test_multi(TestCRC32C_OpenJDK.java:306)
at TestCRC32C_OpenJDK.main(TestCRC32C_OpenJDK.java:74)
Caused by: java.lang.Exception: TestCRC32C Error
at TestCRC32C_OpenJDK.test_multi(TestCRC32C_OpenJDK.java:298)
... 1 more
lu0084 PrivSrc/TestCRC>
Output on MacOS is the same. I did not try solaris-x86_64.
During our work on
We will now push
http://cr.openjdk.java.net/~lucy/webrevs/8176580.03/
and they should be pushed together with the fix for this issue.
Running these test on old hardware will produce the following error:
command: main -Xbatch compiler.intrinsics.zip.TestCRC32C -m
reason: User specified action: run main/othervm/timeout=600 -Xbatch compiler.intrinsics.zip.TestCRC32C -m
Mode: othervm [/othervm specified]
elapsed time (seconds): 1.915
configuration:
STDOUT:
testing 1050 cases ...
STDERR:
ERROR: crc = 6f894393, crcReference = 2cdf6e8f
java.lang.Exception: TestCRC32C Error
at compiler.intrinsics.zip.TestCRC32C.check(TestCRC32C.java:218)
at compiler.intrinsics.zip.TestCRC32C.test_multi(TestCRC32C.java:280)
at compiler.intrinsics.zip.TestCRC32C.main(TestCRC32C.java:74)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:563)
at com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:110)
at java.base/java.lang.Thread.run(Thread.java:844)
JavaTest Message: Test threw exception: java.lang.Exception: TestCRC32C Error
JavaTest Message: shutting down test
If you don't have old hardware available, you can still manually force the error as describe by Lutz in the mail tread at http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2017-April/026029.html and copied here for your convenience:
The CRC32C implementation generates code depending on the CLMUL cpu feature being available. On most machines @Oracle and @SAP, this feature seems to be available – except for one of your MacOS test machines.
To gain control over that feature, I have modified just one line in src/cpu/x86/vm/vm_version_x86_64.hpp like this:
static bool supports_clmul() { return ((_features & CPU_CLMUL) != 0) && UseNewCode; }
The boolean UseNewCode is a command line parameter we use @SAP to make experimental code switchable during development. With that modification, I can force off the CLMUL feature at will. And voila, here is what I get (linux-x86_64):
lu0084 PrivSrc/TestCRC> /<some path>/sapjvm_9/bin/java -XX:+UseNewCode TestCRC32C_OpenJDK -m
updateBytesCRC32C: pclmulqdq = true.
testing 1050 cases ...
lu0084 PrivSrc/TestCRC> /<some path>/sapjvm_9/bin/java -XX:-UseNewCode TestCRC32C_OpenJDK -m
updateBytesCRC32C: pclmulqdq = false.
testing 1050 cases ...
ERROR: crc = 6f894393, crcReference = 2cdf6e8f
iteration 0: offsets[0] = 0 sizes[30] = 1024
Exception: java.lang.Exception: TestCRC32C Error
Exception in thread "main" java.lang.Exception: java.lang.Exception: TestCRC32C Error
at TestCRC32C_OpenJDK.test_multi(TestCRC32C_OpenJDK.java:306)
at TestCRC32C_OpenJDK.main(TestCRC32C_OpenJDK.java:74)
Caused by: java.lang.Exception: TestCRC32C Error
at TestCRC32C_OpenJDK.test_multi(TestCRC32C_OpenJDK.java:298)
... 1 more
lu0084 PrivSrc/TestCRC>
Output on MacOS is the same. I did not try solaris-x86_64.
- duplicates
-
JDK-8178719 CRC32C intrinsics incorrect on platforms without CLMUL support
- Closed
- relates to
-
JDK-8178723 Workaround for failure of CRC32C intrinsic on x86 machines without CLMUL support (JDK-8178720)
- Closed
-
JDK-8176580 [ppc, s390] CRC32C: wrong checksum result in some cases
- Closed
-
JDK-8134553 CRC32C implementations for x86/x64 targets
- Resolved