RFR: 8265907: JVM crashes when matching VectorMaskCmp Node [v3]

Jatin Bhateja jbhateja at openjdk.java.net
Mon May 31 07:04:22 UTC 2021


On Sat, 29 May 2021 03:25:18 GMT, Wang Huang <whuang at openjdk.org> wrote:

>> Wang Huang has updated the pull request incrementally with one additional commit since the last revision:
>> 
>>   fix x86's bug
>
> @iwanowww @mgkwill Could you do me a favor to review this issue? Any suggestion is welcome.

Hi @Wanghuang-Huawei , 
By adding suggested check we may suppress iotaShuffle intrinsification for Long256, Int128, Short64 species. 
Since currently shuffles are stored in a byte array so this case seeped through the constraint to prevent vectorization imposed by match rule supported vector (i.e.  vlen < 4 for byte vectors).

Please let me know if its ok to integrate following changes in your patch.


diff --git a/src/hotspot/cpu/x86/x86.ad b/src/hotspot/cpu/x86/x86.ad
index 5f6d5bc6fdb..c9f64d154e3 100644
--- a/src/hotspot/cpu/x86/x86.ad
+++ b/src/hotspot/cpu/x86/x86.ad
@@ -6866,6 +6866,24 @@ instruct evcmpFD(vec dst, vec src1, vec src2, immI8 cond, rRegP scratch, kReg kt
   ins_pipe( pipe_slow );
 %}

+instruct vcmp4B(legVec dst, legVec src1, legVec src2, immI8 cond, legVec tmp1, legVec tmp2, rRegP scratch) %{
+  predicate(vector_length_in_bytes(n->in(1)->in(1)) == 4 &&
+            vector_element_basic_type(n->in(1)->in(1)) == T_BYTE); // src1
+  match(Set dst (VectorMaskCmp (Binary src1 src2) cond));
+  effect(TEMP_DEF dst, TEMP scratch, TEMP tmp1, TEMP tmp2);
+  format %{ "vector_compare $dst,$src1,$src2,$cond\t! 4 byte comparison" %}
+  ins_encode %{
+    int vlen_enc = vector_length_encoding(this, $src1);
+    Assembler::ComparisonPredicate cmp = booltest_pred_to_comparison_pred($cond$$constant);
+    Assembler::Width ww = widthForType(vector_element_basic_type(this, $src1));
+    __ punpcklbw($tmp1$$XMMRegister, $src1$$XMMRegister);
+    __ punpcklbw($tmp2$$XMMRegister, $src2$$XMMRegister);
+    __ vpcmpCCW($dst$$XMMRegister, $tmp1$$XMMRegister, $tmp2$$XMMRegister, cmp, ww, vlen_enc, $scratch$$Register);
+    __ packsswb($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
 instruct vcmp(legVec dst, legVec src1, legVec src2, immI8 cond, rRegP scratch) %{
   predicate(vector_length_in_bytes(n->in(1)->in(1)) >=  8 && // src1
             vector_length_in_bytes(n->in(1)->in(1)) <= 32 && // src1

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

PR: https://git.openjdk.java.net/jdk/pull/3670


More information about the hotspot-compiler-dev mailing list