26
27 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_UNKNOWN;
28 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_16;
29
30 import org.graalvm.compiler.graph.Node;
31 import org.graalvm.compiler.graph.NodeClass;
32 import org.graalvm.compiler.graph.spi.Canonicalizable;
33 import org.graalvm.compiler.graph.spi.CanonicalizerTool;
34 import org.graalvm.compiler.hotspot.HotSpotLIRGenerator;
35 import org.graalvm.compiler.hotspot.nodes.DeoptimizingStubCall;
36 import org.graalvm.compiler.hotspot.nodes.type.MethodCountersPointerStamp;
37 import org.graalvm.compiler.hotspot.word.KlassPointer;
38 import org.graalvm.compiler.hotspot.word.MethodCountersPointer;
39 import org.graalvm.compiler.hotspot.word.MethodPointer;
40 import org.graalvm.compiler.lir.LIRFrameState;
41 import org.graalvm.compiler.nodeinfo.NodeInfo;
42 import org.graalvm.compiler.nodes.ValueNode;
43 import org.graalvm.compiler.nodes.spi.LIRLowerable;
44 import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
45 import org.graalvm.compiler.nodes.util.GraphUtil;
46
47 import jdk.vm.ci.meta.Constant;
48 import jdk.vm.ci.meta.Value;
49
50 /**
51 * A call to the VM via a regular stub.
52 */
53 @NodeInfo(cycles = CYCLES_UNKNOWN, size = SIZE_16)
54 public class ResolveMethodAndLoadCountersStubCall extends DeoptimizingStubCall implements Canonicalizable, LIRLowerable {
55 public static final NodeClass<ResolveMethodAndLoadCountersStubCall> TYPE = NodeClass.create(ResolveMethodAndLoadCountersStubCall.class);
56
57 @OptionalInput protected ValueNode method;
58 @Input protected ValueNode klassHint;
59 @Input protected ValueNode methodDescription;
60 protected Constant methodConstant;
61
62 public ResolveMethodAndLoadCountersStubCall(ValueNode method, ValueNode klassHint, ValueNode methodDescription) {
63 super(TYPE, MethodCountersPointerStamp.methodCountersNonNull());
64 this.klassHint = klassHint;
65 this.method = method;
66 this.methodDescription = methodDescription;
67 }
68
69 @NodeIntrinsic
70 public static native MethodCountersPointer resolveMethodAndLoadCounters(MethodPointer method, KlassPointer klassHint, Object methodDescription);
71
72 @Override
73 public Node canonical(CanonicalizerTool tool) {
74 if (method != null) {
75 methodConstant = GraphUtil.foldIfConstantAndRemove(this, method);
76 }
77 return this;
78 }
79
80 @Override
81 public void generate(NodeLIRBuilderTool gen) {
82 assert methodConstant != null : "Expected method to fold: " + method;
83
84 Value methodDescriptionValue = gen.operand(methodDescription);
85 Value klassHintValue = gen.operand(klassHint);
86 LIRFrameState fs = gen.state(this);
87 assert fs != null : "The stateAfter is null";
88
89 Value result = ((HotSpotLIRGenerator) gen.getLIRGeneratorTool()).emitResolveMethodAndLoadCounters(methodConstant, klassHintValue, methodDescriptionValue, fs);
90
|
26
27 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_UNKNOWN;
28 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_16;
29
30 import org.graalvm.compiler.graph.Node;
31 import org.graalvm.compiler.graph.NodeClass;
32 import org.graalvm.compiler.graph.spi.Canonicalizable;
33 import org.graalvm.compiler.graph.spi.CanonicalizerTool;
34 import org.graalvm.compiler.hotspot.HotSpotLIRGenerator;
35 import org.graalvm.compiler.hotspot.nodes.DeoptimizingStubCall;
36 import org.graalvm.compiler.hotspot.nodes.type.MethodCountersPointerStamp;
37 import org.graalvm.compiler.hotspot.word.KlassPointer;
38 import org.graalvm.compiler.hotspot.word.MethodCountersPointer;
39 import org.graalvm.compiler.hotspot.word.MethodPointer;
40 import org.graalvm.compiler.lir.LIRFrameState;
41 import org.graalvm.compiler.nodeinfo.NodeInfo;
42 import org.graalvm.compiler.nodes.ValueNode;
43 import org.graalvm.compiler.nodes.spi.LIRLowerable;
44 import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
45 import org.graalvm.compiler.nodes.util.GraphUtil;
46 import org.graalvm.compiler.word.Word;
47
48 import jdk.vm.ci.meta.Constant;
49 import jdk.vm.ci.meta.Value;
50
51 /**
52 * A call to the VM via a regular stub.
53 */
54 @NodeInfo(cycles = CYCLES_UNKNOWN, size = SIZE_16)
55 public class ResolveMethodAndLoadCountersStubCall extends DeoptimizingStubCall implements Canonicalizable, LIRLowerable {
56 public static final NodeClass<ResolveMethodAndLoadCountersStubCall> TYPE = NodeClass.create(ResolveMethodAndLoadCountersStubCall.class);
57
58 @OptionalInput protected ValueNode method;
59 @Input protected ValueNode klassHint;
60 @Input protected ValueNode methodDescription;
61 protected Constant methodConstant;
62
63 public ResolveMethodAndLoadCountersStubCall(ValueNode method, ValueNode klassHint, ValueNode methodDescription) {
64 super(TYPE, MethodCountersPointerStamp.methodCountersNonNull());
65 this.klassHint = klassHint;
66 this.method = method;
67 this.methodDescription = methodDescription;
68 }
69
70 @NodeIntrinsic
71 public static native MethodCountersPointer resolveMethodAndLoadCounters(MethodPointer method, KlassPointer klassHint, Word methodDescription);
72
73 @Override
74 public Node canonical(CanonicalizerTool tool) {
75 if (method != null) {
76 methodConstant = GraphUtil.foldIfConstantAndRemove(this, method);
77 }
78 return this;
79 }
80
81 @Override
82 public void generate(NodeLIRBuilderTool gen) {
83 assert methodConstant != null : "Expected method to fold: " + method;
84
85 Value methodDescriptionValue = gen.operand(methodDescription);
86 Value klassHintValue = gen.operand(klassHint);
87 LIRFrameState fs = gen.state(this);
88 assert fs != null : "The stateAfter is null";
89
90 Value result = ((HotSpotLIRGenerator) gen.getLIRGeneratorTool()).emitResolveMethodAndLoadCounters(methodConstant, klassHintValue, methodDescriptionValue, fs);
91
|