< prev index next >

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

Print this page
rev 52509 : [mq]: graal2


  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.graphbuilderconf;
  26 
  27 import static jdk.vm.ci.code.BytecodeFrame.AFTER_BCI;
  28 import static jdk.vm.ci.code.BytecodeFrame.AFTER_EXCEPTION_BCI;
  29 import static jdk.vm.ci.code.BytecodeFrame.BEFORE_BCI;
  30 import static jdk.vm.ci.code.BytecodeFrame.INVALID_FRAMESTATE_BCI;
  31 import static org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext.CompilationContext.INLINE_AFTER_PARSING;
  32 import static org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext.CompilationContext.ROOT_COMPILATION;
  33 
  34 import org.graalvm.compiler.api.replacements.MethodSubstitution;
  35 import org.graalvm.compiler.bytecode.BytecodeProvider;
  36 import org.graalvm.compiler.graph.NodeSourcePosition;
  37 import org.graalvm.compiler.nodes.AbstractMergeNode;
  38 import org.graalvm.compiler.nodes.FrameState;
  39 import org.graalvm.compiler.nodes.Invoke;

  40 import org.graalvm.compiler.nodes.StateSplit;
  41 import org.graalvm.compiler.nodes.StructuredGraph;
  42 import org.graalvm.compiler.nodes.java.ExceptionObjectNode;
  43 
  44 import jdk.vm.ci.meta.ResolvedJavaMethod;
  45 
  46 /**
  47  * An intrinsic is a substitute implementation of a Java method (or a bytecode in the case of
  48  * snippets) that is itself implemented in Java. This interface provides information about the
  49  * intrinsic currently being processed by the graph builder.
  50  *
  51  * When in the scope of an intrinsic, the graph builder does not check the value kinds flowing
  52  * through the JVM state since intrinsics can employ non-Java kinds to represent values such as raw
  53  * machine words and pointers.
  54  */
  55 public class IntrinsicContext {
  56 
  57     /**
  58      * Method being intrinsified.
  59      */


 199                 FrameState invalid = graph.add(new FrameState(INVALID_FRAMESTATE_BCI));
 200                 if (graph.trackNodeSourcePosition()) {
 201                     invalid.setNodeSourcePosition(sourcePosition);
 202                 }
 203                 for (StateSplit lastSideEffect : sideEffects.sideEffects()) {
 204                     lastSideEffect.setStateAfter(invalid);
 205                 }
 206             }
 207             sideEffects.addSideEffect(forStateSplit);
 208             FrameState frameState;
 209             if (forStateSplit instanceof ExceptionObjectNode) {
 210                 frameState = graph.add(new FrameState(AFTER_EXCEPTION_BCI, (ExceptionObjectNode) forStateSplit));
 211             } else {
 212                 frameState = graph.add(new FrameState(AFTER_BCI));
 213             }
 214             if (graph.trackNodeSourcePosition()) {
 215                 frameState.setNodeSourcePosition(sourcePosition);
 216             }
 217             return frameState;
 218         } else {
 219             if (forStateSplit instanceof AbstractMergeNode) {
 220                 // Merge nodes always need a frame state
 221                 if (sideEffects.isAfterSideEffect()) {
 222                     // A merge after one or more side effects
 223                     FrameState frameState = graph.add(new FrameState(AFTER_BCI));
 224                     if (graph.trackNodeSourcePosition()) {
 225                         frameState.setNodeSourcePosition(sourcePosition);
 226                     }
 227                     return frameState;
 228                 } else {
 229                     // A merge before any side effects
 230                     FrameState frameState = graph.add(new FrameState(BEFORE_BCI));
 231                     if (graph.trackNodeSourcePosition()) {
 232                         frameState.setNodeSourcePosition(sourcePosition);
 233                     }
 234                     return frameState;
 235                 }
 236             } else {
 237                 // Other non-side-effects do not need a state
 238                 return null;
 239             }


  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.graphbuilderconf;
  26 
  27 import static jdk.vm.ci.code.BytecodeFrame.AFTER_BCI;
  28 import static jdk.vm.ci.code.BytecodeFrame.AFTER_EXCEPTION_BCI;
  29 import static jdk.vm.ci.code.BytecodeFrame.BEFORE_BCI;
  30 import static jdk.vm.ci.code.BytecodeFrame.INVALID_FRAMESTATE_BCI;
  31 import static org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext.CompilationContext.INLINE_AFTER_PARSING;
  32 import static org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext.CompilationContext.ROOT_COMPILATION;
  33 
  34 import org.graalvm.compiler.api.replacements.MethodSubstitution;
  35 import org.graalvm.compiler.bytecode.BytecodeProvider;
  36 import org.graalvm.compiler.graph.NodeSourcePosition;
  37 import org.graalvm.compiler.nodes.AbstractMergeNode;
  38 import org.graalvm.compiler.nodes.FrameState;
  39 import org.graalvm.compiler.nodes.Invoke;
  40 import org.graalvm.compiler.nodes.LoopExitNode;
  41 import org.graalvm.compiler.nodes.StateSplit;
  42 import org.graalvm.compiler.nodes.StructuredGraph;
  43 import org.graalvm.compiler.nodes.java.ExceptionObjectNode;
  44 
  45 import jdk.vm.ci.meta.ResolvedJavaMethod;
  46 
  47 /**
  48  * An intrinsic is a substitute implementation of a Java method (or a bytecode in the case of
  49  * snippets) that is itself implemented in Java. This interface provides information about the
  50  * intrinsic currently being processed by the graph builder.
  51  *
  52  * When in the scope of an intrinsic, the graph builder does not check the value kinds flowing
  53  * through the JVM state since intrinsics can employ non-Java kinds to represent values such as raw
  54  * machine words and pointers.
  55  */
  56 public class IntrinsicContext {
  57 
  58     /**
  59      * Method being intrinsified.
  60      */


 200                 FrameState invalid = graph.add(new FrameState(INVALID_FRAMESTATE_BCI));
 201                 if (graph.trackNodeSourcePosition()) {
 202                     invalid.setNodeSourcePosition(sourcePosition);
 203                 }
 204                 for (StateSplit lastSideEffect : sideEffects.sideEffects()) {
 205                     lastSideEffect.setStateAfter(invalid);
 206                 }
 207             }
 208             sideEffects.addSideEffect(forStateSplit);
 209             FrameState frameState;
 210             if (forStateSplit instanceof ExceptionObjectNode) {
 211                 frameState = graph.add(new FrameState(AFTER_EXCEPTION_BCI, (ExceptionObjectNode) forStateSplit));
 212             } else {
 213                 frameState = graph.add(new FrameState(AFTER_BCI));
 214             }
 215             if (graph.trackNodeSourcePosition()) {
 216                 frameState.setNodeSourcePosition(sourcePosition);
 217             }
 218             return frameState;
 219         } else {
 220             if (forStateSplit instanceof AbstractMergeNode || forStateSplit instanceof LoopExitNode) {
 221                 // Merge nodes always need a frame state
 222                 if (sideEffects.isAfterSideEffect()) {
 223                     // A merge after one or more side effects
 224                     FrameState frameState = graph.add(new FrameState(AFTER_BCI));
 225                     if (graph.trackNodeSourcePosition()) {
 226                         frameState.setNodeSourcePosition(sourcePosition);
 227                     }
 228                     return frameState;
 229                 } else {
 230                     // A merge before any side effects
 231                     FrameState frameState = graph.add(new FrameState(BEFORE_BCI));
 232                     if (graph.trackNodeSourcePosition()) {
 233                         frameState.setNodeSourcePosition(sourcePosition);
 234                     }
 235                     return frameState;
 236                 }
 237             } else {
 238                 // Other non-side-effects do not need a state
 239                 return null;
 240             }
< prev index next >