Mercurial > hg > truffle
changeset 16222:7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Wed, 25 Jun 2014 16:55:01 +0200 |
parents | 8e82823712ba |
children | 1434b835f0d3 |
files | graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassCastNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastDynamicNode.java |
diffstat | 3 files changed, 48 insertions(+), 40 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassCastNode.java Wed Jun 25 16:55:01 2014 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassCastNode.java Wed Jun 25 16:55:01 2014 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2014, 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 @@ -22,7 +22,6 @@ */ package com.oracle.graal.hotspot.nodes; -import com.oracle.graal.graph.*; import com.oracle.graal.graph.spi.*; import com.oracle.graal.hotspot.meta.*; import com.oracle.graal.hotspot.replacements.*; @@ -32,10 +31,10 @@ /** * {@link MacroNode Macro node} for {@link Class#cast(Object)}. - * + * * @see ClassSubstitutions#cast(Class, Object) */ -public class ClassCastNode extends MacroNode implements Canonicalizable { +public class ClassCastNode extends MacroNode implements Canonicalizable.Binary<ValueNode> { public ClassCastNode(Invoke invoke) { super(invoke); @@ -49,16 +48,21 @@ return arguments.get(1); } + public ValueNode getX() { + return getJavaClass(); + } + + public ValueNode getY() { + return getObject(); + } + @Override - public Node canonical(CanonicalizerTool tool) { - ValueNode javaClass = getJavaClass(); - if (javaClass.isConstant()) { - ValueNode object = getObject(); - Class<?> c = (Class<?>) HotSpotObjectConstant.asObject(javaClass.asConstant()); + public ValueNode canonical(CanonicalizerTool tool, ValueNode forJavaClass, ValueNode forObject) { + if (forJavaClass.isConstant()) { + Class<?> c = (Class<?>) HotSpotObjectConstant.asObject(forJavaClass.asConstant()); if (c != null && !c.isPrimitive()) { HotSpotResolvedObjectType type = (HotSpotResolvedObjectType) HotSpotResolvedObjectType.fromClass(c); - CheckCastNode checkcast = graph().add(new CheckCastNode(type, object, null, false)); - return checkcast; + return new CheckCastNode(type, forObject, null, false); } } return this;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java Wed Jun 25 16:55:01 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java Wed Jun 25 16:55:01 2014 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2014, 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 @@ -25,7 +25,6 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.api.meta.ResolvedJavaType.Representation; import com.oracle.graal.compiler.common.type.*; -import com.oracle.graal.graph.*; import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; @@ -34,7 +33,7 @@ * Loads an object's {@linkplain Representation#ObjectHub hub}. The object is not null-checked by * this operation. */ -public final class LoadHubNode extends FloatingGuardedNode implements Lowerable, Canonicalizable, Virtualizable { +public final class LoadHubNode extends FloatingGuardedNode implements Lowerable, Canonicalizable.Unary<ValueNode>, Virtualizable { @Input private ValueNode value; @@ -63,10 +62,10 @@ } @Override - public Node canonical(CanonicalizerTool tool) { + public ValueNode canonical(CanonicalizerTool tool, ValueNode forObject) { MetaAccessProvider metaAccess = tool.getMetaAccess(); - if (metaAccess != null && value.stamp() instanceof ObjectStamp) { - ObjectStamp stamp = (ObjectStamp) value.stamp(); + if (metaAccess != null && forObject.stamp() instanceof ObjectStamp) { + ObjectStamp stamp = (ObjectStamp) forObject.stamp(); ResolvedJavaType exactType; if (stamp.isExactType()) { @@ -81,7 +80,7 @@ } if (exactType != null) { - return ConstantNode.forConstant(exactType.getEncoding(Representation.ObjectHub), metaAccess, graph()); + return ConstantNode.forConstant(exactType.getEncoding(Representation.ObjectHub), metaAccess); } } return this;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastDynamicNode.java Wed Jun 25 16:55:01 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastDynamicNode.java Wed Jun 25 16:55:01 2014 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2014, 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 @@ -23,7 +23,6 @@ package com.oracle.graal.nodes.java; import com.oracle.graal.api.meta.*; -import com.oracle.graal.graph.*; import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; @@ -33,7 +32,7 @@ * Implements a type check where the type being checked is loaded at runtime. This is used, for * instance, to implement an object array store check. */ -public final class CheckCastDynamicNode extends FixedWithNextNode implements Canonicalizable, Lowerable { +public final class CheckCastDynamicNode extends FixedWithNextNode implements Canonicalizable.Binary<ValueNode>, Lowerable { @Input private ValueNode object; @Input private ValueNode hub; @@ -55,6 +54,25 @@ this.forStoreCheck = forStoreCheck; } + public ValueNode object() { + return object; + } + + /** + * Gets the runtime-loaded type being cast to. + */ + public ValueNode hub() { + return hub; + } + + public ValueNode getX() { + return object; + } + + public ValueNode getY() { + return hub; + } + public boolean isForStoreCheck() { return forStoreCheck; } @@ -70,32 +88,19 @@ } @Override - public Node canonical(CanonicalizerTool tool) { - assert object() != null : this; - - if (StampTool.isObjectAlwaysNull(object())) { - return object(); + public ValueNode canonical(CanonicalizerTool tool, ValueNode forObject, ValueNode forHub) { + if (StampTool.isObjectAlwaysNull(forObject)) { + return forObject; } - if (hub.isConstant()) { - ResolvedJavaType t = tool.getConstantReflection().asJavaType(hub.asConstant()); + if (forHub.isConstant()) { + ResolvedJavaType t = tool.getConstantReflection().asJavaType(forHub.asConstant()); if (t != null) { - return graph().add(new CheckCastNode(t, object(), null, forStoreCheck)); + return graph().add(new CheckCastNode(t, forObject, null, forStoreCheck)); } } return this; } - public ValueNode object() { - return object; - } - - /** - * Gets the runtime-loaded type being cast to. - */ - public ValueNode hub() { - return hub; - } - @NodeIntrinsic public static native <T> T checkCastDynamic(Class<T> type, Object object, @ConstantNodeParameter boolean forStoreCheck); }