RFR: Handle CMove{N,P} in get_load_addr

Aleksey Shipilev shade at redhat.com
Mon Jul 15 11:22:40 UTC 2019


CTW tests fail in sh/jdk with CMoveP node unhandled in get_load_addr.

Fix:

diff -r cac71967fe41 src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp
--- a/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp  Mon Jul 15 12:06:21 2019 +0200
+++ b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp  Mon Jul 15 12:32:47 2019 +0200
@@ -1780,10 +1780,21 @@
     case Op_ShenandoahCompareAndExchangeP:
     case Op_ShenandoahCompareAndExchangeN:
       // Those instructions would just have stored a different
       // value into the field. No use to attempt to fix it at this point.
       return phase->igvn().zerocon(T_OBJECT);
+    case Op_CMoveP:
+    case Op_CMoveN: {
+      Node* t = get_load_addr(phase, visited, in->in(CMoveNode::IfTrue));
+      Node* f = get_load_addr(phase, visited, in->in(CMoveNode::IfFalse));
+      // Handle unambigous cases: single address reported on both branches.
+      if (t != NULL && f == NULL) return t;
+      if (t == NULL && f != NULL) return f;
+      if (t != NULL && t == f)    return t;
+      // Ambiguity.
+      return phase->igvn().zerocon(T_OBJECT);
+    }
     case Op_Phi: {
       Node* addr = NULL;
       for (uint i = 1; i < in->req(); i++) {
         Node* addr1 = get_load_addr(phase, visited, in->in(i));
         if (addr == NULL) {
@@ -1806,12 +1817,11 @@
     case Op_ConP:
     case Op_Parm:
       return phase->igvn().zerocon(T_OBJECT);
     default:
 #ifdef ASSERT
-      in->dump();
-      ShouldNotReachHere();
+      fatal("Unknown node in get_load_addr: %s", NodeClassNames[in->Opcode()]);
 #endif
       return phase->igvn().zerocon(T_OBJECT);


Testing: CTW tests, hotspot_gc_shenandoah

-- 
Thanks,
-Aleksey



More information about the shenandoah-dev mailing list