26
27 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_4;
28 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_1;
29
30 import org.graalvm.compiler.core.common.PermanentBailoutException;
31 import org.graalvm.compiler.graph.Node;
32 import org.graalvm.compiler.graph.NodeClass;
33 import org.graalvm.compiler.graph.spi.Canonicalizable;
34 import org.graalvm.compiler.graph.spi.CanonicalizerTool;
35 import org.graalvm.compiler.hotspot.HotSpotLIRGenerator;
36 import org.graalvm.compiler.hotspot.meta.HotSpotConstantLoadAction;
37 import org.graalvm.compiler.hotspot.word.KlassPointer;
38 import org.graalvm.compiler.nodeinfo.NodeInfo;
39 import org.graalvm.compiler.nodes.NodeView;
40 import org.graalvm.compiler.nodes.ValueNode;
41 import org.graalvm.compiler.nodes.calc.FloatingNode;
42 import org.graalvm.compiler.nodes.spi.LIRLowerable;
43 import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
44 import org.graalvm.compiler.nodes.util.GraphUtil;
45
46 import jdk.vm.ci.hotspot.HotSpotConstantPoolObject;
47 import jdk.vm.ci.hotspot.HotSpotMetaspaceConstant;
48 import jdk.vm.ci.hotspot.HotSpotObjectConstant;
49 import jdk.vm.ci.meta.Constant;
50 import jdk.vm.ci.meta.Value;
51
52 @NodeInfo(cycles = CYCLES_4, size = SIZE_1)
53 public class LoadConstantIndirectlyNode extends FloatingNode implements Canonicalizable, LIRLowerable {
54
55 public static final NodeClass<LoadConstantIndirectlyNode> TYPE = NodeClass.create(LoadConstantIndirectlyNode.class);
56
57 @OptionalInput protected ValueNode value;
58 protected Constant constant;
59 protected HotSpotConstantLoadAction action;
60
61 public LoadConstantIndirectlyNode(ValueNode value) {
62 super(TYPE, value.stamp(NodeView.DEFAULT));
63 this.value = value;
64 this.constant = null;
65 this.action = HotSpotConstantLoadAction.RESOLVE;
66 }
67
68 public LoadConstantIndirectlyNode(ValueNode value, HotSpotConstantLoadAction action) {
69 super(TYPE, value.stamp(NodeView.DEFAULT));
70 this.value = value;
71 this.constant = null;
72 this.action = action;
73 }
74
75 @Override
76 public Node canonical(CanonicalizerTool tool) {
77 if (value != null) {
78 constant = GraphUtil.foldIfConstantAndRemove(this, value);
79 }
80 return this;
81 }
82
83 @Override
84 public void generate(NodeLIRBuilderTool gen) {
85 assert constant != null : "Expected the value to fold: " + value;
86 Value result;
87 if (constant instanceof HotSpotObjectConstant || constant instanceof HotSpotConstantPoolObject) {
88 result = ((HotSpotLIRGenerator) gen.getLIRGeneratorTool()).emitLoadObjectAddress(constant);
89 } else if (constant instanceof HotSpotMetaspaceConstant) {
90 result = ((HotSpotLIRGenerator) gen.getLIRGeneratorTool()).emitLoadMetaspaceAddress(constant, action);
91 } else {
92 throw new PermanentBailoutException("Unsupported constant type: " + constant);
93 }
94 gen.setResult(this, result);
95 }
96
97 @NodeIntrinsic
98 public static native KlassPointer loadKlass(KlassPointer klassPointer, @ConstantNodeParameter HotSpotConstantLoadAction action);
99
100 @NodeIntrinsic
101 public static native KlassPointer loadKlass(KlassPointer klassPointer);
102
103 @NodeIntrinsic
104 public static native Object loadObject(Object object);
105
106 }
|
26
27 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_4;
28 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_1;
29
30 import org.graalvm.compiler.core.common.PermanentBailoutException;
31 import org.graalvm.compiler.graph.Node;
32 import org.graalvm.compiler.graph.NodeClass;
33 import org.graalvm.compiler.graph.spi.Canonicalizable;
34 import org.graalvm.compiler.graph.spi.CanonicalizerTool;
35 import org.graalvm.compiler.hotspot.HotSpotLIRGenerator;
36 import org.graalvm.compiler.hotspot.meta.HotSpotConstantLoadAction;
37 import org.graalvm.compiler.hotspot.word.KlassPointer;
38 import org.graalvm.compiler.nodeinfo.NodeInfo;
39 import org.graalvm.compiler.nodes.NodeView;
40 import org.graalvm.compiler.nodes.ValueNode;
41 import org.graalvm.compiler.nodes.calc.FloatingNode;
42 import org.graalvm.compiler.nodes.spi.LIRLowerable;
43 import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
44 import org.graalvm.compiler.nodes.util.GraphUtil;
45
46 import jdk.vm.ci.hotspot.HotSpotMetaspaceConstant;
47 import jdk.vm.ci.hotspot.HotSpotObjectConstant;
48 import jdk.vm.ci.meta.Constant;
49 import jdk.vm.ci.meta.Value;
50
51 @NodeInfo(cycles = CYCLES_4, size = SIZE_1)
52 public class LoadConstantIndirectlyNode extends FloatingNode implements Canonicalizable, LIRLowerable {
53
54 public static final NodeClass<LoadConstantIndirectlyNode> TYPE = NodeClass.create(LoadConstantIndirectlyNode.class);
55
56 @OptionalInput protected ValueNode value;
57 protected Constant constant;
58 protected HotSpotConstantLoadAction action;
59
60 public LoadConstantIndirectlyNode(ValueNode value) {
61 super(TYPE, value.stamp(NodeView.DEFAULT));
62 this.value = value;
63 this.constant = null;
64 this.action = HotSpotConstantLoadAction.RESOLVE;
65 }
66
67 public LoadConstantIndirectlyNode(ValueNode value, HotSpotConstantLoadAction action) {
68 super(TYPE, value.stamp(NodeView.DEFAULT));
69 this.value = value;
70 this.constant = null;
71 this.action = action;
72 }
73
74 @Override
75 public Node canonical(CanonicalizerTool tool) {
76 if (value != null) {
77 constant = GraphUtil.foldIfConstantAndRemove(this, value);
78 }
79 return this;
80 }
81
82 @Override
83 public void generate(NodeLIRBuilderTool gen) {
84 assert constant != null : "Expected the value to fold: " + value;
85 Value result;
86 if (constant instanceof HotSpotObjectConstant) {
87 result = ((HotSpotLIRGenerator) gen.getLIRGeneratorTool()).emitLoadObjectAddress(constant);
88 } else if (constant instanceof HotSpotMetaspaceConstant) {
89 result = ((HotSpotLIRGenerator) gen.getLIRGeneratorTool()).emitLoadMetaspaceAddress(constant, action);
90 } else {
91 throw new PermanentBailoutException("Unsupported constant type: " + constant);
92 }
93 gen.setResult(this, result);
94 }
95
96 @NodeIntrinsic
97 public static native KlassPointer loadKlass(KlassPointer klassPointer, @ConstantNodeParameter HotSpotConstantLoadAction action);
98
99 @NodeIntrinsic
100 public static native KlassPointer loadKlass(KlassPointer klassPointer);
101
102 @NodeIntrinsic
103 public static native Object loadObject(Object object);
104
105 }
|