[jdk17] RFR: 8269568: JVM crashes when running VectorMask query tests

Jie Fu jiefu at openjdk.java.net
Wed Jun 30 13:42:04 UTC 2021


On Wed, 30 Jun 2021 01:41:39 GMT, Xiaohong Gong <xgong at openjdk.org> wrote:

> > The improved tests also find more bugs of vector mask operations on x86.
> > Would you like to fix them together?
> 
> Hi @DamonFool , thanks for looking at this PR! I also met the tests failures on some x86 machine. Seems something is wrong with the backend implementation. However, unfortunately I'm not very familiar with x86 instructions. So maybe @jatin-bhateja could help to take a look please? Thanks so much!

After some investigation, I believe the failure is caused by the incorrect code-gen for VectorStoreMask on x86.

Something like this would fix the failures:

diff --git a/src/hotspot/cpu/x86/x86.ad b/src/hotspot/cpu/x86/x86.ad
index ed34ab7..a837549 100644
--- a/src/hotspot/cpu/x86/x86.ad
+++ b/src/hotspot/cpu/x86/x86.ad
@@ -7545,29 +7545,32 @@ instruct vstoreMask2B_evex(vec dst, vec src, immI_2 size) %{
   ins_pipe( pipe_slow );
 %}

-instruct storeMask4B(vec dst, vec src, immI_4 size) %{
+instruct storeMask4B(vec dst, vec src, immI_4 size, vec tmp) %{
   predicate (vector_length(n) <= 4 && UseAVX <= 2);
   match(Set dst (VectorStoreMask src size));
   format %{ "vector_store_mask $dst,$src\t!" %}
+  effect(TEMP dst, TEMP tmp);
   ins_encode %{
     assert(UseSSE >= 3, "required");
+    __ pxor($tmp$$XMMRegister, $tmp$$XMMRegister);
     __ pabsd($dst$$XMMRegister, $src$$XMMRegister);
-    __ packssdw($dst$$XMMRegister, $dst$$XMMRegister);
-    __ packsswb($dst$$XMMRegister, $dst$$XMMRegister);
+    __ packssdw($dst$$XMMRegister, $tmp$$XMMRegister);
+    __ packsswb($dst$$XMMRegister, $tmp$$XMMRegister);
   %}
   ins_pipe( pipe_slow );
 %}

-instruct vstoreMask4B(vec dst, vec src, immI_4 size) %{
+instruct vstoreMask4B(vec dst, vec src, immI_4 size, vec tmp) %{
   predicate(vector_length(n) == 8 && UseAVX <= 2);
   match(Set dst (VectorStoreMask src size));
   format %{ "vector_store_mask $dst,$src\t!" %}
-  effect(TEMP dst);
+  effect(TEMP dst, TEMP tmp);
   ins_encode %{
     int vlen_enc = Assembler::AVX_128bit;
+    __ pxor($tmp$$XMMRegister, $tmp$$XMMRegister);
     __ vextracti128($dst$$XMMRegister, $src$$XMMRegister, 0x1);
     __ vpackssdw($dst$$XMMRegister, $src$$XMMRegister, $dst$$XMMRegister, vlen_enc);
-    __ vpacksswb($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vlen_enc);
+    __ vpacksswb($dst$$XMMRegister, $dst$$XMMRegister, $tmp$$XMMRegister, vlen_enc);
     __ vpabsb($dst$$XMMRegister, $dst$$XMMRegister, vlen_enc);
   %}
   ins_pipe( pipe_slow );
@@ -7613,8 +7616,9 @@ instruct storeMask8B_avx(vec dst, vec src, immI_8 size, legVec vtmp) %{
     __ vpshufps($dst$$XMMRegister, $src$$XMMRegister, $src$$XMMRegister, 0x88, Assembler::AVX_256bit);
     __ vextracti128($vtmp$$XMMRegister, $dst$$XMMRegister, 0x1);
     __ vblendps($dst$$XMMRegister, $dst$$XMMRegister, $vtmp$$XMMRegister, 0xC, vlen_enc);
-    __ vpackssdw($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vlen_enc);
-    __ vpacksswb($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vlen_enc);
+    __ pxor($vtmp$$XMMRegister, $vtmp$$XMMRegister);
+    __ vpackssdw($dst$$XMMRegister, $dst$$XMMRegister, $vtmp$$XMMRegister, vlen_enc);
+    __ vpacksswb($dst$$XMMRegister, $dst$$XMMRegister, $vtmp$$XMMRegister, vlen_enc);
     __ vpabsb($dst$$XMMRegister, $dst$$XMMRegister, vlen_enc);
   %}
   ins_pipe( pipe_slow );


But I'm afraid there are more rules which need to be fixed.
So I've filed JDK-8269679.

Please feel free to go ahead.
Thanks.

-------------

PR: https://git.openjdk.java.net/jdk17/pull/168


More information about the hotspot-compiler-dev mailing list