RFR: Handle CMove{N,P} in get_load_addr
Roman Kennke
rkennke at redhat.com
Mon Jul 15 11:23:56 UTC 2019
Looks good, thank you!
Roman
> 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
>
More information about the shenandoah-dev
mailing list