code optimized away before a deopt
Deneau, Tom
tom.deneau at amd.com
Wed May 28 20:47:52 UTC 2014
Dredging up this issue again, I still get burned by it occasionally in our snippets.
The only workaround I have is to insert some test before the actual deopt
and the test has to be something that the compiler can't optimize away.
If I forget such a test, (or if the compiler optimizes it away), the fact
that the side-effecting got discarded can cause situations that are difficult
to debug.
Just wondering if anything has happened since Novemeber to make this less error-prone.
I agree with Doug a warning should be the minimum feedback.
Or could we have some annotation or something that says in this snippet do not
do the ConvertDeoptimizeToGuardPhase?
-- Tom
>> -----Original Message-----
>> From: Doug Simon [mailto:doug.simon at oracle.com]
>> Sent: Saturday, November 23, 2013 10:24 AM
>> To: Lukas Stadler
>> Cc: Deneau, Tom; graal-dev at openjdk.java.net
>> Subject: Re: code optimized away before a deopt
>>
>>
>> On Nov 23, 2013, at 5:18 PM, Lukas Stadler <lukas.stadler at jku.at> wrote:
>>
>>> But it _is_ ok to remove side effecting nodes, because we know they
>> will be reelected.
>>
>> Yes, normally, but when you write this pattern in a snippet, then
>> this won't be true right, since we don't resume execution in the
>> bytecode of the snippet (yet!). That why I was thinking at least a
>> warning would be a good idea.
>>
>> -Doug
>>
>>> Maybe the cleanup operations could be part of a special purpose
>>> deopt
>> node?
>>>
>>> - Lukas
>>>
>>> Von meinem iPhone gesendet
>>>
>>>> Am 23.11.2013 um 16:39 schrieb Doug Simon <doug.simon at oracle.com>:
>>>>
>>>> This is done by the ConvertDeoptimizeToGuardPhase which replaces
>> conditionals where one branch ends in a deopt with a GuardNode. This
>> does indeed have the side effect of (silently) deleting all other
>> nodes on that deopt-terminated branch. We should add some code to
>> either make the deletion not silent or better, throw an error if
>> these are any side- effecting nodes that will be deleted.
>>>>
>>>> -Doug
>>>>
>>>>> On Nov 23, 2013, at 1:58 AM, Deneau, Tom <tom.deneau at amd.com> wrote:
>>>>>
>>>>> I've noticed that if I have a snippet that does a test and if the
>> test fails, branches to a block that does some cleanup operations and
>> then calls DeoptimizeNode.deopt(xxx, yyy), the cleanup code gets
>> "optimized away". I guess this is related to what Gilles was talking
>> about, maybe the cleanup operations were considered not state changing?
>>>>>
>>>>> In our current state of HSAIL backend, a deopt just returns early
>> from the kernel. Is there something I can do to make the cleanup code
>> get emitted before the deopt?
>>>>>
>>>>> -- Tom
>>>>
>>
>
>
More information about the graal-dev
mailing list