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