src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ProxyNode.java
changeset 58877 aec7bf35d6f5
parent 57537 ecc6e394475f
equal deleted inserted replaced
58876:1a8d65e71a66 58877:aec7bf35d6f5
     1 /*
     1 /*
     2  * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
    27 import static org.graalvm.compiler.nodeinfo.InputType.Association;
    27 import static org.graalvm.compiler.nodeinfo.InputType.Association;
    28 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_0;
    28 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_0;
    29 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_0;
    29 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_0;
    30 
    30 
    31 import org.graalvm.compiler.core.common.type.Stamp;
    31 import org.graalvm.compiler.core.common.type.Stamp;
       
    32 import org.graalvm.compiler.graph.Node;
    32 import org.graalvm.compiler.graph.Node.ValueNumberable;
    33 import org.graalvm.compiler.graph.Node.ValueNumberable;
       
    34 import org.graalvm.compiler.graph.spi.Canonicalizable;
       
    35 import org.graalvm.compiler.graph.spi.CanonicalizerTool;
    33 import org.graalvm.compiler.graph.NodeClass;
    36 import org.graalvm.compiler.graph.NodeClass;
    34 import org.graalvm.compiler.nodeinfo.NodeInfo;
    37 import org.graalvm.compiler.nodeinfo.NodeInfo;
    35 import org.graalvm.compiler.nodes.calc.FloatingNode;
    38 import org.graalvm.compiler.nodes.calc.FloatingNode;
    36 import org.graalvm.compiler.nodes.extended.GuardingNode;
    39 import org.graalvm.compiler.nodes.extended.GuardingNode;
       
    40 import org.graalvm.compiler.nodes.memory.MemoryNode;
       
    41 import org.graalvm.compiler.nodes.spi.Proxy;
       
    42 import jdk.internal.vm.compiler.word.LocationIdentity;
    37 
    43 
    38 /**
    44 /**
    39  * A proxy is inserted at loop exits for any value that is created inside the loop (i.e. was not
    45  * A proxy is inserted at loop exits for any value that is created inside the loop (i.e. was not
    40  * live on entry to the loop) and is (potentially) used after the loop.
    46  * live on entry to the loop) and is (potentially) used after the loop.
    41  */
    47  */
    42 @NodeInfo(cycles = CYCLES_0, size = SIZE_0)
    48 @NodeInfo(cycles = CYCLES_0, size = SIZE_0)
    43 public abstract class ProxyNode extends FloatingNode implements ValueNumberable {
    49 public abstract class ProxyNode extends FloatingNode implements Proxy, ValueNumberable, Canonicalizable {
    44 
    50 
    45     public static final NodeClass<ProxyNode> TYPE = NodeClass.create(ProxyNode.class);
    51     public static final NodeClass<ProxyNode> TYPE = NodeClass.create(ProxyNode.class);
    46     @Input(Association) LoopExitNode loopExit;
    52     @Input(Association) LoopExitNode loopExit;
    47 
    53 
    48     protected ProxyNode(NodeClass<? extends ProxyNode> c, Stamp stamp, LoopExitNode proxyPoint) {
    54     protected ProxyNode(NodeClass<? extends ProxyNode> c, Stamp stamp, LoopExitNode proxyPoint) {
    61     public LoopExitNode proxyPoint() {
    67     public LoopExitNode proxyPoint() {
    62         return loopExit;
    68         return loopExit;
    63     }
    69     }
    64 
    70 
    65     @Override
    71     @Override
       
    72     public ValueNode getOriginalNode() {
       
    73         return value();
       
    74     }
       
    75 
       
    76     @Override
    66     public boolean verify() {
    77     public boolean verify() {
    67         assert !(value() instanceof ProxyNode) || ((ProxyNode) value()).loopExit != loopExit;
    78         assert !(value() instanceof ProxyNode) || ((ProxyNode) value()).loopExit != loopExit;
    68         return super.verify();
    79         return super.verify();
    69     }
    80     }
    70 
    81 
    71     public static ValueProxyNode forValue(ValueNode value, LoopExitNode exit, StructuredGraph graph) {
    82     public static ValueProxyNode forValue(ValueNode value, LoopExitNode exit) {
    72         return graph.unique(new ValueProxyNode(value, exit));
    83         return exit.graph().unique(new ValueProxyNode(value, exit));
    73     }
    84     }
    74 
    85 
    75     public static GuardProxyNode forGuard(GuardingNode value, LoopExitNode exit, StructuredGraph graph) {
    86     public static GuardProxyNode forGuard(GuardingNode value, LoopExitNode exit) {
    76         return graph.unique(new GuardProxyNode(value, exit));
    87         return exit.graph().unique(new GuardProxyNode(value, exit));
       
    88     }
       
    89 
       
    90     public static MemoryProxyNode forMemory(MemoryNode value, LoopExitNode exit, LocationIdentity locationIdentity) {
       
    91         return exit.graph().unique(new MemoryProxyNode(value, exit, locationIdentity));
       
    92     }
       
    93 
       
    94     @Override
       
    95     public Node canonical(CanonicalizerTool tool) {
       
    96         if (value() == null) {
       
    97             return null;
       
    98         }
       
    99         return this;
    77     }
   100     }
    78 
   101 
    79     public abstract PhiNode createPhi(AbstractMergeNode merge);
   102     public abstract PhiNode createPhi(AbstractMergeNode merge);
    80 }
   103 }