changeset 57461:2877992dadf9

8236364: TEMP vector registers could be incorrectly assigned upper bank xmm registers after Generic Operands (JDK-8234391) Reviewed-by: kvn, vlivanov
author sviswanathan
date Tue, 24 Dec 2019 16:49:37 +0300
parents cf32454b65f0
children d54ce919da90
files src/hotspot/cpu/aarch64/aarch64.ad src/hotspot/cpu/arm/arm.ad src/hotspot/cpu/ppc/ppc.ad src/hotspot/cpu/s390/s390.ad src/hotspot/cpu/sparc/sparc.ad src/hotspot/cpu/x86/x86.ad src/hotspot/share/opto/matcher.cpp src/hotspot/share/opto/matcher.hpp
diffstat 8 files changed, 14 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/hotspot/cpu/aarch64/aarch64.ad	Tue Dec 24 04:47:44 2019 -0500
+++ b/src/hotspot/cpu/aarch64/aarch64.ad	Tue Dec 24 16:49:37 2019 +0300
@@ -2297,7 +2297,7 @@
 // No support for generic vector operands.
 const bool Matcher::supports_generic_vector_operands  = false;
 
-MachOper* Matcher::specialize_generic_vector_operand(MachOper* original_opnd, uint ideal_reg) {
+MachOper* Matcher::specialize_generic_vector_operand(MachOper* original_opnd, uint ideal_reg, bool is_temp) {
   ShouldNotReachHere(); // generic vector operands not supported
   return NULL;
 }
--- a/src/hotspot/cpu/arm/arm.ad	Tue Dec 24 04:47:44 2019 -0500
+++ b/src/hotspot/cpu/arm/arm.ad	Tue Dec 24 16:49:37 2019 +0300
@@ -1080,7 +1080,7 @@
 // No support for generic vector operands.
 const bool Matcher::supports_generic_vector_operands  = false;
 
-MachOper* Matcher::specialize_generic_vector_operand(MachOper* original_opnd, uint ideal_reg) {
+MachOper* Matcher::specialize_generic_vector_operand(MachOper* original_opnd, uint ideal_reg, bool is_temp) {
   ShouldNotReachHere(); // generic vector operands not supported
   return NULL;
 }
--- a/src/hotspot/cpu/ppc/ppc.ad	Tue Dec 24 04:47:44 2019 -0500
+++ b/src/hotspot/cpu/ppc/ppc.ad	Tue Dec 24 16:49:37 2019 +0300
@@ -2429,7 +2429,7 @@
 // No support for generic vector operands.
 const bool Matcher::supports_generic_vector_operands  = false;
 
-MachOper* Matcher::specialize_generic_vector_operand(MachOper* original_opnd, uint ideal_reg) {
+MachOper* Matcher::specialize_generic_vector_operand(MachOper* original_opnd, uint ideal_reg, bool is_temp) {
   ShouldNotReachHere(); // generic vector operands not supported
   return NULL;
 }
--- a/src/hotspot/cpu/s390/s390.ad	Tue Dec 24 04:47:44 2019 -0500
+++ b/src/hotspot/cpu/s390/s390.ad	Tue Dec 24 16:49:37 2019 +0300
@@ -1661,7 +1661,7 @@
 // No support for generic vector operands.
 const bool Matcher::supports_generic_vector_operands  = false;
 
-MachOper* Matcher::specialize_generic_vector_operand(MachOper* original_opnd, uint ideal_reg) {
+MachOper* Matcher::specialize_generic_vector_operand(MachOper* original_opnd, uint ideal_reg, bool is_temp) {
   ShouldNotReachHere(); // generic vector operands not supported
   return NULL;
 }
--- a/src/hotspot/cpu/sparc/sparc.ad	Tue Dec 24 04:47:44 2019 -0500
+++ b/src/hotspot/cpu/sparc/sparc.ad	Tue Dec 24 16:49:37 2019 +0300
@@ -1818,7 +1818,7 @@
 // No support for generic vector operands.
 const bool Matcher::supports_generic_vector_operands  = false;
 
-MachOper* Matcher::specialize_generic_vector_operand(MachOper* original_opnd, uint ideal_reg) {
+MachOper* Matcher::specialize_generic_vector_operand(MachOper* original_opnd, uint ideal_reg, bool is_temp) {
   ShouldNotReachHere(); // generic vector operands not supported
   return NULL;
 }
--- a/src/hotspot/cpu/x86/x86.ad	Tue Dec 24 04:47:44 2019 -0500
+++ b/src/hotspot/cpu/x86/x86.ad	Tue Dec 24 16:49:37 2019 +0300
@@ -1438,9 +1438,14 @@
 // x86 supports generic vector operands: vec and legVec.
 const bool Matcher::supports_generic_vector_operands = true;
 
-MachOper* Matcher::specialize_generic_vector_operand(MachOper* generic_opnd, uint ideal_reg) {
+MachOper* Matcher::specialize_generic_vector_operand(MachOper* generic_opnd, uint ideal_reg, bool is_temp) {
   assert(Matcher::is_generic_vector(generic_opnd), "not generic");
   bool legacy = (generic_opnd->opcode() == LEGVEC);
+  if (!VM_Version::supports_avx512vlbwdq() && // KNL
+      is_temp && !legacy && (ideal_reg == Op_VecZ)) {
+    // Conservatively specialize 512bit vec TEMP operands to legVecZ (zmm0-15) on KNL.
+    return new legVecZOper();
+  }
   if (legacy) {
     switch (ideal_reg) {
       case Op_VecS: return new legVecSOper();
--- a/src/hotspot/share/opto/matcher.cpp	Tue Dec 24 04:47:44 2019 -0500
+++ b/src/hotspot/share/opto/matcher.cpp	Tue Dec 24 16:49:37 2019 +0300
@@ -2539,7 +2539,7 @@
     int size_in_bytes = 4 * type2size[t->basic_type()];
     ideal_reg = Matcher::vector_ideal_reg(size_in_bytes);
   }
-  return Matcher::specialize_generic_vector_operand(original_opnd, ideal_reg);
+  return Matcher::specialize_generic_vector_operand(original_opnd, ideal_reg, false);
 }
 
 // Compute concrete vector operand for a generic TEMP vector mach node based on its user info.
@@ -2551,7 +2551,7 @@
     tmp->_opnds[0] = use->_opnds[0]->clone();
   } else {
     uint ideal_vreg = vector_ideal_reg(C->max_vector_size());
-    tmp->_opnds[0] = specialize_generic_vector_operand(tmp->_opnds[0], ideal_vreg);
+    tmp->_opnds[0] = specialize_generic_vector_operand(tmp->_opnds[0], ideal_vreg, true);
   }
 }
 
--- a/src/hotspot/share/opto/matcher.hpp	Tue Dec 24 04:47:44 2019 -0500
+++ b/src/hotspot/share/opto/matcher.hpp	Tue Dec 24 16:49:37 2019 +0300
@@ -519,7 +519,7 @@
   MachOper* specialize_vector_operand(MachNode* m, uint idx);
   MachOper* specialize_vector_operand_helper(MachNode* m, MachOper* generic_opnd);
 
-  static MachOper* specialize_generic_vector_operand(MachOper* generic_opnd, uint ideal_reg);
+  static MachOper* specialize_generic_vector_operand(MachOper* generic_opnd, uint ideal_reg, bool is_temp);
 
   static bool is_generic_reg2reg_move(MachNode* m);
   static bool is_generic_vector(MachOper* opnd);