package org.graalvm.compiler.hotspot.word;
import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_0;
import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_0;
import org.graalvm.compiler.core.common.type.Stamp;
import org.graalvm.compiler.graph.Node;
import org.graalvm.compiler.graph.NodeClass;
import org.graalvm.compiler.graph.spi.Canonicalizable;
import org.graalvm.compiler.graph.spi.CanonicalizerTool;
import org.graalvm.compiler.hotspot.word.HotSpotOperation.HotspotOpcode;
import org.graalvm.compiler.nodeinfo.NodeInfo;
import org.graalvm.compiler.nodes.NodeView;
import org.graalvm.compiler.nodes.ValueNode;
import org.graalvm.compiler.nodes.calc.FloatingNode;
import org.graalvm.compiler.nodes.spi.LIRLowerable;
import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
import jdk.vm.ci.meta.Value;
@NodeInfo(cycles = CYCLES_0, size = SIZE_0)
public final class PointerCastNode extends FloatingNode implements Canonicalizable, LIRLowerable, Node.ValueNumberable {
public static final NodeClass<PointerCastNode> TYPE = NodeClass.create(PointerCastNode.class);
@Input ValueNode input;
protected PointerCastNode(Stamp stamp, ValueNode input) {
super(TYPE, stamp);
this.input = input;
}
public static ValueNode create(Stamp stamp, ValueNode input) {
ValueNode canonicalNode = canonicalize(stamp, input);
if (canonicalNode != null) {
return canonicalNode;
}
return new PointerCastNode(stamp, input);
}
public ValueNode getInput() {
return input;
}
@Override
public void generate(NodeLIRBuilderTool generator) {
Value value = generator.operand(input);
assert value.getValueKind().equals(generator.getLIRGeneratorTool().getLIRKind(stamp(NodeView.DEFAULT))) : "PointerCastNode shouldn't change the LIRKind";
generator.setResult(this, value);
}
@Override
public Node canonical(CanonicalizerTool tool) {
ValueNode canonicalNode = canonicalize(this.stamp, this.input);
if (canonicalNode != null) {
return canonicalNode;
}
return this;
}
private static ValueNode canonicalize(Stamp stamp, ValueNode input) {
if (input instanceof PointerCastNode) {
PointerCastNode pointerCast = (PointerCastNode) input;
if (pointerCast.input.stamp(NodeView.DEFAULT).equals(stamp)) {
return pointerCast.input;
}
}
return null;
}
}