[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