blob: ca5ca8754c1d3796c6ba64b0c84f4d71894e5dae [file] [log] [blame]
/*
* Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package org.graalvm.compiler.nodes.java;
import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_30;
import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_30;
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.nodeinfo.NodeInfo;
import org.graalvm.compiler.nodes.BinaryOpLogicNode;
import org.graalvm.compiler.nodes.LogicConstantNode;
import org.graalvm.compiler.nodes.ValueNode;
import org.graalvm.compiler.nodes.spi.Lowerable;
import org.graalvm.compiler.nodes.spi.LoweringTool;
import jdk.vm.ci.meta.ConstantReflectionProvider;
import jdk.vm.ci.meta.ResolvedJavaType;
import jdk.vm.ci.meta.TriState;
/**
* The {@code ClassIsAssignableFromNode} represents a type check against {@link Class} instead of
* against instances. This is used, for instance, to intrinsify
* {@link Class#isAssignableFrom(Class)} .
*/
@NodeInfo(cycles = CYCLES_30, size = SIZE_30)
public final class ClassIsAssignableFromNode extends BinaryOpLogicNode implements Canonicalizable.Binary<ValueNode>, Lowerable {
public static final NodeClass<ClassIsAssignableFromNode> TYPE = NodeClass.create(ClassIsAssignableFromNode.class);
public ClassIsAssignableFromNode(ValueNode thisClass, ValueNode otherClass) {
super(TYPE, thisClass, otherClass);
}
public Object getThisClass() {
return getX();
}
public Object getOtherClass() {
return getY();
}
@Override
public Node canonical(CanonicalizerTool tool, ValueNode forX, ValueNode forY) {
if (forX.isConstant() && forY.isConstant()) {
ConstantReflectionProvider constantReflection = tool.getConstantReflection();
ResolvedJavaType thisType = constantReflection.asJavaType(forX.asJavaConstant());
ResolvedJavaType otherType = constantReflection.asJavaType(forY.asJavaConstant());
if (thisType != null && otherType != null) {
return LogicConstantNode.forBoolean(thisType.isAssignableFrom(otherType));
}
}
return this;
}
@Override
public void lower(LoweringTool tool) {
tool.getLowerer().lower(this, tool);
}
@Override
public Stamp getSucceedingStampForX(boolean negated) {
return null;
}
@Override
public Stamp getSucceedingStampForY(boolean negated) {
return null;
}
@Override
public TriState tryFold(Stamp xStamp, Stamp yStamp) {
return TriState.UNKNOWN;
}
}