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