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