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 }
|