Nodes removal from the IR

Lukas Stadler lukas.stadler at oracle.com
Mon Aug 1 09:43:18 UTC 2016


It depends on what the semantics of your change should be - what does it mean that you remove the load? is it not necessary any more, because you already know the value?
If you remove a loadfield, and the loadfield has usages, then these usages (e.g., arithmetic operations) need some value to work with.

The FixedGuardNode is special, in that its usages are guard dependencies, and usually can work with a “null” input (i.e., no node connected, not a “null” constant).
FloatingGuardedNode, for example, uses an @OptionalInput, while the BinaryNodes use the non-optional @Input.

You can replaceAtUsages with any other node, fixed or floating, but its result needs to be available at the point of the loadfield.
You may get errors from the Scheduler if it isn’t.

- Lukas

> On 01 Aug 2016, at 11:28, Juan Fumero <juan.fumero at ed.ac.uk> wrote:
> 
> Hi Lukas, 
> 
>   I didn't actually replace LoadFieldNode.  I was thinking I could
> apply something similar to FixedGuard and replace it with null and then
> remove it. 
> 
> So for these kind of nodes I should replace them with another node?
> Could I replace it either with a FloatingNode or FixedNode?  
> 
> Thanks
> Juan
> 
> On Mon, 2016-08-01 at 10:49 +0200, Lukas Stadler wrote:
>> Hi Juan,
>> 
>> how do you remove the LoadFieldNode?
>> replaceAtUsages(null) is a problem in this case, because this node is
>> supposed to generate a value.
>> Do you replace it with a constant?
>> 
>> - Lukas
>> 
>>> 
>>> On 29 Jul 2016, at 12:00, Juan Fumero <juan.fumero at ed.ac.uk> wrote:
>>> 
>>> Hi all, 
>>>   I am trying to remove some nodes from the IR that I do not need
>>> for
>>> the GPU execution. 
>>> 
>>> For instance, to remove some of the FixedGuard I do the following:
>>> 
>>> <code>
>>> if (node instanceof FixedGuardNode) {
>>>    node.replaceAtUsages(null);
>>>    graph.removeFixed((FixedWithNextNode));
>>> }
>>>         
>>> new CanonicalizerPhase().apply(graph, new PhaseContext(providers));
>>> new DeadCodeEliminationPhase().apply(graph);
>>> </code>
>>> 
>>> This works fine. However, when I try to remove other kind of nodes,
>>> like UnsafeLoadNode, I get the following error:
>>> 
>>> [thread:1] scope: main
>>>   [thread:1] scope: main.CleanPhase
>>>     [thread:1] scope: main.CleanPhase.InterceptException
>>>     Exception occurred in scope: main.CleanPhase.InterceptException
>>>     Context obj com.oracle.graal.graph.VerificationError: cannot
>>> delete
>>> node 74|UnsafeLoad because of predecessor: 72|LoadField#locals
>>>     	at node: 74|UnsafeLoad
>>>     Context obj com.oracle.truffle.r.library.gpu.phases.CleanPhase@
>>> 32dd
>>> cca
>>> internal error: com.oracle.truffle.r.runtime.RInternalError:
>>> com.oracle.graal.graph.VerificationError: cannot delete node
>>> 74|UnsafeLoad because of predecessor: 72|LoadField#locals
>>> 	at node: 74|UnsafeLoad (see fastr_errors.log)
>>> 
>>> 
>>> Because there is a dependency with LoadFieldNode. My question is,
>>> how
>>> could I get rid of these kind of nodes? I am trying also to remove
>>> its
>>> dependencies but I get the same error. I also tried to removed with
>>> graph.removeFixed(node) but I get the error as well. 
>>> 
>>> 
>>> Many thanks
>>> Juan
>>> 
>>> 
> 
> -- 
> The University of Edinburgh is a charitable body, registered in
> Scotland, with registration number SC005336.
> 



More information about the graal-dev mailing list