RFR: JDK-8215196: [Graal] vmTestbase/nsk/jvmti/PopFrame/popframe003/TestDescription.java fails with "changes for the arguments of the popped frame's method, did not remain current argument values"

Chris Plummer chris.plummer at oracle.com
Sat Dec 7 05:31:57 UTC 2019


On 12/6/19 6:12 PM, serguei.spitsyn at oracle.com wrote:
> On 12/6/19 17:24, Daniel D. Daugherty wrote:
>> On 12/6/19 6:26 PM, serguei.spitsyn at oracle.com wrote:
>>> On 12/6/19 13:52, Chris Plummer wrote:
>>>> On 12/6/19 1:18 PM, serguei.spitsyn at oracle.com wrote:
>>>>> On 12/6/19 11:07, Chris Plummer wrote:
>>>>>> On 12/5/19 6:45 PM, David Holmes wrote:
>>>>>>> Hi Serguei,
>>>>>>>
>>>>>>> On 6/12/2019 11:31 am, serguei.spitsyn at oracle.com wrote:
>>>>>>>> Hi Chris and Alex,
>>>>>>>>
>>>>>>>> (I've also included Dan, David and Dean to the mailing list)
>>>>>>>>
>>>>>>>> We have to reach a consensus about this.
>>>>>>>
>>>>>>> This is just part of a much broader issue with JVM TI that I 
>>>>>>> tried to have a discussion started based on Richard Reingruber's 
>>>>>>> proposals around Escape Analysis:
>>>>>>>
>>>>>>> http://mail.openjdk.java.net/pipermail/serviceability-dev/2019-September/029285.html 
>>>>>>>
>>>>>>>
>>>>>>> Unfortunately that discussion did not get much traction.
>>>>>> Hmm. I have the emails that precede yours above, but not that 
>>>>>> one. Not sure how what happened. Just read through it and it did 
>>>>>> give me one thought.
>>>>>
>>>>>> Consider a model where the program is designed drive behavior of 
>>>>>> the agent, triggering the agent to do certain things by having 
>>>>>> the program do certain things. Normally an agent monitors the 
>>>>>> application, but in this case the application is purposefully 
>>>>>> controlling actions performed by the agent. If code is elided 
>>>>>> from the program, then the agent no longer performs as expected. 
>>>>>> It's a kind of backwards jvmti programming model, and you may ask 
>>>>>> why would anyone do this. I'm not sure if there's a good reason 
>>>>>> for it, but should it be expected to work given how the spec is 
>>>>>> written?
>>>>>
>>>>> My interpretation is that the current JVM TI PopFrame behavior 
>>>>> does not break this model.
>>>>> The spec says: "any changes to the arguments, which occurred in 
>>>>> the called method, remain;"
>>>>> As the code was eliminated by the compiler then no changes to this 
>>>>> argument occurred.
>>>>> So, the PopFrame behavior follows the spec. So, I think, the 
>>>>> option #2 is not right. But it depends on our basic philosophy.
>>>>> If the developer wants to control the agent then the program has 
>>>>> to be designed to do something meaningful that is not going to be 
>>>>> optimized out by the JIT compiler.
>>>> You misunderstood my point. What I'm saying is that someone might 
>>>> do something like assign to a local with the specific intent of 
>>>> having that trigger a jmvti event, with the specific intent of 
>>>> having the agent perform some expected action as a result. Think of 
>>>> it as being a trigger for the agent, not as the agent monitoring 
>>>> the app. For example, you could right a program + agent, and 
>>>> setting a specific local in the program triggers the agent to turn 
>>>> on a light, and setting some other local turns it off. Absurd, but 
>>>> possible, and maybe there are less absurd applications.
>>>
>>> I think, I understood your point correctly.
>>> Your point is that the code that can be eliminated (e.g. local++) is 
>>> not that meaningless as it seems to be.
>>> My point is that there are still other more reliable ways to trigger 
>>> the agent.
>>> So that relying on something that can be eliminated by JIT compilers 
>>> is not important to support.
>>
>> You are making the assumption that the agent author understands what
>> Java code/variables *might* be eliminated by the JIT compiler. I don't
>> think that's a good assumption. I might have code that does a really
>> complicated thing in a local variable that is only useful to the
>> agent itself. The JIT will see that the local variable cannot escape
>> the function and is not used outside the function (as far as it can
>> see) so it will elide the local variable and the code that was used
>> to generated the local result in the variable.
>>
>> If that local result happens to be some computation that the agent
>> needed to see to do its next operation...
>
> Thank you for sharing your point.
> I'm not insisting on my assumptions here, just not sure this is more 
> important than allowing optimizations.
> Do you actually think this use case needs to be supported?
>
> In general, to identify our philosophy about interaction between JIT 
> compiler
> code elimination and JVM TI we need to make some assumptions.
>
>
> Let's temporarily put JVM TI out of scope.
> Are there any assumptions when JIT compilers eliminate some code?
> Is it based on some vision what code is observable?
> If it was decided some code can be eliminated then is it JVM TI only 
> that breaks such assumptions about observability?
>
> If so, then such optimizations can be disabled at some level.
> Then we end up debugging/profiling/monitoring, and finally, observing 
> a slightly different application.
> Are we Okay with this? Do we need any compromises here?
> Maybe we need more flags to control the JIT compiler behavior.
>
Dan is restating the point I was making, but I also agree that unless 
someone can show us a useful application of that kind of use of jvmti 
events, I don't think we need to support it. We do need to clarify it in 
the spec however.

Chris
> Thanks,
> Serguei
>
>>
>> Dan
>>
>>
>>>
>>> Thanks,
>>> Serguei
>>>
>>>> Chris
>>>>>
>>>>>>>
>>>>>>>> We have 3 options:
>>>>>>>>
>>>>>>>> Option #1:
>>>>>>>>    The JIT optimization to delete a code which "looks useless"
>>>>>>>>    has to be disabled if can_pop_frame capability is enabled.
>>>>>>>>    Than this problem becomes a JIT compiler bug.
>>>>>>>>
>>>>>>>> Option #2:
>>>>>>>>    Consider to relax the JVMTI PopFrame spec by changing it to 
>>>>>>>> something like:
>>>>>>>>    "Note however, that the original argument values are not
>>>>>>>>     preserved and can be changed by the called method;"
>>>>>>>>    Than this problem becomes a JVM TI spec bug.
>>>>>>>>
>>>>>>>> Option #3:
>>>>>>>>    Consider it is Okay for compiler to eliminate useless code,
>>>>>>>>    so the argument values can be reinitialized by the PopFrame.
>>>>>>>>    Than this problem becomes just a test bug.
>>>>>>>>
>>>>>>>>
>>>>>>>> My preference is option #3.
>>>>>>>> The point is that if the arguments are not really used in
>>>>>>>> a method then restoring them to any values is a no-op.
>>>>>>>> It is really meaningless use case, so why should we care about it.
>>>>>> Is "restoring" the proper term here? I thought they were just 
>>>>>> left on the stack and reused on the subsequent invoke.
>>>>>
>>>>> Agreed. The term "restoring" is not accurate here.
>>>>>
>>>>>> In fact I figured the reason for the language in the spec in the 
>>>>>> first place is to alleviate JVMTI from having to restore them to 
>>>>>> their original values, which is probably not even possible.
>>>>>
>>>>> Right.
>>>>>
>>>>>>>
>>>>>>> Thanks for setting that out clearly.
>>>>>>>
>>>>>>> I'd like to agree this is particular case is a test bug. If we 
>>>>>>> have a method:
>>>>>>>
>>>>>>> int incr(int val) {
>>>>>>>   val++;
>>>>>>>   popFrameHere();
>>>>>>>   return val;
>>>>>>> }
>>>>>>>
>>>>>>> then the change to the argument is necessary and must be 
>>>>>>> preserved. In contrast:
>>>>>>>
>>>>>>> void incr(int val) {
>>>>>>>   val++;
>>>>>>>   popFrameHere();
>>>>>>> }
>>>>>>>
>>>>>>> the change to the argument is meaningless and I would hope any 
>>>>>>> decent JIT would simply elide it.
>>>>>> So, this goes back to my example above where the program is 
>>>>>> trying to elicit behavior from the agent. It's not meaningless in 
>>>>>> that case, but that doesn't mean I think we need to support it.
>>>>>
>>>>> Even with this model it is possible and better to do something 
>>>>> meaningful to control the agent.
>>>>> This model is very rare use case.
>>>>> It is hard to justify a need to support it. :)
>>>>>
>>>>>>>
>>>>>>> But we must have a consistent approach to such things. What 
>>>>>>> would happen if a breakpoint were to be placed on the 
>>>>>>> instruction that uselessly modified the argument - would we 
>>>>>>> still see the modification or would it be elided?
>>>>>> Breakpoints force interpreted mode for the method, although I 
>>>>>> suppose that's a hotspot implementation detail and not something 
>>>>>> a VM would be required to do. A VM that allows breakpoints in 
>>>>>> compiled methods has the potential to miss the breakpoint if code 
>>>>>> is elided.
>>>>>>
>>>>>> Also, what if you put a breakpoint in a method, the call to it is 
>>>>>> elided. You would never hit the breakpoint. That could cause some 
>>>>>> serious head scratching for a debugger user if they know the code 
>>>>>> doing the method call is "executed".
>>>>>
>>>>> If the method is not actually being called then missing 
>>>>> breakpoints there gives a clue what is going on.
>>>>> Otherwise, it will cause cause some serious head scratching for a 
>>>>> debugger user.
>>>>> In general, my preference would be to debug actual behavior.
>>>>> It is not good we have no support breakpoints in compiled methods.
>>>>>
>>>>>
>>>>>>>
>>>>>>> And how do C1 and C2 avoid this issue? Do they simply not 
>>>>>>> optimise away the useless assignment? Or do they actively 
>>>>>>> disable that optimization in this context?
>>>>>>>
>>>>>>> We need, IMO, to establish the basic philosophy of how to manage 
>>>>>>> JVM TI / JIT interactions, so we know what things must remain 
>>>>>>> visible and which can be optimised away.
>>>>>>>
>>>>>>> That said, changing the test allows us to defer having to reach 
>>>>>>> that consensus.
>>>>>> Agreed. I think it's ok to work around the test issue as long as 
>>>>>> we keep this overall issue on the radar. Do we have a bug field 
>>>>>> for that?
>>>>>
>>>>> I thought, it is a little bit early to file a bug for it.
>>>>> Also, probably, it can be an umbrella enhancement or task.
>>>>>
>>>>> Thanks,
>>>>> Serguei
>>>>>
>>>>>>
>>>>>> thanks,
>>>>>>
>>>>>> Chris
>>>>>>>
>>>>>>> David
>>>>>>> -----
>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Serguei
>>>>>>>>
>>>>>>>>
>>>>>>>> On 11/11/19 3:17 AM, serguei.spitsyn at oracle.com wrote:
>>>>>>>>> Hi Alex,
>>>>>>>>>
>>>>>>>>> The fix itself looks Okay.
>>>>>>>>> Minor: replace in the comment: "compiler don't drop" => 
>>>>>>>>> "compiler doesn't drop".
>>>>>>>>>
>>>>>>>>> However, we still have to reach a consensus on how we treat 
>>>>>>>>> this issue (as Chris already commented).
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> Serguei
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On 11/8/19 15:22, Alex Menkov wrote:
>>>>>>>>>> Hi all,
>>>>>>>>>>
>>>>>>>>>> Please review the fix for
>>>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8215196
>>>>>>>>>> webrev:
>>>>>>>>>> http://cr.openjdk.java.net/~amenkov/jdk14/popframe_args/webrev/
>>>>>>>>>>
>>>>>>>>>> Currently PopFrame is disabled with JVMCI by [1], so for 
>>>>>>>>>> testing I reverted [1] changes.
>>>>>>>>>>
>>>>>>>>>> [1] https://bugs.openjdk.java.net/browse/JDK-8218025
>>>>>>>>>>
>>>>>>>>>> --alex
>>>>>>>>>
>>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>>
>>>
>>
>




More information about the serviceability-dev mailing list