< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/InvokeNode.java

Print this page
rev 52509 : [mq]: graal


   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 
  25 package org.graalvm.compiler.nodes;
  26 
  27 import jdk.vm.ci.meta.JavaKind;












  28 
  29 import org.graalvm.compiler.core.common.type.Stamp;
  30 import org.graalvm.compiler.graph.Node;
  31 import org.graalvm.compiler.graph.NodeClass;
  32 import org.graalvm.compiler.nodeinfo.InputType;
  33 import org.graalvm.compiler.nodeinfo.NodeCycles;
  34 import org.graalvm.compiler.nodeinfo.NodeInfo;
  35 import org.graalvm.compiler.nodeinfo.NodeSize;
  36 import org.graalvm.compiler.nodeinfo.Verbosity;
  37 import org.graalvm.compiler.nodes.extended.ForeignCallNode;
  38 import org.graalvm.compiler.nodes.java.MethodCallTargetNode;
  39 import org.graalvm.compiler.nodes.memory.AbstractMemoryCheckpoint;
  40 import org.graalvm.compiler.nodes.memory.MemoryCheckpoint;
  41 import org.graalvm.compiler.nodes.spi.LIRLowerable;
  42 import org.graalvm.compiler.nodes.spi.LoweringTool;
  43 import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
  44 import org.graalvm.compiler.nodes.spi.UncheckedInterfaceProvider;
  45 import org.graalvm.compiler.nodes.util.GraphUtil;
  46 import jdk.internal.vm.compiler.word.LocationIdentity;
  47 
  48 import java.util.Map;
  49 
  50 import static org.graalvm.compiler.nodeinfo.InputType.Extension;
  51 import static org.graalvm.compiler.nodeinfo.InputType.Memory;
  52 import static org.graalvm.compiler.nodeinfo.InputType.State;
  53 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_2;
  54 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_64;
  55 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_8;
  56 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_UNKNOWN;
  57 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_2;
  58 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_64;
  59 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_8;
  60 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_UNKNOWN;
  61 
  62 /**
  63  * The {@code InvokeNode} represents all kinds of method calls.
  64  */
  65 // @formatter:off
  66 @NodeInfo(nameTemplate = "Invoke#{p#targetMethod/s}",
  67           allowedUsageTypes = {Memory},
  68           cycles = CYCLES_UNKNOWN,
  69           cyclesRationale = "We cannot estimate the runtime cost of a call, it is a blackhole." +
  70                             "However, we can estimate, dyanmically, the cost of the call operation itself based on the type of the call.",
  71           size = SIZE_UNKNOWN,
  72           sizeRationale = "We can only dyanmically, based on the type of the call (special, static, virtual, interface) decide" +
  73                           "how much code is generated for the call.")
  74 // @formatter:on
  75 public final class InvokeNode extends AbstractMemoryCheckpoint implements Invoke, LIRLowerable, MemoryCheckpoint.Single, UncheckedInterfaceProvider {
  76     public static final NodeClass<InvokeNode> TYPE = NodeClass.create(InvokeNode.class);
  77 
  78     @OptionalInput ValueNode classInit;
  79     @Input(Extension) CallTargetNode callTarget;
  80     @OptionalInput(State) FrameState stateDuring;


 233     }
 234 
 235     @Override
 236     public Stamp uncheckedStamp() {
 237         return this.callTarget.returnStamp().getUncheckedStamp();
 238     }
 239 
 240     @Override
 241     public void setClassInit(ValueNode classInit) {
 242         this.classInit = classInit;
 243         updateUsages(null, classInit);
 244     }
 245 
 246     @Override
 247     public ValueNode classInit() {
 248         return classInit;
 249     }
 250 
 251     @Override
 252     public NodeCycles estimatedNodeCycles() {
 253         switch (callTarget().invokeKind()) {



 254             case Interface:
 255                 return CYCLES_64;
 256             case Special:
 257             case Static:
 258                 return CYCLES_2;
 259             case Virtual:
 260                 return CYCLES_8;
 261             default:
 262                 return CYCLES_UNKNOWN;
 263         }
 264     }
 265 
 266     @Override
 267     public NodeSize estimatedNodeSize() {
 268         switch (callTarget().invokeKind()) {



 269             case Interface:
 270                 return SIZE_64;
 271             case Special:
 272             case Static:
 273                 return SIZE_2;
 274             case Virtual:
 275                 return SIZE_8;
 276             default:
 277                 return SIZE_UNKNOWN;
 278         }
 279     }
 280 }


   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 
  25 package org.graalvm.compiler.nodes;
  26 
  27 import static org.graalvm.compiler.nodeinfo.InputType.Extension;
  28 import static org.graalvm.compiler.nodeinfo.InputType.Memory;
  29 import static org.graalvm.compiler.nodeinfo.InputType.State;
  30 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_2;
  31 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_64;
  32 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_8;
  33 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_UNKNOWN;
  34 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_2;
  35 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_64;
  36 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_8;
  37 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_UNKNOWN;
  38 
  39 import java.util.Map;
  40 
  41 import org.graalvm.compiler.core.common.type.Stamp;
  42 import org.graalvm.compiler.graph.Node;
  43 import org.graalvm.compiler.graph.NodeClass;
  44 import org.graalvm.compiler.nodeinfo.InputType;
  45 import org.graalvm.compiler.nodeinfo.NodeCycles;
  46 import org.graalvm.compiler.nodeinfo.NodeInfo;
  47 import org.graalvm.compiler.nodeinfo.NodeSize;
  48 import org.graalvm.compiler.nodeinfo.Verbosity;
  49 import org.graalvm.compiler.nodes.extended.ForeignCallNode;
  50 import org.graalvm.compiler.nodes.java.MethodCallTargetNode;
  51 import org.graalvm.compiler.nodes.memory.AbstractMemoryCheckpoint;
  52 import org.graalvm.compiler.nodes.memory.MemoryCheckpoint;
  53 import org.graalvm.compiler.nodes.spi.LIRLowerable;
  54 import org.graalvm.compiler.nodes.spi.LoweringTool;
  55 import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
  56 import org.graalvm.compiler.nodes.spi.UncheckedInterfaceProvider;
  57 import org.graalvm.compiler.nodes.util.GraphUtil;
  58 import jdk.internal.vm.compiler.word.LocationIdentity;
  59 
  60 import jdk.vm.ci.meta.JavaKind;












  61 
  62 /**
  63  * The {@code InvokeNode} represents all kinds of method calls.
  64  */
  65 // @formatter:off
  66 @NodeInfo(nameTemplate = "Invoke#{p#targetMethod/s}",
  67           allowedUsageTypes = {Memory},
  68           cycles = CYCLES_UNKNOWN,
  69           cyclesRationale = "We cannot estimate the runtime cost of a call, it is a blackhole." +
  70                             "However, we can estimate, dyanmically, the cost of the call operation itself based on the type of the call.",
  71           size = SIZE_UNKNOWN,
  72           sizeRationale = "We can only dyanmically, based on the type of the call (special, static, virtual, interface) decide" +
  73                           "how much code is generated for the call.")
  74 // @formatter:on
  75 public final class InvokeNode extends AbstractMemoryCheckpoint implements Invoke, LIRLowerable, MemoryCheckpoint.Single, UncheckedInterfaceProvider {
  76     public static final NodeClass<InvokeNode> TYPE = NodeClass.create(InvokeNode.class);
  77 
  78     @OptionalInput ValueNode classInit;
  79     @Input(Extension) CallTargetNode callTarget;
  80     @OptionalInput(State) FrameState stateDuring;


 233     }
 234 
 235     @Override
 236     public Stamp uncheckedStamp() {
 237         return this.callTarget.returnStamp().getUncheckedStamp();
 238     }
 239 
 240     @Override
 241     public void setClassInit(ValueNode classInit) {
 242         this.classInit = classInit;
 243         updateUsages(null, classInit);
 244     }
 245 
 246     @Override
 247     public ValueNode classInit() {
 248         return classInit;
 249     }
 250 
 251     @Override
 252     public NodeCycles estimatedNodeCycles() {
 253         if (callTarget == null) {
 254             return CYCLES_UNKNOWN;
 255         }
 256         switch (callTarget.invokeKind()) {
 257             case Interface:
 258                 return CYCLES_64;
 259             case Special:
 260             case Static:
 261                 return CYCLES_2;
 262             case Virtual:
 263                 return CYCLES_8;
 264             default:
 265                 return CYCLES_UNKNOWN;
 266         }
 267     }
 268 
 269     @Override
 270     public NodeSize estimatedNodeSize() {
 271         if (callTarget == null) {
 272             return SIZE_UNKNOWN;
 273         }
 274         switch (callTarget.invokeKind()) {
 275             case Interface:
 276                 return SIZE_64;
 277             case Special:
 278             case Static:
 279                 return SIZE_2;
 280             case Virtual:
 281                 return SIZE_8;
 282             default:
 283                 return SIZE_UNKNOWN;
 284         }
 285     }
 286 }
< prev index next >