RFR: 8266854: LibraryCallKit::inline_preconditions_checkIndex modifies control flow even if the intrinsic bailed out

Vladimir Kozlov kvn at openjdk.java.net
Mon May 10 23:59:25 UTC 2021


On Mon, 10 May 2021 23:09:33 GMT, Sandhya Viswanathan <sviswanathan at openjdk.org> wrote:

> LibraryCallKit::inline_preconditions_checkIndex can result in the following assert sometimes:
>    "# assert(ctrl == kit.control()) failed: Control flow was added although the intrinsic bailed out"
> 
> Consider the following code snippet:
>  ...
>  set_control(_gvn.transform(new IfTrueNode(rc)));
>  {
>    PreserveJVMState pjvms(this);
>    set_control(_gvn.transform(new IfFalseNode(rc)));
>    uncommon_trap(Deoptimization::Reason_range_check,
>                  Deoptimization::Action_make_not_entrant);
>  }
>  ..
>  Here the control is being modified by set_control even though a bailout is possible afterwards.
>  Moving the set_control later in the intrinsic fixes this.
> 
>  This is a small fix. Please review.
> 
> Best Regards,
> Sandhya

src/hotspot/share/opto/library_call.cpp line 1049:

> 1047:     record_for_igvn(rc);
> 1048:   }
> 1049:   set_control(_gvn.transform(new IfTrueNode(rc)));

Or you can move `stopped()` check here (after `set_control()`) and avoid generation of useless `false` path.

-------------

PR: https://git.openjdk.java.net/jdk/pull/3958


More information about the hotspot-compiler-dev mailing list