Skip to content

Commit dc12cb7

Browse files
author
Nils Eliasson
committed
8267652: c2 loop unrolling by 8 results in reading memory past array
Reviewed-by: sviswanathan, kvn, vlivanov
1 parent 578c55b commit dc12cb7

File tree

1 file changed

+49
-22
lines changed

1 file changed

+49
-22
lines changed

src/hotspot/cpu/x86/x86.ad

Lines changed: 49 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4844,7 +4844,8 @@ instruct vaddB_reg(vec dst, vec src1, vec src2) %{
48444844
%}
48454845

48464846
instruct vaddB_mem(vec dst, vec src, memory mem) %{
4847-
predicate(UseAVX > 0);
4847+
predicate((UseAVX > 0) &&
4848+
(vector_length_in_bytes(n->in(1)) > 8));
48484849
match(Set dst (AddVB src (LoadVector mem)));
48494850
format %{ "vpaddb $dst,$src,$mem\t! add packedB" %}
48504851
ins_encode %{
@@ -4877,7 +4878,8 @@ instruct vaddS_reg(vec dst, vec src1, vec src2) %{
48774878
%}
48784879

48794880
instruct vaddS_mem(vec dst, vec src, memory mem) %{
4880-
predicate(UseAVX > 0);
4881+
predicate((UseAVX > 0) &&
4882+
(vector_length_in_bytes(n->in(1)) > 8));
48814883
match(Set dst (AddVS src (LoadVector mem)));
48824884
format %{ "vpaddw $dst,$src,$mem\t! add packedS" %}
48834885
ins_encode %{
@@ -4911,7 +4913,8 @@ instruct vaddI_reg(vec dst, vec src1, vec src2) %{
49114913

49124914

49134915
instruct vaddI_mem(vec dst, vec src, memory mem) %{
4914-
predicate(UseAVX > 0);
4916+
predicate((UseAVX > 0) &&
4917+
(vector_length_in_bytes(n->in(1)) > 8));
49154918
match(Set dst (AddVI src (LoadVector mem)));
49164919
format %{ "vpaddd $dst,$src,$mem\t! add packedI" %}
49174920
ins_encode %{
@@ -4944,7 +4947,8 @@ instruct vaddL_reg(vec dst, vec src1, vec src2) %{
49444947
%}
49454948

49464949
instruct vaddL_mem(vec dst, vec src, memory mem) %{
4947-
predicate(UseAVX > 0);
4950+
predicate((UseAVX > 0) &&
4951+
(vector_length_in_bytes(n->in(1)) > 8));
49484952
match(Set dst (AddVL src (LoadVector mem)));
49494953
format %{ "vpaddq $dst,$src,$mem\t! add packedL" %}
49504954
ins_encode %{
@@ -4977,7 +4981,8 @@ instruct vaddF_reg(vec dst, vec src1, vec src2) %{
49774981
%}
49784982

49794983
instruct vaddF_mem(vec dst, vec src, memory mem) %{
4980-
predicate(UseAVX > 0);
4984+
predicate((UseAVX > 0) &&
4985+
(vector_length_in_bytes(n->in(1)) > 8));
49814986
match(Set dst (AddVF src (LoadVector mem)));
49824987
format %{ "vaddps $dst,$src,$mem\t! add packedF" %}
49834988
ins_encode %{
@@ -5010,7 +5015,8 @@ instruct vaddD_reg(vec dst, vec src1, vec src2) %{
50105015
%}
50115016

50125017
instruct vaddD_mem(vec dst, vec src, memory mem) %{
5013-
predicate(UseAVX > 0);
5018+
predicate((UseAVX > 0) &&
5019+
(vector_length_in_bytes(n->in(1)) > 8));
50145020
match(Set dst (AddVD src (LoadVector mem)));
50155021
format %{ "vaddpd $dst,$src,$mem\t! add packedD" %}
50165022
ins_encode %{
@@ -5045,7 +5051,8 @@ instruct vsubB_reg(vec dst, vec src1, vec src2) %{
50455051
%}
50465052

50475053
instruct vsubB_mem(vec dst, vec src, memory mem) %{
5048-
predicate(UseAVX > 0);
5054+
predicate((UseAVX > 0) &&
5055+
(vector_length_in_bytes(n->in(1)) > 8));
50495056
match(Set dst (SubVB src (LoadVector mem)));
50505057
format %{ "vpsubb $dst,$src,$mem\t! sub packedB" %}
50515058
ins_encode %{
@@ -5079,7 +5086,8 @@ instruct vsubS_reg(vec dst, vec src1, vec src2) %{
50795086
%}
50805087

50815088
instruct vsubS_mem(vec dst, vec src, memory mem) %{
5082-
predicate(UseAVX > 0);
5089+
predicate((UseAVX > 0) &&
5090+
(vector_length_in_bytes(n->in(1)) > 8));
50835091
match(Set dst (SubVS src (LoadVector mem)));
50845092
format %{ "vpsubw $dst,$src,$mem\t! sub packedS" %}
50855093
ins_encode %{
@@ -5112,7 +5120,8 @@ instruct vsubI_reg(vec dst, vec src1, vec src2) %{
51125120
%}
51135121

51145122
instruct vsubI_mem(vec dst, vec src, memory mem) %{
5115-
predicate(UseAVX > 0);
5123+
predicate((UseAVX > 0) &&
5124+
(vector_length_in_bytes(n->in(1)) > 8));
51165125
match(Set dst (SubVI src (LoadVector mem)));
51175126
format %{ "vpsubd $dst,$src,$mem\t! sub packedI" %}
51185127
ins_encode %{
@@ -5146,7 +5155,8 @@ instruct vsubL_reg(vec dst, vec src1, vec src2) %{
51465155

51475156

51485157
instruct vsubL_mem(vec dst, vec src, memory mem) %{
5149-
predicate(UseAVX > 0);
5158+
predicate((UseAVX > 0) &&
5159+
(vector_length_in_bytes(n->in(1)) > 8));
51505160
match(Set dst (SubVL src (LoadVector mem)));
51515161
format %{ "vpsubq $dst,$src,$mem\t! sub packedL" %}
51525162
ins_encode %{
@@ -5179,7 +5189,8 @@ instruct vsubF_reg(vec dst, vec src1, vec src2) %{
51795189
%}
51805190

51815191
instruct vsubF_mem(vec dst, vec src, memory mem) %{
5182-
predicate(UseAVX > 0);
5192+
predicate((UseAVX > 0) &&
5193+
(vector_length_in_bytes(n->in(1)) > 8));
51835194
match(Set dst (SubVF src (LoadVector mem)));
51845195
format %{ "vsubps $dst,$src,$mem\t! sub packedF" %}
51855196
ins_encode %{
@@ -5212,7 +5223,8 @@ instruct vsubD_reg(vec dst, vec src1, vec src2) %{
52125223
%}
52135224

52145225
instruct vsubD_mem(vec dst, vec src, memory mem) %{
5215-
predicate(UseAVX > 0);
5226+
predicate((UseAVX > 0) &&
5227+
(vector_length_in_bytes(n->in(1)) > 8));
52165228
match(Set dst (SubVD src (LoadVector mem)));
52175229
format %{ "vsubpd $dst,$src,$mem\t! sub packedD" %}
52185230
ins_encode %{
@@ -5360,7 +5372,8 @@ instruct vmulS_reg(vec dst, vec src1, vec src2) %{
53605372
%}
53615373

53625374
instruct vmulS_mem(vec dst, vec src, memory mem) %{
5363-
predicate(UseAVX > 0);
5375+
predicate((UseAVX > 0) &&
5376+
(vector_length_in_bytes(n->in(1)) > 8));
53645377
match(Set dst (MulVS src (LoadVector mem)));
53655378
format %{ "vpmullw $dst,$src,$mem\t! mul packedS" %}
53665379
ins_encode %{
@@ -5394,7 +5407,8 @@ instruct vmulI_reg(vec dst, vec src1, vec src2) %{
53945407
%}
53955408

53965409
instruct vmulI_mem(vec dst, vec src, memory mem) %{
5397-
predicate(UseAVX > 0);
5410+
predicate((UseAVX > 0) &&
5411+
(vector_length_in_bytes(n->in(1)) > 8));
53985412
match(Set dst (MulVI src (LoadVector mem)));
53995413
format %{ "vpmulld $dst,$src,$mem\t! mul packedI" %}
54005414
ins_encode %{
@@ -5418,7 +5432,8 @@ instruct vmulL_reg(vec dst, vec src1, vec src2) %{
54185432
%}
54195433

54205434
instruct vmulL_mem(vec dst, vec src, memory mem) %{
5421-
predicate(VM_Version::supports_avx512dq());
5435+
predicate(VM_Version::supports_avx512dq() &&
5436+
(vector_length_in_bytes(n->in(1)) > 8));
54225437
match(Set dst (MulVL src (LoadVector mem)));
54235438
format %{ "vpmullq $dst,$src,$mem\t! mul packedL" %}
54245439
ins_encode %{
@@ -5503,7 +5518,8 @@ instruct vmulF_reg(vec dst, vec src1, vec src2) %{
55035518
%}
55045519

55055520
instruct vmulF_mem(vec dst, vec src, memory mem) %{
5506-
predicate(UseAVX > 0);
5521+
predicate((UseAVX > 0) &&
5522+
(vector_length_in_bytes(n->in(1)) > 8));
55075523
match(Set dst (MulVF src (LoadVector mem)));
55085524
format %{ "vmulps $dst,$src,$mem\t! mul packedF" %}
55095525
ins_encode %{
@@ -5536,7 +5552,8 @@ instruct vmulD_reg(vec dst, vec src1, vec src2) %{
55365552
%}
55375553

55385554
instruct vmulD_mem(vec dst, vec src, memory mem) %{
5539-
predicate(UseAVX > 0);
5555+
predicate((UseAVX > 0) &&
5556+
(vector_length_in_bytes(n->in(1)) > 8));
55405557
match(Set dst (MulVD src (LoadVector mem)));
55415558
format %{ "vmulpd $dst,$src,$mem\t! mul packedD" %}
55425559
ins_encode %{
@@ -5607,7 +5624,8 @@ instruct vdivF_reg(vec dst, vec src1, vec src2) %{
56075624
%}
56085625

56095626
instruct vdivF_mem(vec dst, vec src, memory mem) %{
5610-
predicate(UseAVX > 0);
5627+
predicate((UseAVX > 0) &&
5628+
(vector_length_in_bytes(n->in(1)) > 8));
56115629
match(Set dst (DivVF src (LoadVector mem)));
56125630
format %{ "vdivps $dst,$src,$mem\t! div packedF" %}
56135631
ins_encode %{
@@ -5640,7 +5658,8 @@ instruct vdivD_reg(vec dst, vec src1, vec src2) %{
56405658
%}
56415659

56425660
instruct vdivD_mem(vec dst, vec src, memory mem) %{
5643-
predicate(UseAVX > 0);
5661+
predicate((UseAVX > 0) &&
5662+
(vector_length_in_bytes(n->in(1)) > 8));
56445663
match(Set dst (DivVD src (LoadVector mem)));
56455664
format %{ "vdivpd $dst,$src,$mem\t! div packedD" %}
56465665
ins_encode %{
@@ -5824,6 +5843,7 @@ instruct vsqrtF_reg(vec dst, vec src) %{
58245843
%}
58255844

58265845
instruct vsqrtF_mem(vec dst, memory mem) %{
5846+
predicate(vector_length_in_bytes(n->in(1)) > 8);
58275847
match(Set dst (SqrtVF (LoadVector mem)));
58285848
format %{ "vsqrtps $dst,$mem\t! sqrt packedF" %}
58295849
ins_encode %{
@@ -5847,6 +5867,7 @@ instruct vsqrtD_reg(vec dst, vec src) %{
58475867
%}
58485868

58495869
instruct vsqrtD_mem(vec dst, memory mem) %{
5870+
predicate(vector_length_in_bytes(n->in(1)) > 8);
58505871
match(Set dst (SqrtVD (LoadVector mem)));
58515872
format %{ "vsqrtpd $dst,$mem\t! sqrt packedD" %}
58525873
ins_encode %{
@@ -6459,7 +6480,8 @@ instruct vand_reg(vec dst, vec src1, vec src2) %{
64596480
%}
64606481

64616482
instruct vand_mem(vec dst, vec src, memory mem) %{
6462-
predicate(UseAVX > 0);
6483+
predicate((UseAVX > 0) &&
6484+
(vector_length_in_bytes(n->in(1)) > 8));
64636485
match(Set dst (AndV src (LoadVector mem)));
64646486
format %{ "vpand $dst,$src,$mem\t! and vectors" %}
64656487
ins_encode %{
@@ -6493,7 +6515,8 @@ instruct vor_reg(vec dst, vec src1, vec src2) %{
64936515
%}
64946516

64956517
instruct vor_mem(vec dst, vec src, memory mem) %{
6496-
predicate(UseAVX > 0);
6518+
predicate((UseAVX > 0) &&
6519+
(vector_length_in_bytes(n->in(1)) > 8));
64976520
match(Set dst (OrV src (LoadVector mem)));
64986521
format %{ "vpor $dst,$src,$mem\t! or vectors" %}
64996522
ins_encode %{
@@ -6527,7 +6550,8 @@ instruct vxor_reg(vec dst, vec src1, vec src2) %{
65276550
%}
65286551

65296552
instruct vxor_mem(vec dst, vec src, memory mem) %{
6530-
predicate(UseAVX > 0);
6553+
predicate((UseAVX > 0) &&
6554+
(vector_length_in_bytes(n->in(1)) > 8));
65316555
match(Set dst (XorV src (LoadVector mem)));
65326556
format %{ "vpxor $dst,$src,$mem\t! xor vectors" %}
65336557
ins_encode %{
@@ -7947,6 +7971,7 @@ instruct vfmaF_reg(vec a, vec b, vec c) %{
79477971
%}
79487972

79497973
instruct vfmaF_mem(vec a, memory b, vec c) %{
7974+
predicate(vector_length_in_bytes(n->in(1)) > 8);
79507975
match(Set c (FmaVF c (Binary a (LoadVector b))));
79517976
format %{ "fmaps $a,$b,$c\t# $c = $a * $b + $c fma packedF" %}
79527977
ins_cost(150);
@@ -7971,6 +7996,7 @@ instruct vfmaD_reg(vec a, vec b, vec c) %{
79717996
%}
79727997

79737998
instruct vfmaD_mem(vec a, memory b, vec c) %{
7999+
predicate(vector_length_in_bytes(n->in(1)) > 8);
79748000
match(Set c (FmaVD c (Binary a (LoadVector b))));
79758001
format %{ "fmapd $a,$b,$c\t# $c = $a * $b + $c fma packedD" %}
79768002
ins_cost(150);
@@ -8048,6 +8074,7 @@ instruct vpternlog(vec dst, vec src2, vec src3, immU8 func) %{
80488074
%}
80498075

80508076
instruct vpternlog_mem(vec dst, vec src2, memory src3, immU8 func) %{
8077+
predicate(vector_length_in_bytes(n->in(1)) > 8);
80518078
match(Set dst (MacroLogicV (Binary dst src2) (Binary (LoadVector src3) func)));
80528079
effect(TEMP dst);
80538080
format %{ "vpternlogd $dst,$src2,$src3,$func\t! vector ternary logic" %}

0 commit comments

Comments
 (0)