changeset 9124:39b41ab3366c

8236179: C1 register allocation error with T_ADDRESS Reviewed-by: rkennke, vlivanov, roland, mdoerr Contributed-by: Aditya Mandaleeka <adityam@microsoft.com>
author mdoerr
date Fri, 20 Dec 2019 19:51:00 +0100
parents bb1da64b0492
children fe4d09b50902
files src/cpu/sparc/vm/c1_FrameMap_sparc.cpp src/cpu/x86/vm/c1_FrameMap_x86.cpp src/cpu/x86/vm/c1_LIRAssembler_x86.cpp src/share/vm/c1/c1_FrameMap.hpp
diffstat 4 files changed, 10 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/cpu/sparc/vm/c1_FrameMap_sparc.cpp	Fri Aug 16 16:50:17 2019 +0200
+++ b/src/cpu/sparc/vm/c1_FrameMap_sparc.cpp	Fri Dec 20 19:51:00 2019 +0100
@@ -55,6 +55,8 @@
       opr = as_oop_opr(reg);
     } else if (type == T_METADATA) {
       opr = as_metadata_opr(reg);
+    } else if (type == T_ADDRESS) {
+      opr = as_address_opr(reg);
     } else {
       opr = as_opr(reg);
     }
--- a/src/cpu/x86/vm/c1_FrameMap_x86.cpp	Fri Aug 16 16:50:17 2019 +0200
+++ b/src/cpu/x86/vm/c1_FrameMap_x86.cpp	Fri Dec 20 19:51:00 2019 +0100
@@ -54,6 +54,8 @@
       opr = as_oop_opr(reg);
     } else if (type == T_METADATA) {
       opr = as_metadata_opr(reg);
+    } else if (type == T_ADDRESS) {
+      opr = as_address_opr(reg);
     } else {
       opr = as_opr(reg);
     }
--- a/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp	Fri Aug 16 16:50:17 2019 +0200
+++ b/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp	Fri Dec 20 19:51:00 2019 +0100
@@ -964,7 +964,7 @@
     if (type == T_OBJECT || type == T_ARRAY) {
       __ verify_oop(src->as_register());
       __ movptr (dst, src->as_register());
-    } else if (type == T_METADATA) {
+    } else if (type == T_METADATA || type == T_ADDRESS) {
       __ movptr (dst, src->as_register());
     } else {
       __ movl (dst, src->as_register());
@@ -1145,7 +1145,7 @@
     if (type == T_ARRAY || type == T_OBJECT) {
       __ movptr(dest->as_register(), frame_map()->address_for_slot(src->single_stack_ix()));
       __ verify_oop(dest->as_register());
-    } else if (type == T_METADATA) {
+    } else if (type == T_METADATA || type == T_ADDRESS) {
       __ movptr(dest->as_register(), frame_map()->address_for_slot(src->single_stack_ix()));
     } else {
       __ movl(dest->as_register(), frame_map()->address_for_slot(src->single_stack_ix()));
--- a/src/share/vm/c1/c1_FrameMap.hpp	Fri Aug 16 16:50:17 2019 +0200
+++ b/src/share/vm/c1/c1_FrameMap.hpp	Fri Dec 20 19:51:00 2019 +0100
@@ -198,6 +198,10 @@
     return LIR_OprFact::single_cpu_metadata(cpu_reg2rnr(r));
   }
 
+  static LIR_Opr as_address_opr(Register r) {
+    return LIR_OprFact::single_cpu_address(cpu_reg2rnr(r));
+  }
+
   FrameMap(ciMethod* method, int monitors, int reserved_argument_area_size);
   bool finalize_frame(int nof_slots);